機械学習のための簡単パッケージPyCaret (Classification And REgression Training) を解説する。

PyCaretとは

公式ページ https://pycaret.org/

  • 短いコードで機械学習ができる
  • 自動化 (AutoML)
  • オープンソース
  • scikit-learnや他の機械学習パッケージのwrapper

Agenda

  1. 回帰
  2. 分類
  3. クラスタリング

他にも,異常検出(anomaly detection),自然言語処理(natural language processing: NLP),アソシエーション・ルール・マイニングが含まれている.

Google Colab.での実行の準備

# from pycaret.utils import enable_colab

# enable_colab()

回帰

広告による売り上げの予測

広告のデータ http://logopt.com/data/Advertising.csv を用いる.

テレビ(TV),ラジオ(Radio),新聞(Newspaper)への広告から売り上げ(Sales)を予測する.

import pandas as pd  # まずはpandasモジュールを準備する.
df = pd.read_csv(
    "http://logopt.com/data/Advertising.csv", index_col=0
)  # 0行目をインデックスにする.
df.tail()
TV Radio Newspaper Sales
196 38.2 3.7 13.8 7.6
197 94.2 4.9 8.1 9.7
198 177.0 9.3 6.4 12.8
199 283.6 42.0 66.2 25.5
200 232.1 8.6 8.7 13.4

独立変数(特徴ベクトル)$X$ は TV, Radio, Newspaperの列,従属変数(ターゲット) $y$ は Salesの列

PyCaretの基本手順

  • 手順1: setup(データフレーム)で準備をする. 引数 target でターゲットの列を指定. 引数 session_id で乱数の種を指定.

  • 手順2: compare_modelsでモデルの比較を行う. 引数 fold で交差検証用のデータの分割数を指定. 返値は最良の評価値のモデルインスタンス. (もしくはcreate_modelでモデルを生成する.)

注意: 遅い計算機で実行する際には,計算時間がかかるモデルを除いておくと良い.引数excludeで除きたいモデルのリストを入れる. たとえば, compare_models(exclude = ['catboost']) とするとCatBoostを除いてモデルの比較を行ってくれる.

  • 手順3: predict_modelで予測を行う.
from pycaret.regression import *  # 回帰関連の関数のインポート

reg = setup(df, target="Sales", session_id=123)
Description Value
0 session_id 123
1 Target Sales
2 Original Data (200, 4)
3 Missing Values False
4 Numeric Features 3
5 Categorical Features 0
6 Ordinal Features False
7 High Cardinality Features False
8 High Cardinality Method None
9 Transformed Train Set (139, 3)
10 Transformed Test Set (61, 3)
11 Shuffle Train-Test True
12 Stratify Train-Test False
13 Fold Generator KFold
14 Fold Number 10
15 CPU Jobs -1
16 Use GPU False
17 Log Experiment False
18 Experiment Name reg-default-name
19 USI e645
20 Imputation Type simple
21 Iterative Imputation Iteration None
22 Numeric Imputer mean
23 Iterative Imputation Numeric Model None
24 Categorical Imputer constant
25 Iterative Imputation Categorical Model None
26 Unknown Categoricals Handling least_frequent
27 Normalize False
28 Normalize Method None
29 Transformation False
30 Transformation Method None
31 PCA False
32 PCA Method None
33 PCA Components None
34 Ignore Low Variance False
35 Combine Rare Levels False
36 Rare Level Threshold None
37 Numeric Binning False
38 Remove Outliers False
39 Outliers Threshold None
40 Remove Multicollinearity False
41 Multicollinearity Threshold None
42 Remove Perfect Collinearity True
43 Clustering False
44 Clustering Iteration None
45 Polynomial Features False
46 Polynomial Degree None
47 Trignometry Features False
48 Polynomial Threshold None
49 Group Features False
50 Feature Selection False
51 Feature Selection Method classic
52 Features Selection Threshold None
53 Feature Interaction False
54 Feature Ratio False
55 Interaction Threshold None
56 Transform Target False
57 Transform Target Method box-cox
best_model = compare_models(fold=5)
Model MAE MSE RMSE R2 RMSLE MAPE TT (Sec)
et Extra Trees Regressor 0.4636 0.4248 0.6334 0.9837 0.0705 0.0523 0.0460
gbr Gradient Boosting Regressor 0.6601 0.7945 0.8653 0.9704 0.0910 0.0709 0.0100
rf Random Forest Regressor 0.7123 0.8845 0.9210 0.9667 0.0945 0.0750 0.0480
ada AdaBoost Regressor 0.9116 1.3416 1.1366 0.9485 0.1020 0.0903 0.0140
dt Decision Tree Regressor 0.9474 1.4913 1.2042 0.9418 0.1032 0.0836 0.2140
lightgbm Light Gradient Boosting Machine 1.1357 2.4086 1.5262 0.9037 0.1636 0.1345 0.0120
knn K Neighbors Regressor 1.3162 3.1928 1.7806 0.8757 0.1345 0.1183 0.0060
lasso Lasso Regression 1.3792 3.3050 1.8048 0.8697 0.1819 0.1597 0.2280
en Elastic Net 1.3775 3.3151 1.8066 0.8692 0.1830 0.1604 0.0040
lr Linear Regression 1.3750 3.3262 1.8082 0.8686 0.1845 0.1613 0.3580
ridge Ridge Regression 1.3750 3.3262 1.8082 0.8686 0.1845 0.1613 0.2120
lar Least Angle Regression 1.3750 3.3262 1.8082 0.8686 0.1845 0.1613 0.2180
br Bayesian Ridge 1.3794 3.3342 1.8112 0.8683 0.1836 0.1610 0.2160
huber Huber Regressor 1.3576 3.5250 1.8620 0.8617 0.1901 0.1666 0.0060
omp Orthogonal Matching Pursuit 2.6863 11.3136 3.3487 0.5605 0.2315 0.2279 0.2200
llar Lasso Least Angle Regression 4.4043 28.2716 5.2705 -0.0619 0.3890 0.4302 0.2240
dummy Dummy Regressor 4.4043 28.2716 5.2705 -0.0619 0.3890 0.4302 0.0040
par Passive Aggressive Regressor 5.4260 78.1239 6.5130 -1.8399 0.3612 0.3984 0.2160

