AutoML⑬(PyCaretでクラスタリング)

エルボー図

前回構築したクラスタリングモデルのエルボー図を表示します。

[Google Colaboratory]

1
plot_model(kmeans, plot = "elbow")

[実行結果]

急激に変化している箇所を最適なクラスタ数と判断することができます。

シルエット図

次にシルエット図を表示します。

[Google Colaboratory]

1
plot_model(kmeans, plot = "silhouette")

[実行結果]

各バーの縦幅が同じくらいになっていれば均等に分割できていると判断することができます。

クラスタリング

predict_model関数に、構築したモデルとデータを渡すとクラスタリング(グループ化)を行うことができます。

[Google Colaboratory]

1
2
ret = predict_model(kmeans, data=df_iris)
ret

[実行結果]

クラスタ番号がClusterとして追加されています。

このようにクラスタリングに関しても、複数アルゴリズムでのモデル構築や、エルボー図やシルエット図での評価まで簡単に行うことができました。

AutoML

AutoMLを使って、非常に短いコードでモデルの構築や評価を行うことができました。

AIモデル構築の分野はますます便利になっていき、より簡単にモデル構築ができるようになってきています。

AutoML⑫(PyCaretでクラスタリング)

PyCaretを使って、教師なし学習(クラスタリング)を行っていきます。

データの読み込みと前処理

まずアイリスデータを読み込みます。

[Google Colaboratory]

1
2
3
4
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df_iris = pd.DataFrame(iris.data, columns = iris.feature_names)

次にsetup関数を使って前処理を行います。

[Google Colaboratory]

1
2
3
4
5
from pycaret.clustering import *
data_clust = setup(data = df_iris,
normalize = False,
session_id = 0,
silent=True)

silentオプションにTrueを設定し、型推定の確認をスキップしています。(5行目)

[実行結果]

クラスタリング一覧

PyCaretが提供しているクラスタリング一覧を確認してみます。

[Google Colaboratory]

1
models()

[実行結果]

クラスタリングに関するいろいろなアルゴリズムが提供されていることが分かります。

クラスタリングモデルの作成

create_model関数に“kmeans”を指定し、クラスタリングモデルを作成します。

[Google Colaboratory]

1
2
kmeans = create_model("kmeans", num_clusters=3)
print(kmeans)

[実行結果]

SilhouetteCalinski-Harabaszなどの評価指数が表示されました。

Cluster PCA Plot

クラスタリング結果を可視化します。

[Google Colaboratory]

1
plot_model(kmeans)

[実行結果]

PCAが可視化され、きれいに分類されていることが確認できます。

PCAとは主成分分析のことで、特徴量を抽出することによって、次元削除や可視化をすることが可能になります。

AutoML⑪(PyCaretで分類モデル評価)

PyCaretでいろいろな評価指標グラフを表示していきます。

evaluate_modelダイアログ

evaluate_modelを実行すると、様々な評価指標を確認することができます。

[Google Colaboratory]

1
evaluate_model(tuned_ridge)

[実行結果]

Feature Importance

plot_model“feature”を渡すと、Feature Importanceのグラフを表示することができます。

[Google Colaboratory]

1
plot_model(tuned_ridge, "feature")

[実行結果]

worst concave pointsが高いことが確認できます。

Confusion Matrix

plot_model“confusion_matrix”を渡すと、Confusion Matrixのグラフを表示することができます。

[Google Colaboratory]

1
plot_model(tuned_ridge, plot = "confusion_matrix")

[実行結果]

精度よく分類されていることが分かります。

Class Prediction Error Plot

plot_model“error”を渡すと、Class Prediction Error Plotのグラフを表示することができます。

[Google Colaboratory]

1
plot_model(tuned_ridge, "error")

[実行結果]

横軸にカテゴリが表示され、予測が積み上げ棒で表示されています。

モデルがどのカテゴリで問題を抱えているか、カテゴリごとにどのような不正解があるのかを確認できます。

