自動機械学習AutoML Pycaret  multi class clasification(多クラス分類)サンプルコード解説。【後半】

データサイエンス

前回に引き続き Pycaret の多クラス分類 サンプルコードの後半部分を解説します。少々細かいですが、こちらもデータサイエンティストにとって、強力な武器になる内容が盛り込まれているので、ぜひ参考になさってください。

 特にEDAなどの可視化が簡単にできてしまい、恐ろしいくらいです。。。

はじめに

 こちらが、オリジナルの公式ページです。↓↓↓ colaboが実行できて便利ですよ!

Tutorials | Docs
Tutorials developed and maintained by the core developers of PyCaret

 

 そして、こちらが前半部を解説したページです↓↓↓

自動機械学習AutoML Pycaret  multi class clasification(多クラス分類)サンプルコード解説。【前半】
自動機械学習(AutoML)の人気オープンソースPycaretの、多クラス分類問題のサンプルコードを解説します。このサンプルコードの内容を覚えると、複雑な処理や試行錯誤を数行で試すことができる、非常に密度の濃い内容となっておりますので、ぜひ参考になさってください。応用編は【後半】で。

サンプルコード解説(Detailed function-by-function overview機能ごとの詳細な説明)

今回解説する後半部分は、機能ごとの詳細な説明です。

Set up

s = setup(data, target = 'species', session_id = 123)

データセット、ターゲット予測対象(”species”)を選んで、setupしてオブジェクトを作成します。

session_idは乱数のシード固定です。

各パラメータの設定は下記です。(解説いれるかなやみますね)

Description	Value
0	Session id	123
1	Target	species
2	Target type	Multiclass
3	Target mapping	Iris-setosa: 0, Iris-versicolor: 1, Iris-virginica: 2
4	Original data shape	(150, 5)
5	Transformed data shape	(150, 5)
6	Transformed train set shape	(105, 5)
7	Transformed test set shape	(45, 5)
8	Numeric features	4
9	Preprocess	True
10	Imputation type	simple
11	Numeric imputation	mean
12	Categorical imputation	mode
13	Fold Generator	StratifiedKFold
14	Fold Number	10
15	CPU Jobs	-1
16	Use GPU	False
17	Log Experiment	False
18	Experiment Name	clf-default-name
19	USI	35bc

# check all available config
get_config()

config 設定を確認します。下記が出力です。

{'USI',
 'X',
 'X_test',
 'X_test_transformed',
 'X_train',
 'X_train_transformed',
 'X_transformed',
 '_available_plots',
 '_ml_usecase',
 'data',
 'dataset',
 'dataset_transformed',
 'exp_id',
 'exp_name_log',
 'fix_imbalance',
 'fold_generator',
 'fold_groups_param',
 'fold_shuffle_param',
 'gpu_n_jobs_param',
 'gpu_param',
 'html_param',
 'idx',
 'is_multiclass',
 'log_plots_param',
 'logging_param',
 'memory',
 'n_jobs_param',
 'pipeline',
 'seed',
 'target_param',
 'test',
 'test_transformed',
 'train',
 'train_transformed',
 'variable_and_property_keys',
 'variables',
 'y',
 'y_test',
 'y_test_transformed',
 'y_train',
 'y_train_transformed',
 'y_transformed'}
# lets access X_train_transformed
get_config('X_train_transformed')

学習データを確認できます

# another example: let's access seed
print("The current seed is: {}".format(get_config('seed')))

# now lets change it using set_config
set_config('seed', 786)
print("The new seed is: {}".format(get_config('seed')))

乱数シード関連です。途中で変更することは、そんなにないですかね。。。

  • 2行目:現在のシード確認
  • 5行目:シードを変更しています

正規化

# init setup with normalize = True

s = setup(data, target = 'species', session_id = 123,
          normalize = True, normalize_method = 'minmax')

正規化です。前処理ですね。

setupの引数で、normalizeをTrue、normalize_methodを”minmax”にしてみています。

特徴量の最小値を0、最大値を1にする正規化です。

# lets check the X_train_transformed to see effect of params passed
get_config('X_train_transformed')['sepal_length'].hist()

ヒストグラムをプロットして確認します。

  • 2行目:”x_train_transformed”で学習データの説明変数の、”sepeal_length”のヒストグラムプロットします。