回帰モデル

No. 略称 回帰モデル 概要
1 et Extra Trees Regressor ランダムに分割してアンサンブルする決定木ベースの手法
2 gbr Gradient Boosting Regressor 勾配ブースティング法
3 xgboost Extreme Gradient Boosting xgブースト (勾配ブースティング法に正則化を追加)
4 rf Random Forest Regressor ランダム森(ブートストラップによるランダムサンプリングと決定木のアンサンブル)
5 catboost CatBoost Regressor カテゴリー変数の扱いに工夫を入れた勾配ブースティング法
6 ada AdaBoost Regressor 適応型の勾配ブースティング法
7 dt Decision Tree Regressor 決定木
8 lightgbm Light Gradient Boosting Machine 勾配ブースティング法の軽量版
9 knn K Neighbors Regressor $k$-近傍法
10 lasso Lasso Regression Lasso回帰(正則化を入れた線形回帰)
11 en Elastic Net Elastic Net(正則化を入れた線形回帰)
12 lar Least Angle Regression 予測値と教師データの偏差と相関が大きい特徴量を1つずつ追加していく方法
13 lr Linear Regression 線形回帰
14 ridge Ridge Regression リッジ回帰(正則化を入れた線形回帰)
15 br Bayesian Ridge ベイズリッジ回帰
16 huber Huber Regressor Huber回帰
17 omp Orthogonal Matching Pursuit 貪欲に特徴量を1つずつ追加していく方法
18 llar Lasso Least Angle Regression LassoにLeast Angle Regressionを適用して特徴量選択
19 par Passive Aggressive Regressor オンライン型の学習

回帰モデルの評価尺度

  • MAE 平均絶対誤差 (mean absolute error)

誤差の絶対値の平均値であり,$i$番目のデータの正解(目標値)を$y_i$,予測値を$\hat{y}_{i}$としたとき,以下のように定義される.

$$MAE = \frac{\sum_{i=1}^n |\hat y_i - y_i|}{n}$$

  • MSE 平均2乗誤差 (mean squared error)

誤差の2乗の平均値であり,$i$番目のデータの正解(目標値)を$y_i$,予測値を$\hat{y}_{i}$としたとき,以下のように定義される.

$$MSE = \frac{\sum_{i=1}^n (\hat y_i - y_i)^2}{n}$$

  • RMSE 平均2乗誤差の平方根 (root mean squared error)

MSEの平方根をとったものがRMSEである.

$$RMSE =\sqrt{\frac{\sum_{i=1}^n (\hat y_i - y_i)^2}{n}}$$

  • R2 決定係数(coefficient of determination) $R^2$

回帰モデルによって実データをどれくらい説明できているかを表す指標であり,1に近いほど精度が良いと解釈できる.

$$R^2 = 1 - {\sum_{i=1}^n (y_i - \hat{y}_i)^2 \over \sum_{i=1}^n (y_i-\bar{y})^2 }$$

この定義だと(記号が$R^2$であるにもかかわらず)負になる場合もあるので,注意を要する.最大値は1で誤差が0の状態である.$R^2$が0とは,平均で予測をした場合と同じ精度という意味であり,負の場合は平均値より悪い予測を意味する.

  • RMSLE 平均2乗対数誤差の平方根 (root mean squared logarithmic error)

