PyCaretは、対話型のIDEであるJupyter Notebook、Jupyter Lab、 Google Colaboratory等での使用を推奨しています。そのため、コマンドライン(CUI)ではエラーで動作ストップする場合もいくらか遭遇します。そこで、本記事ではCUIで実行する場合でも、それに近いことをできるような雛形コードを載せました。具体的には、各モデルのハイパーパラメータの自動調整とその結果をひとつの画像ファイルでグラフ出力することで比較できるようにしました。更に、各々の回帰モデルをオブジェクトファイル(.pkl)で保存します。また、それを読み込む方法の雛形コードを記載しています。
本コードで分析したデータは、機械学習の回帰分析用でお馴染みのボストンデータセットのcsvファイルを使用した。csvファイルの作成例は次のリンクです。Python scikit-learn付属のボストン市の住宅価格データ(Boston house prices dataset)をcsvファイル化する - PythonとVBAで世の中を便利にする
▼ 下図は、モデル別の適合度R2の図です。ハイパーパラメータは自動調整しています。左上から右へ順に、線形重回帰(このパラメータは一意的に決まる)、ラッソ回帰、リッジ回帰、ランダムフォレスト回帰、Gradient Boosting回帰、xgboost回帰、LightGBMです。前者3つは線形回帰モデルで、それ以降は非線形回帰モデルです。ランダムフォレスト以降の非線形回帰モデルの適合度は85%以上と高めです。

▼下図は、モデル別に誤差をプロットした図です。前半3つの線形回帰モデルは±10以上の誤差幅です。一方、後半の非線形回帰モデルの誤差は±5程度と比較的小さいことがわかります。

▼下図は、学習過程をプロットした図です。一つ目が空欄なのは、線形重回帰モデルでパラメータは一意的に決まるためにグラフがありません。ランダムフォレスト、XGBR、LGBMは、学習している様子がわかります。

■本プログラム
ハイパーパラメータを自動調整してオブジェクトファイルで保存する。また、それを読み込む雛形コードを記載しています。
import os
import pandas as pd
import pandas_profiling as pdp
from pycaret.regression import *
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d")
def read_csv_func(mytarget, myfeature_list_for_graph_plot):
df = pd.read_csv(file_path,
header=0,
encoding='utf-8')
describe_data = df.describe()
describe_data.to_csv(file_name + '_describe.csv',
sep=',',
index=True,
encoding='utf-8')
plt.subplots_adjust(left=0.1, right=0.95, bottom=0.1, top=0.95)
df.hist()
plt.tight_layout()
plt.savefig('_hist.png')
plt.close()
myprofile = pdp.ProfileReport(df)
myprofile
myprofile.to_file(file_name + "_ProfileReport.html")
df2 = df.loc[:, myfeature_list_for_graph_plot]
sns.set_context('talk')
mypairplot = sns.pairplot(df2,
kind="reg",
markers=".",
diag_kind="kde",
diag_kws=dict(shade=True),)
plt.tight_layout()
plt.savefig('_pairplot.png')
plt.close()
feature_name_list = df.columns.values.tolist()
feature_name_list.remove(mytarget)
return df, feature_name_list
def plot_model_func(tuned_model_list):
cnt = len(tuned_model_list)
cols = 3
rows = cnt // cols
rows += cnt % cols
fig = plt.figure(1, figsize=(12,10),dpi=200)
for i, auto_tuned_reg in enumerate(tuned_model_list, start=1):
try:
ax = fig.add_subplot(rows, cols, i)
plot_model(auto_tuned_reg, plot = 'vc')
except:
pass
plt.tight_layout()
plt.savefig('_vc.png')
plt.close()
fig = plt.figure(1, figsize=(12,10),dpi=200)
for i, auto_tuned_reg in enumerate(tuned_model_list, start=1):
try:
ax = fig.add_subplot(rows, cols, i)
plot_model(auto_tuned_reg, plot = 'error')
except:
pass
plt.tight_layout()
plt.savefig('_error.png')
plt.close()
fig = plt.figure(1, figsize=(15,10),dpi=200)
for i, auto_tuned_reg in enumerate(tuned_model_list, start=1):
try:
ax = fig.add_subplot(rows, cols, i)
plot_model(auto_tuned_reg, plot = 'residuals')
except:
pass
plt.tight_layout()
plt.savefig('_residuals.png')
plt.close()
def load_model_func(load_model_file):
load_reg_model = load_model(load_model_file)
print(load_model_file)
for i, data in enumerate(load_reg_model):
print(i, data)
with open(load_model_file + '.csv', 'a') as f:
buf = str(i) + ',' + str(data)
f.write(buf + '\n')
plot_model(load_reg_model, plot = 'parameter')
return load_reg_model
def main():
df, feature_name_list = read_csv_func(mytarget, myfeature_list_for_graph_plot)
mydata = setup(data = df,
normalize = False,
train_size = 0.7,
session_id = 1,
target = mytarget,
numeric_features = feature_name_list,
silent=True)
train_x_df = mydata[2]
print(train_x_df)
test_x_df = mydata[3]
print(test_x_df)
lr = create_model('lr', verbose = False)
lasso = create_model('lasso', verbose = False)
ridge = create_model('ridge', verbose = False)
rf = create_model('rf', verbose = False)
gbr = create_model('gbr', verbose = False)
xgboost = create_model('xgboost', verbose = False)
lgbm = create_model('lightgbm', verbose = False)
model_list = [lr, lasso, ridge, rf, gbr, xgboost, lgbm]
tuned_model_list=[]
for mymodel in model_list:
tuned_model_list.append(tune_model(mymodel,
fold = 10,
round = 4,
n_iter = 10,
optimize = 'MAE',
verbose = False))
plot_model_func(tuned_model_list)
model_file_name_list = []
for i, auto_tuned_reg in enumerate(tuned_model_list, start=1):
mystr = str(auto_tuned_reg)
model_name = mystr[:mystr.find(r'(')]
save_name = now + '_' + model_name
save_model(auto_tuned_reg, model_name = save_name)
model_file_name_list.append(save_name)
load_model_list = []
for i, mymodel in enumerate(model_file_name_list):
load_model = load_model_func(mymodel)
load_model_list.append(load_model)
if __name__ == "__main__":
file_path = './boston_dataset.csv'
file_name = os.path.splitext(os.path.basename(file_path))[0]
mytarget = 'PRICE'
myfeature_list_for_graph_plot = ['RM', 'CRIM', 'LSTAT', 'PTRATIO', 'PRICE']
main()
print('finished')
以上
<広告>
リンク