.hist()でプロットできてしまいます。便利ですね。。。

get_config('X_train')['sepal_length'].hist()

正規化前のデータのヒストグラムをプロットすると、全然大きい数の間に分布してますよ。

“X_train”で処理前のデータ指定です。

モデル比較

best = compare_models()


 	Model	Accuracy	AUC	Recall	Prec.	F1	Kappa	MCC	TT (Sec)
qda	Quadratic Discriminant Analysis	0.9718	0.9974	0.9718	0.9780	0.9712	0.9573	0.9609	0.0380
lda	Linear Discriminant Analysis	0.9718	1.0000	0.9718	0.9780	0.9712	0.9573	0.9609	0.0440
knn	K Neighbors Classifier	0.9636	0.9844	0.9636	0.9709	0.9631	0.9450	0.9494	0.0510
lightgbm	Light Gradient Boosting Machine	0.9536	0.9857	0.9536	0.9634	0.9528	0.9298	0.9356	0.0500
nb	Naive Bayes	0.9445	0.9868	0.9445	0.9525	0.9438	0.9161	0.9207	0.0380
et	Extra Trees Classifier	0.9445	0.9935	0.9445	0.9586	0.9426	0.9161	0.9246	0.1240
catboost	CatBoost Classifier	0.9445	0.9922	0.9445	0.9586	0.9426	0.9161	0.9246	0.0390
xgboost	Extreme Gradient Boosting	0.9355	0.9868	0.9355	0.9440	0.9343	0.9023	0.9077	0.0480
dt	Decision Tree Classifier	0.9264	0.9429	0.9264	0.9502	0.9201	0.8886	0.9040	0.0340
rf	Random Forest Classifier	0.9264	0.9903	0.9264	0.9343	0.9232	0.8886	0.8956	0.1210
gbc	Gradient Boosting Classifier	0.9264	0.9688	0.9264	0.9343	0.9232	0.8886	0.8956	0.1500
ada	Ada Boost Classifier	0.9155	0.9843	0.9155	0.9401	0.9097	0.8720	0.8873	0.0690
lr	Logistic Regression	0.9073	0.9751	0.9073	0.9159	0.9064	0.8597	0.8645	0.0400
ridge	Ridge Classifier	0.8318	0.0000	0.8318	0.8545	0.8281	0.7459	0.7595	0.0370
svm	SVM - Linear Kernel	0.8100	0.0000	0.8100	0.7831	0.7702	0.7125	0.7527	0.0350
dummy	Dummy Classifier	0.2864	0.5000	0.2864	0.0822	0.1277	0.0000	0.0000	0.0380

各モデルの精度が表示されます。、Accuracy、AUC、Recall、Precition、F1、Kappa、

# check available models
models()

利用可能なモデルを確認すると

Name	Reference	Turbo
ID			
lr	Logistic Regression	sklearn.linear_model._logistic.LogisticRegression	True
knn	K Neighbors Classifier	sklearn.neighbors._classification.KNeighborsCl...	True
nb	Naive Bayes	sklearn.naive_bayes.GaussianNB	True
dt	Decision Tree Classifier	sklearn.tree._classes.DecisionTreeClassifier	True
svm	SVM - Linear Kernel	sklearn.linear_model._stochastic_gradient.SGDC...	True
rbfsvm	SVM - Radial Kernel	sklearn.svm._classes.SVC	False
gpc	Gaussian Process Classifier	sklearn.gaussian_process._gpc.GaussianProcessC...	False
mlp	MLP Classifier	sklearn.neural_network._multilayer_perceptron....	False
ridge	Ridge Classifier	sklearn.linear_model._ridge.RidgeClassifier	True
rf	Random Forest Classifier	sklearn.ensemble._forest.RandomForestClassifier	True
qda	Quadratic Discriminant Analysis	sklearn.discriminant_analysis.QuadraticDiscrim...	True
ada	Ada Boost Classifier	sklearn.ensemble._weight_boosting.AdaBoostClas...	True
gbc	Gradient Boosting Classifier	sklearn.ensemble._gb.GradientBoostingClassifier	True
lda	Linear Discriminant Analysis	sklearn.discriminant_analysis.LinearDiscrimina...	True
et	Extra Trees Classifier	sklearn.ensemble._forest.ExtraTreesClassifier	True
xgboost	Extreme Gradient Boosting	xgboost.sklearn.XGBClassifier	True
lightgbm	Light Gradient Boosting Machine	lightgbm.sklearn.LGBMClassifier	True
catboost	CatBoost Classifier	catboost.core.CatBoostClassifier	True
dummy	Dummy Classifier	sklearn.dummy.DummyClassifier	True