異なるモデルの長所と短所、およびデータセットにおける特有の課題の発見に役立ちます。

モデルの確定と推論

モデルを確定させて推論を実施します。

推論には、モデル構築に使っていないUnseenデータ(残り10%)を使用します。(2行目)

[Google Colaboratory]

1
2
3
final_ridge = finalize_model(tuned_ridge)
predictions = predict_model(final_ridge, data=tg_df_unseen)
print(predictions)

[実行結果(一部略)]

予測値がLabelとして追加されています。

確定したモデルは回帰モデルと同じように、ファイルに保存することができ、そのファイルを読み込むことでモデルの再利用が可能です。

以上が、PyCaretを使って分類モデルを構築して推論を行うフローになります。

AutoML⑩(PyCaret 分類モデル構築)

PyCaretで分類モデルを構築してみます。

データの取得

まず、乳がんのデータセットを読み込みます。

[Google Colaboratory]

1
2
3
4
5
6
import pandas as pd
from sklearn.datasets import load_breast_cancer
load_data = load_breast_cancer()
tg_df_all = pd.DataFrame(load_data.data, columns = load_data.feature_names)
tg_df_all["y"] = load_data.target
tg_df_all

前処理はPyCaretに任せるのでここではデータの加工は行いません。

[実行結果(一部略)]

データ分割

モデル構築に使う訓練データ(90%)とモデル構築に使わないUnseenデータ(10%)に分割します。

[Google Colaboratory]

1
2
3
4
5
tg_df = tg_df_all.sample(frac=0.90, random_state=0).reset_index(drop=True)
tg_df_unseen = tg_df_all.drop(tg_df.index).reset_index(drop=True)
print("All Data: " + str(tg_df.shape))
print("Data for Modeling: " + str(tg_df.shape))
print("Unseen Data For Predictions: " + str(tg_df_unseen.shape))

[実行結果]

前処理

PyCaretを使って前処理を行います。

[Google Colaboratory]

1
2
3
4
5
6
7
from pycaret.classification import *
ret = setup(data = tg_df,
target = "y",
session_id = 0,
normalize = False,
train_size = 0.6,
silent = True)

PyCaretの分類系ライブラリをインポートしています。(1行目)
setup関数パラメータsilentにTrueを指定し、型推定の確認をスキップしています。(7行目)

[実行結果]

分類モデル一覧

PyCaretが提供している分類モデル一覧を確認します。

[Google Colaboratory]

1
models()

[実行結果]

モデル評価一覧

compare_models関数を使って、各モデルを構築し評価一覧を表示します。

sort“F1”を設定しているので、F1評価の高い順に表示します。

[Google Colaboratory]

1
compare_models(sort = "F1", fold = 10)

[実行結果]

分類モデルの評価指標でモデル評価一覧が表示されました。

F1基準でExtra Trees Cassifierモデルの評価が1番高いことが確認できます。

パラメータチューニング

2番目に精度が良くて、速度が速いRidge Classifierのチューニングを行います。

まずはチューニングなしで実行してみます。

create_model関数に、Ridge ClassifierのID ridge を設定し実行します。

[Google Colaboratory]

1
ridge = create_model("ridge", fold = 10)

[実行結果]

F1の平均は0.9686になりました。

次はハイパーパラメータのチューニングを行います。

optimize引数に対象指標F1n_iter(パラメータ探索回数)100を設定しtune_model関数を実行します。

[Google Colaboratory]

1
2
tuned_ridge = tune_model(ridge, optimize = "F1", fold = 10, n_iter = 100)
tuned_ridge

[実行結果]

F1が0.9686から0.9709に向上したことが確認できました。

AutoML⑨(PyCaret モデルの評価)

PyCaretでは、SHAPによるモデルの評価を行うことが可能です。

summary_plot

interpret_model関数にモデルを渡すことで、summary_plotを表示することができます。

[Google Colaboratory]