予測値,正解ともに対数をとったもので評価した平均2乗誤差の平方根.

  • MAPE 平均絶対パーセント誤差 (mean absolute percentage error)

$$MAPE = \frac{\sum_{i=1}^n | (\hat y_i - y_i)/y_i) |}{n}$$

best_model
ExtraTreesRegressor(bootstrap=False, ccp_alpha=0.0, criterion='mse',
                    max_depth=None, max_features='auto', max_leaf_nodes=None,
                    max_samples=None, min_impurity_decrease=0.0,
                    min_impurity_split=None, min_samples_leaf=1,
                    min_samples_split=2, min_weight_fraction_leaf=0.0,
                    n_estimators=100, n_jobs=-1, oob_score=False,
                    random_state=123, verbose=0, warm_start=False)
best_model_results = pull()  # 結果をデータフレームとして得る.
best_model_results.to_csv("best_model.csv")

予測

predict_model(best_model)
Model MAE MSE RMSE R2 RMSLE MAPE
0 Extra Trees Regressor 0.3772 0.2647 0.5145 0.9898 0.0328 0.0280
TV Radio Newspaper Sales Label
0 199.800003 3.100000 34.599998 11.4 11.080
1 80.199997 0.000000 9.200000 8.8 9.137
2 74.699997 49.400002 45.700001 14.7 13.937
3 44.700001 25.799999 20.600000 10.1 9.836
4 147.300003 23.900000 19.100000 14.6 14.633
... ... ... ... ... ...
56 66.099998 5.800000 24.200001 8.6 9.231
57 276.899994 48.900002 41.799999 27.0 25.154
58 120.500000 28.500000 14.200000 14.2 14.470
59 239.300003 15.500000 27.299999 15.7 15.422
60 239.800003 4.100000 36.900002 12.3 12.204

61 rows × 5 columns

可視化(回帰)

可視化の基本手順

  • 手順1: plot_model(モデルインスタンス)で描画する.引数plotで描画の種類を指定する.既定値は残差プロット.
  • 手順2:interpret_model(モデルインスタンス)で,結果の解釈を可視化する.

plot_modelの引数plotの種類

  • ‘residuals’: 残差プロット(既定値)
  • ‘error’ : 誤差プロット
  • ‘cooks’: Cookの距離プロット(外れ値をみる)
  • ‘feature': 特徴重要度プロット
  • ‘learning’: 学習曲線
  • ‘vc’: 検証曲線
  • ‘manifold’: 次元削減を行い特徴を2次元に射影した図
  • ‘parameter’: モデルのパラメータを表で表示
  • ‘tree’: 決定木の図示(木ベースの場合のみ)
plot_model(best_model)
plot_model(best_model, plot="error")
plot_model(best_model, plot="cooks")
plot_model(best_model, plot="feature")
plot_model(best_model, plot="learning")
plot_model(best_model, plot="vc")
plot_model(best_model, plot="manifold")
plot_model(best_model, plot="parameter")
Parameters
bootstrap False
ccp_alpha 0.0
criterion mse
max_depth None
max_features auto
max_leaf_nodes None
max_samples None
min_impurity_decrease 0.0
min_impurity_split None
min_samples_leaf 1
min_samples_split 2
min_weight_fraction_leaf 0.0
n_estimators 100
n_jobs -1
oob_score False
random_state 123
verbose 0
warm_start False

小さな(深さ3の)決定木 (dt) のモデルを作って可視化する.

dt = create_model("dt", max_depth=3)
plot_model(dt, plot="tree")

モデルの解釈

interpret_model関数は,SHAP値 (Shapley value)を計算する.

interpret_modelの引数plotの種類

  • ‘summary’: 各特徴のSHAP値がターゲットに与える影響を表した図 (既定値)
  • ‘correlation’: 特徴とSHAP値の相関図
  • ‘reason’: 個々のデータに対するSHAP値
interpret_model(best_model)
interpret_model(best_model, plot="correlation")
interpret_model(best_model, plot="reason", observation=10)
Visualization omitted, Javascript library not loaded!
Have you run `initjs()` in this notebook? If this notebook was from another user you must also trust this notebook (File -> Trust notebook). If you are viewing this notebook on github the Javascript has been stripped for security. If you are using JupyterLab this error is because a JupyterLab extension has not yet been written.

問題 (SAT,GPA)

http://logopt.com/data/SATGPA.csv データを用いて,2種類のSATの成績からGPAを予測せよ.

データをそのまま使うと'MathSAT'列と'VerbalSAT'列をカテゴリー変数としてしまうので,浮動小数点数に変換しておく.

gpa = pd.read_csv(
    "http://logopt.com/data/SATGPA.csv",
    index_col=0,
    dtype={"MathSAT": float, "VerbalSAT": float},
)
gpa.head()
MathSAT VerbalSAT GPA
1 580.0 420.0 2.90