PyCaretを使った回帰分析(regression)

便利な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に指定すると、探索時間は超伸びるがスコアは改善された。

いったんここまで。

このサイトの主
投稿を作成しました 98

関連投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る