1
2
3
!pip install shap
import shap
interpret_model(final_rf)

[実行結果]

どの説明変数が大きく影響していたかを図示してくれますので、大局的に結果を確認することができます。

dependence_plot

interpret_model関数のplot引数に“correlation”を指定すると、dependence_plotを表示することができます。

[Google Colaboratory]

1
interpret_model(final_rf, plot="correlation")

[実行結果]

特定の説明変数とSHAP値の散布図が表示され、相関関係を確認することができます。

force_plot

interpret_model関数のplot引数に“reason”を指定すると、force_plotを表示することができます。

observation引数には対象データのインデックスを設定します。

[Google Colaboratory]

1
interpret_model(final_rf, plot="reason", observation=1)

[実行結果]

個々のデータに対するSHAP値を確認することができます。

AutoML⑧(PyCaret モデル再利用)

PyCaretで確定したモデルを再利用可能な状態で保存します。

モデルの保存

save_model関数を使うと、モデルの保存をすることができます。

model_nameにはファイル名を指定します。

[Google Colaboratory]

1
2
save_model(final_rf, model_name="final_rf_model")
%ls

[実行結果]

final_rf_model.pklというファイルが出力されました

モデルの読み込み

load_model関数を使うと、モデルを読み込むことができます。

model_nameには読み込むファイル名を指定します。

[Google Colaboratory]

1
2
load_tuned_rf_model = load_model(model_name="final_rf_model")
load_tuned_rf_model

[実行結果]

学習済みモデルだけではなく、前処理の定義やパイプラインごと保存されているので、すぐに利用可能な状態となっています。

モデルの再利用

読み込んだモデルを使って推論を行います。

比較のために、保存前のモデルで実施したのと同じようにunseenデータ(10%の未使用データ)を使います。

[Google Colaboratory]

1
2
predictions = predict_model(load_tuned_rf_model, data = boston_data_unseen)
print(predictions)

[実行結果]

保存前のモデルと全く同じ推論結果となりました。

このようにPyCaretではパイプラインごとにモデルが保存されいて再利用可能な状態となっています。

前処理をPyCaretで確定させておけば、モデルとの差分が発生することはありません。

AutoML⑦(PyCaret モデルの確定)

PyCaretで構築したモデルを確定させます。

モデルの確定

finalize_model関数を使うと、create_modelの時には使われていないホールドアウトも使用して、モデルのパフォーマンスを確定させることができます。

[Google Colaboratory]

1
2
final_rf = finalize_model(tuned_rf)
final_rf

[実行結果]

確定モデルで推論

predict_model関数を使うと、確定したモデルで推論を行うことができます。

[Google Colaboratory]

1
predict_model(final_rf)

テストデータを使って推論が行われ、評価指標が表示されます。

[実行結果]

R20.9561となっており、finalize_model関数を実行する前よりも精度が良くなっています。

unseenデータで推論

次に、unseenデータ(未使用の10%データ)を使って推論を行います。

[Google Colaboratory]

1
2
predictions = predict_model(final_rf, data = boston_data_unseen)
print(predictions)

[実行結果]

予測値がLabelとして追加されています。

以上が、PyCaretでモデルを確定して推論するまでのフローとなります。

AutoML⑥(PyCaretで回帰モデルを評価)

モデルを評価するために、PyCaretで用意されているいろいろな評価指数グラフを確認してみます。

evaluate_modelダイアログ

evaluate_model関数に、モデルを渡して実行するとボタン(PlotType)が表示されます。

[Google Colaboratory]

1
evaluate_model(tuned_rf)

PlotTypeを切り替えることで、様々な評価指標を確認することができます。

[実行結果]

初期表示ではハイパーパラメータが表示されています。

個別にグラフを表示することもできるので、代表的な指標を確認していきます。

Feature Importance

Feature Importanceでは、説明変数の重要度を確認できます。

[Google Colaboratory]

1
plot_model(tuned_rf, "feature")

[実行結果]