よく使うアルゴリズムはほぼ実装されていますね。

SVM、ランダムフォレスト、K近傍、Xgboost、勾配boost、lightgbmもあるので安心です。。。

”あれ試してないの”的な質問されたら、全部やってますよと答えましょう!

compare_tree_models = compare_models(include = ['dt', 'rf', 'et', 'gbc', 'xgboost', 'lightgbm', 'catboost'])

モデルを指定してひかくもできます。こちらはツリー系のモデルだけですね。

lightgbmが最高精度みたいですね。。。やはり強いですね。

compare_tree_models_results = pull()
compare_tree_models_results

これまでのは、モデルの比較結果を表示するだけするだけです。データとして引っ張り出したときは、pull()を実行します。

best_recall_models_top3 = compare_models(sort = 'Recall', n_select = 3)

比較結果の並べ替えもできます。sortで選択します。例では”Recal”で並べて、n_select=3で、top3を取得します。

Experimental logging いろいろ試した結果のログを残す機能

機械学習では、ハイパーパラメータなど様々な値を試しますね。そんな時に、結果を残してくれる便利な機能です。デフォルトでは、

from pycaret.classification import *
s = setup(data, target = 'Class variable', log_experiment='mlflow', experiment_name='iris_experiment')

# compare models
best = compare_models()

start mlflow server on localhost:5000
!mlflow ui
  • 1~6行目:モデルを設定して、学習しています
  • 7行目:mlfllowというログ用のUIを設定して
  • 8行目:UIを立ち上げます。

Create Mode モデル関係

# check all the available models
models()

利用可能なモデルを確認します。リストが表示されますよ。

# train logistic regression with default fold=10
lr = create_model('lr')

ロジスティック回帰をデフォルトのfold 10で実行

# train logistic regression with fold=3
lr = create_model('lr', fold=3)

ロジスティック回帰をfold 3で実施

# train logistic regression with specific model parameters
create_model('lr', C = 0.5, l1_ratio = 0.15)

ロジスティック回帰の、ハイパーパラメータC、l1_ratio(L1正則化)を設定して学習

# train lr and return train score as well alongwith CV
create_model('lr', return_train_score=True)

return_train_scoreをTrueにしておくと、クロスバリデーションで検討した結果を全部の回分表示してくれます。これは、たまに見たくなるところですね。。。モデルの安定感を確認したいときには便利です。

Tune model モデルのチューニング

グリッドサーチなどで、ハイパーパラメータをチューニングする方法です。

# train a dt model with default params
dt = create_model('dt')
# tune hyperparameters of dt
tuned_dt = tune_model(dt)
  • 2行目:モデルをセッティングして
  • 4行目:ハイパーパラメータをチューニング
# define tuning grid
dt_grid = {'max_depth' : [None, 2, 4, 6, 8, 10, 12]}

# tune model with custom grid and metric = F1
tuned_dt = tune_model(dt, custom_grid = dt_grid, optimize = 'F1')
  • 2行目:グリッドサーチの設定、決定木の”max_depth”を6パターン試します
  • 4行目:グリッドサーチ実行します。F1scoreで判断します。

# to access the tuner object you can set return_tuner = True
tuned_dt, tuner = tune_model(dt, return_tuner=True)
# model object
tuned_dt
# tuner object
tuner

tunerオブジェクトにアクセスしたいときは

  • 2行目:引数return_tunerをTrueにしておきます
  • 4行目:tunerを見てみます
  • 6行目:tunerオブジェクトをダイアグラム(フロー図のようなもの)で見ることができます。

Ensemble Model アンサンブルモデルで学習

# ensemble with bagging
ensemble_model(dt, method = 'Bagging')

決定木を、バギングでアンサンブルしています。1行で作ることができて便利ですね。。。

Blend Models

# top 3 models based on recall
best_recall_models_top3

# blend top 3 models
blend_models(best_recall_models_top3)

