PyCaret 2.2 : チュートリアル : 分類 – 多クラス分類 (初級) (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/17/2020 (2.2.2)
* 本ページは、PyCaret 2.2 ドキュメントの以下のページを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ |
Facebook: https://www.facebook.com/ClassCatJP/ |
チュートリアル : 分類 – 多クラス分類 (初級)
1.0 チュートリアルの目的
このチュートリアルは貴方が PyCaret の経験は初めてで pycaret.classification モジュールを使用して多クラス分類から始めることに関心があることを仮定しています。
このチュートリアルで以下を学習します :
- データを得る : PyCaret レポジトリからどのようにデータをインポートするか
- 環境をセットアップする : PyCaret でどのように実験をセットアップして多クラス (分類) モデルの構築を始めるか。
- モデルを作成する : モデルをどのように作成するか、階層化された交差検証を遂行するか、そして分類メトリクスを評価するか
- モデルを調整する : 多クラス (分類) モデルのハイパーパラメータをどのように調整するか
- モデルをプロットする : 様々なプロットを使用してモデル性能をどのように分析するか
- モデルを完成させる (= finalize) : 実験の最後に最善のモデルをどのように完成させるか
- モデルを予測する : 新しい / 未見のデータ上でどのように予測を行なうか
- モデルをセーブ / ロードする : 将来的な利用のためにモデルをどのようにセーブ / ロードするか
2.0 多クラス分類とは何か?
多クラス分類は教師あり機械学習テクニックで、そこでは目標はインスタンスを 3 つやそれ以上の一つに分類することです。(インスタンスを 2 クラスの一つに分類することは二値分類と呼ばれます。)多クラス分類はマルチラベル分類と混同されるべきではありません、そこでは各インスタンスのために複数のラベルが予測されます。
3.0 PyCaret の分類モジュールの概要
PyCaret の分類モジュール (pycaret.classification) は教師あり機械学習モジュールで、これは様々なテクニックとアルゴリズムに基づいて要素を二値か多項グループに分類するために利用されます。
PyCaret 分類モジュールは二値か多クラス分類問題のために利用できます。それは 18 以上のアルゴリズムとモデルのパフォーマンスを分析するために 14 プロットを持ちます。それがハイパーパラメータ調整、アンサンブル、あるいはスタッキングのような進んだテクニックであろうと、PyCaret の分類モジュールはそれを総て持ちます。
4.0 チュートリアルのためのデータセット
このチュートリアルのために UCI からのアイリス・データセットを使用します。これは多分パターン認識文献で見つかる最善に知られたデータベースです。データセットは各々 50 インスタンスの 3 クラスを含み、そこでは各クラスはアイリス花のタイプを参照します。各カラムの短い説明は以下です :
- sepal_length: Length of がく片 (= Sepal) の長さ
- sepal_width: がく片の幅
- petal_length: 花弁 (= Petal) の長さ
- petal_width: 花弁の幅
- species: 3 クラス (Setosa, Versicolour, Virginica) の一つ、ターゲットカラム
データセットの謝辞:
Creator: R.A. Fisher, Donor : Michael Marshall (MARSHALL%PLU ‘@’ io.arc.nasa.gov)
元のデータセットとデータ辞書は ここで見つけられます。
5.0 データを得る
データを ここで見つかる 元のソースからダウンロードして pandas を使用してそれをロードすることができますし、あるいは get_data() 関数を使用してデータをロードするために PyCaret のデータレポジトリを利用できます。
from pycaret.datasets import get_data dataset = get_data('iris')
#check the shape of data dataset.shape
(150, 5)
未見データ上で predict_model() 関数を実演するため、予測のために使用される元のデータセットから 15 レコードのサンプルが抑えられました。これは訓練/テスト分割と混同されるべきではありません、この特定の分割は現実生活のシナリオをシミュレートするために遂行されます。これについて考えるもう一つの方法はこれらの 15 レコードは機械学習実験が遂行される時点では利用可能ではないことです。
data = dataset.sample(frac=0.9, random_state=786) data_unseen = dataset.drop(data.index) data.reset_index(drop=True, inplace=True) data_unseen.reset_index(drop=True, inplace=True) print('Data for Modeling: ' + str(data.shape)) print('Unseen Data For Predictions: ' + str(data_unseen.shape))
Data for Modeling: (135, 5) Unseen Data For Predictions: (15, 5)
6.0 PyCaret で環境をセットアップする
setup() 関数は pycaret の環境を初期化してモデリングと配備のためにデータを準備する変換パイプラインを作成します。setup() は pycaret の任意の他の関数を実行する前に呼び出されなければなりません。それは 2 つの必須パラメータを取ります : pandas データフレームとターゲットカラム名です。総ての他のパラメータはオプションで前処理パイプラインをカスタマイズするために使用されます (後のチュートリアルでそれらを見ます)。
setup() が実行されるとき、PyCaret の推論アルゴリズムは特定のプロパティに基づいて総ての特徴のためにデータ型を自動的に推論します。データ型は正しく推論されるべきですが、これは常には当てはまりません。これを説明するため、setup() が実行された後 PyCaret は特徴とそれらの推論された型を含むテーブルを表示します。データ型の総てが正しく識別されれば続けるためにエンターを押すことができて、あるいは実験を終了するために quit がタイプできます。データ型が正しいことを確実にすることは PyCaret で基礎的な重要なことです、何故ならばそれは自動的に 2,3 の前処理タスクを遂行するからです、これは任意の機械学習実験に必須です。これらのタスクは各データ型のために様々に遂行されて、これはそれらが正しく configure されることが非常に重要であることを意味します。
後のチュートリアルで PyCaret の推論データ型を setup() の numeric_features と categorical_features パラメータを使用してどのように上書きするかを学習します。
from pycaret.classification import * exp_mclf101 = setup(data = data, target = 'species', session_id=123)
ひとたびセットアップが成功的に実行されればそれは情報の幾つかの重要なピースを含む情報グリッドをプリントします。情報の殆どは setup() が実行されるときに構築される前処理パイプラインに関係します。これらの特徴の大部分はこのチュートリアルの目的の範囲外ですがこの段階で注意すべき幾つかの重要なことは以下を含みます :
- session_id : 後の再現性のために総ての関数のシードとして分配される擬似乱数。session_id が渡されない場合、総ての関数に分配される乱数が自動的に生成されます。この実験では、後の再現性のために session_id は 123 として設定されます。
- Target Type : Binary (二値) or Multiclass (多クラス)。 Target type は自動的に検知されて表示されます。二値あるいは多クラス問題のために実験がどのように遂行されるかで違いはありません。総ての機能は同一です。
- Label Encoded : Target 変数が 1 or 0 の代わりに type 文字列 (i.e. ‘Yes’ or ‘No’) であるとき、それは自動的にラベルを 1 と 0 にエンコードして参照のためにマッピング (0 : No, 1 : Yes) を表示します。この実験ではラベルエンコーディングは次のように適用されます : Iris-setosa: 0, Iris-versicolor: 1, Iris-virginica: 2.
- Original Data : データセットの元の shape を表示します。この実験では (135, 5) は 135 サンプルとターゲットカラムを含む 5 特徴を意味しています。
- Missing Values : 元のデータに欠損値があるときこれは True として示されます。この実験についてはデータセットに欠損値はありません。
- Numeric Features : numeric として推論される特徴の数。このデータセットでは 5 特徴から 4 が numeric として推論されます。
- Categorical Features : categorical として推論される特徴の数。このデータセットには cartegorical 特徴はありません。
- Transformed Train Set : 変換された訓練セットの shape を表示します。(135, 5) の元の shape は変換された訓練セットのための (94, 4) に変換されることに注意してください。
- Transformed Test Set : 変換されたテスト/hold-out セットの shape を表示します。テスト/hold-out セットに 41 サンプルがあります。この分割は 70/30 のデフォルト値に基づいていて、これはセットアップの train_size パラメータを使用して変更可能です。
欠損値補完 (= imputation)、categorical エンコーディング等のような、モデリングを遂行するために必須の 2, 3 のタスクがどのように自動的に処理されるかに気付いてください。setup() の殆どのパラメータはオプションで前処理パイプラインをカスタマイズするために使用されます。これらのパラメータはこのチュートリアルのためには範囲外ですが、中間あるいは専門家レベルに進むときそれらを遥かに詳細にカバーします。
7.0 総てのモデルを比較する
セットアップがひとたび完了すればパフォーマンスを評価するために総てのモデルを比較することはモデリングのために推奨される開始点です (どのような種類のモデルを貴方が必要とするかを正確に知らない限りは、それはしばしば当てはまらないでしょう)。この関数はモデルライブラリの総てのモデルを訓練してメトリック評価のための階層化された交差検証を使用してそれらにスコアをつけます。出力は訓練時間とともに folds (デフォルトで 10) に渡る平均 Accuracy, Recall, Precision, F1, Kappa と MCC を示すスコアグリッドをプリントします。
best = compare_models()
コードの 2 つの単純な単語 (行でさえありません) は交差検証を使用して 15 モデルに渡り訓練して評価します。上でプリントされるスコアグリッドは比較目的だけのために最も高い性能のメトリックをハイライトします。デフォルトではグリッドは ‘Accuracy’ (最高から最低へ) を使用してソートされます、これは sort パラメータを渡すことにより変更可能です。例えば compare_models(sort = ‘Recall’) は Accuracy の代わりに Recall によりグリッドをソートします。fold パラメータを 10 のデフォルト値から異なる値に変更することを望む場合には fold パラメータを利用できます。例えば compare_models(fold = 5) は総てのモデルを 5 fold 交差検証上で比較します。fold の数を減じれば訓練時間を改良します。デフォルトでは、compare_models はデフォルトのソート順序に基づいて最善の性能のモデルを返しますが、n_select パラメータを使用して top N モデルのリストを返すために利用できます。
Note: AUC メトリックは多クラス分類のためには利用可能ではありませんけれども、二値分類と多クラス分類表示グリッド間の一貫性を維持するためにカラムは依然としてゼロ値で示されます。
8.0 モデルを作成する
create_model は PyCaret の最も極め細かい (= granular) 関数で殆どの PyCaret 機能の背後でしばしば基礎となります。名前が示すようにこの関数は fold パラメータで設定できる交差検証を使用してモデルを訓練して評価します。出力は fold による Accuracy, Recall, Precision, F1, Kappa と MCC を示すスコアグリッドをプリントします。
このチュートリアルの残りのパートについては、候補モデルとして下のモデルで作業します。この選択は例示目的のためのみでそれらがこのタイプのデータに対してトップの性能であるとか理想的であることを必ずしも意味しません。
- 決定木分類器 (‘dt’)
- K 近傍法分類器 (‘knn’)
- ロジスティック回帰 (‘lr’)
PyCaret のモデルライブラリには利用可能な 18 の分類器があります。総ての分類器のリストのためには create_model() docstring を見てください。
8.1 決定木分類器
dt = create_model('dt')
#trained model object is stored in the variable 'dt'. print(dt)
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=123, splitter='best')
8.2 K 近傍法分類器
knn = create_model('knn')
8.3 ロジスティック回帰
lr = create_model('lr')
総てのモデルの平均スコアは compare_models() でプリントされたスコアに一致することに注意してください。これは compare_models() スコアグリッドでプリントされたメトリクスは総ての CV fold に渡る平均スコアであるためです。compare_models() と同様に、fold パラメータを 10 のデフォルト値から異なる値に変更することを望む場合、fold パラメータを使用できます。例えば : create_model(‘dt’, fold = 5) は 5 fold stratified CV を使用して決定木分類器を作成できます。
9.0 モデルを調整する
モデルが create_model() 関数を使用して作成されるときそれはモデルを訓練するためにデフォルトのハイパーパラメータを使用します。ハイパーパラメータを調整するためには、tune_model() 関数が利用されます。この関数は事前定義された探索空間上でランダム・グリッドサーチを使用してモデルのハイパーパラメータを自動的に調整します。出力はスコアグリッドをプリントし、これは最善なモデルのための fold による Accuracy, AUC, Recall, Precision, F1, Kappa と MCC を示します。カスタム・サーチグリッドを使用するために、tune_model 関数で custom_grid パラメータを渡すことができます (下の 9.2 KNN tuning 参照)。
9.1 決定木分類器
tuned_dt = tune_model(dt)
#tuned model object is stored in the variable 'tuned_dt'. print(tuned_dt)
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='entropy', max_depth=5, max_features='sqrt', max_leaf_nodes=None, min_impurity_decrease=0.2, min_impurity_split=None, min_samples_leaf=5, min_samples_split=5, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=123, splitter='best')
9.2 K 近傍法分類器
import numpy as np tuned_knn = tune_model(knn, custom_grid = {'n_neighbors' : np.arange(0,50,1)})
9.3 ロジスティック回帰
tuned_lr = tune_model(lr)
tune_model() 関数は事前定義された探索空間に渡りハイパーパラメータのランダム・グリッドサーチです。デフォルトでは、それは Accuracy を最適化するように設定されていますがこれは optimize パラメータを使用して変更できます。例えば : tune_model(dt, optimize = ‘Recall’) は決定木分類器のハイパーパラメータを探索します、これは最高の Recall という結果になります。このサンプルの目的のため、単純化の目的のためだけにデフォルトのメトリック Accracy を使用しました。分類器を評価するために妥当なメトリックを選択する背後の方法論はこのチュートリアルの範囲を越えますが、それについて更に学習したい場合には、妥当な評価メトリックをどのように選択するかについての記事を読むために ここをクリック できます。
プロダクションのための最善なモデルを finalize するときメトリクスだけが考慮すべき基準ではありません。考慮すべき他の因子は訓練時間、kfolds の標準偏差 etc. を含みます。チュートリアルのシリーズを通して進むにつれ、中間と専門家レベルでそれらの因子を詳細に議論します。当面は、このチュートリアルの残りのための最善なモデルとして、調整された K 近傍法分類器を考えて進みます。
10.0 モデルをプロットする
モデルを finalize する前に、 AUC, confusion_matrix (混同行列), 決定境界等のような異なる様相に渡りパフォーマンスを分析するために plot_model() 関数が利用できます。この関数は訓練されたモデルオブジェクトを取りテスト / hold-out セットに基づいてプロットを返します。
利用可能な 15 の異なるプロットがあります、利用可能なプロットのリストのためには plot_model() docstring を見てください。
10.1 混同行列
plot_model(tuned_knn, plot = 'confusion_matrix')
10.2 分類レポート
plot_model(tuned_knn, plot = 'class_report')
10.3 決定境界プロット
plot_model(tuned_knn, plot='boundary')
10.4 予測エラープロット
plot_model(tuned_knn, plot = 'error')
モデルのパフォーマンスを分析するもう一つの方法は evaluate_model() 関数を使用することです、これは与えられたモデルのために利用可能なプロットの総てのためのユーザインターフェイスを表示します。それは内部的には plot_model() 関数を使用しています。
evaluate_model(tuned_knn)
11.0 テスト / hold-out サンプル上で予測する
モデルを finalize する前に、テスト/hold-out セットを予測して評価メトリクスをレビューすることにより一つの最終確認を遂行することが賢明です。上のセクション 6 の情報グリッドを見れば、データの 30% (41 サンプル) がテスト/hold-out サンプルとして分割されたことを見るでしょう。上で見た評価メトリクスの総ては訓練セット (70%) だけに基づいて交差検証された結果です。今は、tuned_knn 変数にストアされた最終的な訓練モデルを使用して hold-out サンプルに対して予測してそれらが CV 結果と実質的に異なるかを見るためにメトリクスを評価します。
predict_model(tuned_knn);
テスト/hold-out セット上の精度は tuned_knn CV 結果 (上のセクション 9.2) 上で達成された 0.9356 に比較して 0.9512 です。これは本質的な差異ではありません。もしテスト/hold-out と CV 結果の間で大きな変動があれば、これは通常は over-fitting を示しますが幾つかの他の要因に依る可能性もあり更なる調査を必要とするでしょう。このケースでは、モデルを finalize して未見データ (最初に分離された 10% で PyCaret に決して公開していません) を予測することに進みます。
(TIP : create_model() を使用するとき CV 結果の標準偏差を見ることは常に良いです。)
配備のためにモデルを finalize する
モデル finalization は実験の最後のステップです。PyCaret の通常の機械学習ワークフローは setup() で始まり、続いて compare_models() を使用して総てのモデルを比較してそしてハイパーパラメータ調整、アンサンブリング、スタッキング等のような幾つかのモデリングテクニックを遂行するために 2, 3 の候補モデルをショートリストします (関心のあるメトリックに基づいて)。このワークフローは新しい未見のデータ上で予測する点で使用するに最善のモデルに最終的に導きます。finalize_model() 関数はモデルをテスト/hold-out サンプル (この場合 30%) を含む完全なデータセットに fit します。この関数の目的はそれがプロダクションで配備される前に完全なデータセット上でモデルを訓練することです。
final_knn = finalize_model(tuned_knn)
#Final K Nearest Neighbour parameters for deployment print(final_knn)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=-1, n_neighbors=33, p=2, weights='uniform')
13.0 未見のデータ上で予測する
predict_model() 関数はまた未見のデータセット上で予測するために使用されます。上のセクション 11 との唯一の違いは今回は data_unseen パラメータを渡すことです。data_unseen はチュートリアルの最初で作成される変数で元のデータセットの 10% (15 サンプル) を含みます、これは PyCaret に決して公開されていません。(説明のためにはセクション 5 参照)
unseen_predictions = predict_model(final_knn, data=data_unseen) unseen_predictions.head()
Label と Score カラムが data_unseen セットに追加されます。Label は予測で score は予測の確率です。予測された結果は元のデータセットに連結される一方で総ての変換はバックグラウンドで自動的に遂行されることに注意してください。
14.0 モデルをセーブする
今では final_knn 変数にストアされた tuned_knn モデルを finalize することにより実験を終了しました。data_unseen を予測するために final_knn にストアされたモデルも使用しました。これは私達に実験の終わりをもたらしますが、依然として一つの質問が問われるべきです : 予測するためのより多くの新しいデータを持つとき何が起きるでしょう?実験全体を再度通り抜けなければなりませんか?答えはノーです、PyCaret の組込み関数 save_model() は後で使用するために変換パイプライン全体と一緒にモデルをセーブすることを可能にします。
save_model(final_knn,'Final KNN Model 08Feb2020')
Transformation Pipeline and Model Succesfully Saved (Pipeline(memory=None, steps=[('dtypes', DataTypes_Auto_infer(categorical_features=[], display_types=True, features_todrop=[], id_columns=[], ml_usecase='classification', numerical_features=[], target='species', time_features=[])), ('imputer', Simple_Imputer(categorical_strategy='not_available', fill_value_categorical=None, fill_value_numerical=None, numeric_stra... ('fix_perfect', Remove_100(target='species')), ('clean_names', Clean_Colum_Names()), ('feature_select', 'passthrough'), ('fix_multi', 'passthrough'), ('dfs', 'passthrough'), ('pca', 'passthrough'), ['trained_model', KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=-1, n_neighbors=33, p=2, weights='uniform')]], verbose=False), 'Final KNN Model 08Feb2020.pkl')
(TIP : It’s always good to use date in the filename when saving models, it’s good for version control.)
15.0 セーブされたモデルをロードします
同じまたは代替の環境で将来的にセーブされたモデルをロードするために、PyCaret の load_model() 関数を使用してから予測のために新しい未見のデータ上でセーブされたモデルを容易に適用します。
saved_final_knn = load_model('Final KNN Model 08Feb2020')
Transformation Pipeline and Model Successfully Loaded
ひとたびモデルが環境にロードされれば、同じ predict_model() 関数を使用して任意の新しいデータ上で予測するためにそれを単純に利用できます。下では上のセクション 13 で使用した同じ data_unseen を予測するために下でロードされたモデルを適用しました。
new_prediction = predict_model(saved_final_knn, data=data_unseen)
new_prediction.head()
unseen_predictions と new_prediction の結果が同一であることに注意してください。
以上