便利なAutoML、PyCaretを使った回帰分析を行う。
ライブラリの読み込み
# https://stackoverflow.com/questions/70148065/numba-needs-numpy-1-20-or-less-for-shapley-import
!pip install numba==0.53 # 依存関係エラー対応
# ライブラリの読み込み
!pip install pycaret
from pycaret.utils import enable_colab
enable_colab()
colabを使用する際、2022年8月現在だとエラーが発生したのでnumbaのバージョンを指定してインストールする。
インストール後はランタイムの再起動を行う。
実験用のデータを読み込み
# テスト用のデータを読み込む
from pycaret.datasets import get_data
boston_data_all = get_data('boston')
# pandasのバージョンも下げておく
# https://teratail.com/questions/5b01vplewor7kl
!pip install pandas-profiling==3.1.0
------
crim zn indus chas nox rm age dis rad tax ptratio black lstat medv
0 0.00632 18.0 2.31 0 0.538 6.575 65.2 4.0900 1 296 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0 0.469 6.421 78.9 4.9671 2 242 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0 0.469 7.185 61.1 4.9671 2 242 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0 0.458 6.998 45.8 6.0622 3 222 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0 0.458 7.147 54.2 6.0622 3 222 18.7 396.90 5.33 36.2
こちらも別のエラーが出たので、pandasをバージョン指定して読み込む。
前処理
# 回帰に使うライブラリを読み込み
from pycaret.regression import *
# データの読み込みと前処理の実施
ret = setup(boston_data
, target = 'medv' # 目的変数
, normalize = False # 正規化
, session_id = 0 # 種
, numeric_features = ['chas']
, categorical_features = ['rad']
, train_size = 0.8 # 訓練データの割合を指定
, silent = True) # 型確認をスキップ
-----
Description Value
0 session_id 0
1 Target medv
2 Original Data (455, 14)
3 Missing Values False
4 Numeric Features 12
5 Categorical Features 1
6 Ordinal Features False
7 High Cardinality Features False
8 High Cardinality Method None
9 Transformed Train Set (364, 21)
10 Transformed Test Set (91, 21)
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 cb5f
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
流れは下記の書籍を参考にする。
PyCaretは正規化などの前処理もやってくれるが、実務だとあらかじめ前処理はじっくり行っておく方が良さそう。
setupで目的変数や乱数シードなどの指定を行う。列の型推定も行ってくれるが、明示的に指定したい場合はここで指定する。指定不要な場合はsilent = Trueの指定でスキップできる。
訓練データの分割もここで可能(便利)。ここでは8割を訓練データ、2割をテストデータに割り当てた。
実際に分割された数などの情報や正規化の指定など、諸設定が出力される。
モデルの指定
PyCaretにはいくつもモデル(方法論)が備えられており、すべてのモデルでざっくり学習を実施→良さそうな方法論を選択して最適化という流れで機械学習を進めていく。
models()
-----
Name Reference Turbo
ID
lr Linear Regression sklearn.linear_model._base.LinearRegression True
lasso Lasso Regression sklearn.linear_model._coordinate_descent.Lasso True
ridge Ridge Regression sklearn.linear_model._ridge.Ridge True
en Elastic Net sklearn.linear_model._coordinate_descent.Elast... True
lar Least Angle Regression sklearn.linear_model._least_angle.Lars True
llar Lasso Least Angle Regression sklearn.linear_model._least_angle.LassoLars True
omp Orthogonal Matching Pursuit sklearn.linear_model._omp.OrthogonalMatchingPu... True
br Bayesian Ridge sklearn.linear_model._bayes.BayesianRidge True
ard Automatic Relevance Determination sklearn.linear_model._bayes.ARDRegression False
par Passive Aggressive Regressor sklearn.linear_model._passive_aggressive.Passi... True
ransac Random Sample Consensus sklearn.linear_model._ransac.RANSACRegressor False
tr TheilSen Regressor sklearn.linear_model._theil_sen.TheilSenRegressor False
huber Huber Regressor sklearn.linear_model._huber.HuberRegressor True
kr Kernel Ridge sklearn.kernel_ridge.KernelRidge False
svm Support Vector Regression sklearn.svm._classes.SVR False
knn K Neighbors Regressor sklearn.neighbors._regression.KNeighborsRegressor True
dt Decision Tree Regressor sklearn.tree._classes.DecisionTreeRegressor True
rf Random Forest Regressor sklearn.ensemble._forest.RandomForestRegressor True
et Extra Trees Regressor sklearn.ensemble._forest.ExtraTreesRegressor True
ada AdaBoost Regressor sklearn.ensemble._weight_boosting.AdaBoostRegr... True
gbr Gradient Boosting Regressor sklearn.ensemble._gb.GradientBoostingRegressor True
mlp MLP Regressor sklearn.neural_network._multilayer_perceptron.... False
lightgbm Light Gradient Boosting Machine lightgbm.sklearn.LGBMRegressor True
dummy Dummy Regressor sklearn.dummy.DummyRegressor True
modelsを引数なしで呼び出すと、利用可能な回帰分析の手法が出力される。ここで一番左に記載されている略称を用いることで、具体的に機械学習の指定を行うことができる。
方法論の比較
compare_models(sort='R2', # ソート基準となる列を指定
fold = 10) # データの分割数を指定
# ここでの結果を参考に、精度が高くなると思われるモデルを絞り込む
-----
Model MAE MSE RMSE R2 RMSLE MAPE TT (Sec)
et Extra Trees Regressor 2.1839 9.5456 3.0433 0.8761 0.1401 0.1107 0.645
gbr Gradient Boosting Regressor 2.1968 9.3363 3.0085 0.8746 0.1395 0.1109 0.106
lightgbm Light Gradient Boosting Machine 2.3779 11.9894 3.4159 0.8436 0.1505 0.1185 0.071
ada AdaBoost Regressor 2.6713 12.6488 3.5252 0.8343 0.1708 0.1432 0.107
rf Random Forest Regressor 2.4777 13.1299 3.5434 0.8311 0.1585 0.1257 0.783
lr Linear Regression 3.4096 23.6076 4.7780 0.7074 0.2249 0.1714 0.481
ridge Ridge Regression 3.3909 23.8042 4.7885 0.7055 0.2287 0.1714 0.027
br Bayesian Ridge 3.4111 24.4277 4.8448 0.6996 0.2331 0.1726 0.039
lar Least Angle Regression 3.5619 24.9114 4.9069 0.6911 0.2308 0.1774 0.040
huber Huber Regressor 3.3176 26.8915 5.0054 0.6771 0.2447 0.1646 0.096
en Elastic Net 3.7411 28.6580 5.2347 0.6632 0.2401 0.1819 0.027
lasso Lasso Regression 3.7372 29.0086 5.2582 0.6608 0.2414 0.1824 0.037
dt Decision Tree Regressor 3.4523 27.9222 5.1502 0.6517 0.2225 0.1738 0.035
omp Orthogonal Matching Pursuit 4.2817 34.6187 5.7817 0.5882 0.3069 0.2136 0.033
knn K Neighbors Regressor 4.5713 44.4640 6.5753 0.4332 0.2481 0.2097 0.078
par Passive Aggressive Regressor 6.5403 78.9600 8.7544 0.0046 0.4219 0.3282 0.031
llar Lasso Least Angle Regression 6.7711 87.2345 9.1953 -0.0331 0.3913 0.3672 0.029
dummy Dummy Regressor 6.7711 87.2345 9.1953 -0.0331 0.3913 0.3672 0.014
手法の比較も容易。compareすると、指定した条件で比較を行ってくれる。ここではR2の指標をもとにソートする。
modelの作成
# モデルを作成する
rf = create_model('rf', # ランダムフォレストでモデル化
fold = 10) # 交差検証10回(汎化性能の評価を行う際の分割数をセット)
rf
# 交差検証(クロスバリデーション)
# https://aiacademy.jp/media/?p=263
-----
MAE MSE RMSE R2 RMSLE MAPE
Fold
0 2.6951 17.7577 4.2140 0.8038 0.1707 0.1078
1 2.4529 11.0652 3.3264 0.9005 0.1622 0.1285
2 2.5246 11.3592 3.3703 0.8075 0.1525 0.1193
3 2.7081 22.7144 4.7660 0.6342 0.1783 0.1355
4 2.8522 21.2313 4.6077 0.7764 0.1977 0.1620
5 2.5445 11.2662 3.3565 0.9245 0.1736 0.1454
6 2.0312 6.8169 2.6109 0.8758 0.1411 0.1199
7 2.6908 14.6318 3.8252 0.8657 0.1668 0.1330
8 2.0722 5.9796 2.4453 0.9177 0.1153 0.0979
9 2.2050 8.4769 2.9115 0.8045 0.1271 0.1076
Mean 2.4777 13.1299 3.5434 0.8311 0.1585 0.1257
Std 0.2705 5.5197 0.7578 0.0825 0.0236 0.0183
先程modelsで確認した手法、もしくは比較した手法の短縮文字を指定すると、その手法でmodel化を行ってくれる。
今回はランダムフォレスト(rf)を使ってモデル化を行う。
よく使いそうな引数として、fold(交差検証の回数)を使用する。交差検証(クロスバリデーション)の回数を上げると処理時間がどんどん増えていく。
出力されるのは、交差検証の回数とそれに応じた各指標の推移。基本的には平均値を使って比較する。
チューニング
# ハイパーパラメータをチューニングする
tuned_rf = tune_model(rf,
optimize = 'r2', # 最適化する指標を指定
fold = 10)
tuned_rf
-----
MAE MSE RMSE R2 RMSLE MAPE
Fold
0 3.0067 24.7128 4.9712 0.7270 0.1684 0.1143
1 2.6783 13.3939 3.6598 0.8796 0.1554 0.1315
2 2.1061 6.9402 2.6344 0.8824 0.1195 0.1020
3 2.3236 9.8265 3.1347 0.8417 0.1271 0.1076
4 3.4036 34.1707 5.8456 0.6401 0.2276 0.1853
5 2.9022 13.4361 3.6655 0.9100 0.1628 0.1463
6 2.0842 6.3144 2.5128 0.8850 0.1483 0.1268
7 3.1428 20.3447 4.5105 0.8132 0.1911 0.1512
8 2.2145 8.1430 2.8536 0.8879 0.1199 0.0996
9 2.1484 7.7533 2.7845 0.8211 0.1366 0.1107
Mean 2.6010 14.5036 3.6573 0.8288 0.1557 0.1275
Std 0.4628 8.7160 1.0621 0.0807 0.0323 0.0256
醍醐味、ハイパーパラメータのチューニングもtune_modelだけで実行してくれる。最適化したい指標と、交差検証の回数を指定して実行する。
今回は逆にスコアが微減した。そういうこともある。
チューニングを続ける
tuned_rf = tune_model(rf,
optimize = 'r2',
fold = 10,
n_iter = 50) # パラメータ探索の繰り返し回数の指定
tuned_rf
-----
MAE MSE RMSE R2 RMSLE MAPE
Fold
0 2.6705 17.5881 4.1938 0.8057 0.1576 0.1073
1 2.6953 13.2585 3.6412 0.8808 0.1559 0.1325
2 2.0749 6.7700 2.6019 0.8853 0.1212 0.1030
3 2.3891 10.1788 3.1904 0.8361 0.1330 0.1136
4 3.1798 27.4997 5.2440 0.7104 0.2158 0.1802
5 2.7368 11.4151 3.3786 0.9235 0.1550 0.1404
6 2.0337 5.9824 2.4459 0.8910 0.1445 0.1230
7 3.0874 19.6551 4.4334 0.8196 0.1879 0.1477
8 2.1652 7.3241 2.7063 0.8992 0.1150 0.0972
9 2.1644 7.5394 2.7458 0.8261 0.1322 0.1105
Mean 2.5197 12.7211 3.4581 0.8478 0.1518 0.1255
Std 0.3952 6.5987 0.8731 0.0590 0.0292 0.0240
チューニングでスコアが下がってしまったので、探索の繰り返し回数を増やしてみる。n_iterを50に指定すると、探索時間は超伸びるがスコアは改善された。
いったんここまで。