これはBlendモデルです

  • 2行目:上の方で計算したtop3のモデルです
  • 5行目:3つのモデルをブレンドします。3つのモデルの多数決です。

ブレンドは、基本的に精度が良くなることが多いです。精度を上げるための力技として有効です。

Stack models

# stack models
stack_models(best_recall_models_top3)

こちらは、スタックモデルです。スタックモデルは、3つのモデル(今回の例では)の出力を入力値とすして統合するmetaモデルというものを追加して合計4モデルで構成されるものになります。

これも、精度向上は期待できます

Plot Model(モデルの描画)

# plot class report
plot_model(best, plot = 'class_report')

各クラスの精度を描画します

横軸が精度の種類、縦軸がクラスです。3クラス分類ですね。

# to save the plot
plot_model(best, plot = 'class_report', save=True)

引数saveをTrueにすると、グラフを保存してくれます。便利ですね。

 Interpret Model(特徴量の重要度)

# train lightgbm model
lightgbm = create_model('lightgbm')
# interpret summary model
interpret_model(lightgbm, plot = 'summary')

特徴量の重要度のplotです。これは、よく使うので覚えておきましょう。特徴量選択の時で便利ですよ。

  • 2行目:LightGBMを学習しておいて
  • 4行目:重要度のサマリを表示します

4つの特徴量の重要度です。クラスごとに分析される。SHAP valueという値です。

# reason plot for test set observation 1
interpret_model(lightgbm, plot = 'reason', observation = 1)

こちらも寄与度です。

Get Leaderboard

# get leaderboard
lb = get_leaderboard()
lb

今の設定で試したすべてのモデルの結果を表示します

AutoML

automl()

Auto ML 自動機械学習ですね。今の設定で試した中で一番いいモデルを持ってきます。パラメータ調整も今の設定で行った中でのベスト解です。

Dashboard

# dashboard function
dashboard(dt, display_format ='inline')

ダッシュボードをインラインで表示します。colaboやnotebookの時の設定ですね。

Deep Check

# deep check function
deep_check(best)

設定等の自動チェック機能です。

EDA(探索的データ解析)

データを眺めてみる機能ですね

# eda function
eda()

様々なデータ可視化結果(グラフ)が表示されます。

一通り表示されるので便利ですよ!

Create app

# create gradio app
create_app(best)

学習済みモデルで簡単にwebアプリを作成できます。

そのまま、テスト運用できそうです。。。

Create API

# create api
create_api(best, api_name = 'my_first_api')

学習済みモデルのAPIを作成します。具体的には、pythonのファイルが出来上がります。

my_first_api.pyというファイルです。これを読み込むと学習済みモデルが使えます。

Create Docker

create_docker('my_first_api')

dockerも作成できます。至れり尽くせりですね。。。

Finalize Model

final_best = finalize_model(best)

最終的にホールドアウトで学習検証したモデルを保存します。

クロスバリデーションで学習・検証したデータはまとまっていませんからね。

Convert Model

# transpiles learned function to java
print(convert_model(dt, language = 'java'))

何と自動で、別言語に変換できます。例ではjavaですね。ほかに、 C, Java, Go, C#, などです。

もはや、有償ソフトより便利な気もします。。。

Deploy Model

# deploy model on aws s3
 deploy_model(best, model_name = 'my_first_platform_on_aws',
             platform = 'aws', authentication = {'bucket' : 'pycaret-test'})

# load model from aws s3
 loaded_from_aws = load_model(model_name = 'my_first_platform_on_aws', platform = 'aws',
                              authentication = {'bucket' : 'pycaret-test'})

 loaded_from_aws

AWS,Azure,Gcpなどの形式にdeployできます。上の例はAWSですね。

Save/Load model

# save model
save_model(best, 'my_first_model')

# load model
loaded_from_disk = load_model('my_first_model')
loaded_from_disk

最後にモデルのsaveとloadですね。

  • 2行目:”my_first_model”という名前でほぞん
  • 5行目:モデルをロード

まとめ

今回は、Pycaret Classificationの多クラス分類 サンプルコードの後半部分を解説しました。だいぶ長くなりましたが、どれも素晴らしい機能です。

ぜひ身に着けてみてください。

↓↓↓前半はこちらです

タイトルとURLをコピーしました