目的変数に及ぼす影響が大きい順に、上から表示されています。

LSTATRMの影響が大きいことが確認できます。

Residuals Plot

Residuals Plotでは、残差プロットを表示します。

[Google Colaboratory]

1
plot_model(tuned_rf, "residuals")

[実行結果]

右側にはヒストグラムも表示されて、分かりやすくなっています。

Prediction Error Plot

Prediction Error Plotでは、予測精度を確認できます。

[Google Colaboratory]

1
plot_model(tuned_rf, "error")

[実行結果]

identityに対するズレ(予測と実測の誤差)からR2が計算されています

予測と実測が同じ場合は、分布が y = x の直線付近に近づきます。

Learing Curve

Learing Curveでは、学習曲線を表示します。

[Google Colaboratory]

1
plot_model(tuned_rf, "learning")

[実行結果]

訓練データとテストデータの予測精度が、データ数に対してどのように推移しているのかを確認できます。

Cross Vaidation Scoreにより、交差検証による精度の幅を示しています。

訓練データを増やすと、テストデータの予測精度が上がっていきますが、感度が鈍っていく様子が見てとれます。

AutoML⑤(PyCaretでハイパーパラメータチューニング)

PyCaretでのハイパーパラメータチューニングを行ってみます。

回帰モデル作成

まずランダムフォレストモデルを作成します。

create_model関数にランダムフォレストのID‘rf’を渡してモデルを作成しています。

fold引数には10を設定しており、データを10分割して10回交差検証を行います。

[Google Colaboratory]

1
rf = create_model('rf', fold = 10)

[実行結果]

10回分の交差検証結果と合わせて、平均値(Mean)標準偏差(SD)もあわせて結果に表示されています。

R2の平均は0.8311となっています。

ハイパーパラメータチューニング

ハイパーパラメータの最適化を実施します。

tune_model関数の第一引数にモデル(作成したランダムフォレストモデル)を指定します。

optimize引数には対象となる指標を指定します。今回はR2を設定しています。

[Google Colaboratory]

1
2
tuned_rf = tune_model(rf, optimize = "r2", fold = 10)
tuned_rf

[実行結果]

R2の平均が0.8311から0.8288に下がってしまいました。

次にn_iter引数を追加して50を指定して実行します。(n_iterのデフォルト値は10)

PyCaretではチューニングにランダムグリッド検索が採用されており、n_iterでパラメータ探索の繰り返し回数を指定することができます。

[Google Colaboratory]

1
2
tuned_rf = tune_model(rf, optimize = "r2", fold = 10, n_iter = 50)
tuned_rf

[実行結果]

R2の平均が0.8311から0.8478に上がりました。

前回より精度は上がりましたが、繰り返し回数を増やしたため処理時間は長くなりました。

AutoML④(PyCaret モデル評価一覧作成を1行で行う)

PyCaretでモデルを構築していきます。

モデル一覧

まずPyCaretが対応しているモデルの一覧を確認します。

models関数でモデル一覧を表示できます。

[Google Colaboratory]

1
models()

[実行結果]

いろいろなアルゴリズムが提供されていることが分かります。

PyCaretでは、これらのアルゴリズムで評価した結果を一覧で提示してくれる機能があります。

各モデルの評価一覧

各モデルを構築します。

compare_modelsを実行するだけで、対応している各モデルの評価一覧を表示することができます。

[Google Colaboratory]

1
compare_models(sort = "R2", fold = 10)

交差検証を実施していて、データの分割数はfold引数で指定可能です。

(fold=10を設定しているので、データの分割数は10となります)

sort引数にはR2を指定していますので、R2の降順で一覧が表示されます。

[実行結果]

結果を確認すると、Extra Trees Regressorモデルの評価が一番高いことが分かります。

現段階ではハイパーパラメータの最適化までは行われていません。

この段階で精度の高いモデルをいくつか選んで、それぞれチューニングして評価していくというのがモデル構築のフローとなります。