LoginSignup
5
2

【AutoMLで分類(3分類)】Pycaretで機械学習モデルの比較

Posted at

はじめに

Pycaretとは数行のコードで機械学習モデルを構築・比較してくれるAutoMLライブラリです。

この投稿では分類問題(3分類)を取り扱い、結果の解釈やコードの詳細を説明します。

分類問題用のデータセットの作成

分類問題用にデータセットにラベルづけを行います。今回はこちらのページで紹介した"df.csv"というデータを用いていきます。csvファイルはGitHunにも保存しております。

# データの読み込み
import pandas as pd
df = pd.read_csv("df.csv")
print("Datasize: " + str(df.shape))
df.tail(15)
出力
Datasize: (707, 10)

image.png

このデータセットのyの値に対して、以下のルールに基づきラベル付を行います。

  • y≦150は"L"
  • y≦250は"M"
  • y>250は"H"
# y列をラベルに置き換えます
df.loc[df["y"] > 250, "y_label"] = "H"
df.loc[df["y"] <= 250, "y_label"] = "M"
df.loc[df["y"] <= 150, "y_label"] = "L"
df.tail(15)

image.png

yとy_labelを見比べると、定義した通りにラベル付されていることが分かります。

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

# ライブラリのインポート
# 不要な警告文を非表示にする
import warnings
warnings.filterwarnings("ignore")
from pycaret.classification import *
# pycaretのバージョンを確認
import pycaret
print("pycaret version: ", pycaret.__version__)
出力
pycaret version:  3.0.4

次にデータの前処理を行っていきます。今回はyを無視して、x1~x9を説明変数としてy_labelを予測していくことにします。

# データの前処理
clf = setup(df, target ="y_label", fold = 5, 
            ignore_features = ["y"],
            fold_shuffle=True, session_id = 123)

image.png

3.Label Encoded にラベル付の方法が記載されている。

参考サイト(引数の参考)

1. モデルの比較

この段階ではハイパーパラメータの最適化までは実行されていない。

# 各種モデルの比較
best_model = compare_models()
best_model

image.png

出力
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=1000,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=123, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)
  • Accuracy:正解率(正例、負例を問わず正解した割合)
  • AUC:ROC曲線で囲まれた面積
  • Recall:再現率、実際に陽性であるもののうち陽性と予測できた割合
  • Prec.:適合率、陽性と予測したうちで実際に陽性だった割合
  • F1:F値、再現率と適合率の調和平均

2. モデルの確認

# create_modelの引数に上記で最適化したモデル名を記載
model = create_model('lightgbm')

image.png

このMeanの値が上記のモデル比較のスコアとなっている

3. ハイパーパラメータの最適化

選択したモデルのハイパーパラメータの最適化を行う(問題なければこれが最終モデルとなる)。今回はlightGBMのモデルを最適化していきます。

# ハイパーパラメータの最適化を行う
final_model = tune_model(model, n_iter = 500, optimize = 'Accuracy')

image.png

モデルのチューニングが上手くいっていれば、Accuracyなどのスコアが上がる。

次に最適化したモデルで結果を可視化していく(公式: https://pycaret.readthedocs.io/en/latest/api/classification.html)

4. モデルのハイパーパラメータの確認

plot_model(final_model, plot = 'parameter')

image.png

5. ROC曲線

plot_model(final_model, plot="auc")

image.png

真横軸に偽陽性率、縦軸に真陽性率をプロットした曲線がROC(Receiver Operating Characteristic))曲線である。ROC曲線の下の面積をAUC(Area Under the Curve)と呼び、最大で1で完全にあてずっぽうの時で0.5になる。

6. 混同行列

plot_model(final_model, plot="confusion_matrix")

image.png

ラベルのつけ方はデータ読み込み時の"Label Encoded"に記載あり。

7. 予測エラー

plot_model(final_model, plot = 'error')

image.png

  1. クラスレポート
plot_model(final_model, plot = "class_report")

image.png

それぞれのクラスのスコアが表示される。

12. 学習曲線

# 可視化 引数plot = learning で 学習曲線
plot_model(final_model, plot = 'learning')

image.png

横軸に訓練データのデータ数、縦軸に予測精度をプロットしている。理想的なモデルではサンプルサイズを大きくした時にTrainig Scoreが下がり、CV Scoreが上がっていき、両者が漸近する。漸近する値があらかじめ設定した値よりも大きいとモデルが上手く作られていると考えられる。両者ともにスコアが低い場合は学習不足なのでパラメータを増やす、学習データのスコアだけが高い場合は過学習気味なのでパラメータ数を減らすなどの対策が必要である。両者の差が大きい場合はデータ数を増やしてモデルの精度を上げるなどの対策が必要。

14. 検証曲線

# 可視化 引数plot = vc で 検証曲線
plot_model(final_model, plot = 'vc')

image.png

検証曲線は横軸にハイパーパラメータ、縦軸に予測精度をプロットしている。適切なハイパーパラメータ(例:max_depth:木の深さ)の値はどこかを確認でき、訓練精度と検証制度の差が小さく、精度が高いものを選ぶようにする。(学習不足や過学習を確認することができます。)横軸のハイパーパラメータはアルゴリズムによって異なる。

15. ディメンジョン

plot_model(final_model, plot = 'dimension')

image.png

多変量データ可視化アルゴリズム。円周上に各特徴次元を一様に配置し、各特徴量を正規化して、中心から各円弧までの軸上に点をプロットします。このメカニズムにより、たくさんの次元を持つデータを円内に簡単に描画しすることができます。(特徴量の選択に関しては要調査)

16. 特徴量の重要度

# 可視化 引数plot = feature で特徴重要度プロット
plot_model(final_model, plot = 'feature')

image.png

# 以下のコードで全ての特徴量に対して重要度を算出することも可能
plot_model(final_model, plot = 'feature_all')

17. 決定境界

plot_model(final_model, plot = 'boundary')

image.png

クラスを分類する決定境界

18. 決定木

# 小さな決定木のモデルを作って、特徴量の関係を可視化する
dt = create_model('dt', max_depth=3)
plot_model(dt, plot = 'tree')

image.png

19. plot_model一覧

# これまでに出力したplot_modelを確認できる
evaluate_model(final_model)

20. モデルの確定

final_model = finalize_model(final_model)
print(final_model)
出力
Pipeline(memory=FastMemory(location=C:\Users\*ユーザーネームに紐づく階層*\AppData\Local\Temp\joblib),
         steps=[('label_encoding',
                 TransformerWrapperWithInverse(exclude=None, include=None,
                                               transformer=LabelEncoder())),
                ('numerical_imputer',
                 TransformerWrapper(exclude=None,
                                    include=['x1', 'x2', 'x3', 'x4', 'x5', 'x6',
                                             'x7', 'x8', 'x9'],
                                    transformer=SimpleImputer(add_indicator=False,
                                                              copy...
                                colsample_bytree=1.0, feature_fraction=0.8,
                                importance_type='split', learning_rate=0.2,
                                max_depth=-1, min_child_samples=11,
                                min_child_weight=0.001, min_split_gain=0.2,
                                n_estimators=170, n_jobs=-1, num_leaves=8,
                                objective=None, random_state=123, reg_alpha=0.3,
                                reg_lambda=1e-07, silent='warn', subsample=1.0,
                                subsample_for_bin=200000, subsample_freq=0))],
         verbose=False)
# モデルの保存( ''の中は保存したいファイル名)
save_model(final_model,"Final_Model")

参考

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2