はじめに
sklearnのRandomForestRegressorには、決定木の追加毎にどれだけ性能が向上したか表示するための機能がないようです。
パラメータ変更による学習結果の確認や、学習の経過をたどりたい場合に困ります。
今回はモデルの学習時に決定木を一本ずつ足していき、モデルによるテストデータの予測値と正解データの平均二乗誤差を都度取得することで、決定木の追加毎のモデルの精度向上を追う方法を紹介します。
コード
X_train、y_trainは学習データ、X_test、y_testはテストデータのpandas DataFrameとします。
rf = RandomForestRegressor(
n_estimators = 1, # 最初の木は1本
warm_start = True, # 前回までの学習内容を記憶する
random_state = 0,
n_jobs = -1 # 全てのコアを使用
)
max_trees = 100 # 最終的な決定木の本数
trees = []
mses = []
for i in range(1,max_trees+1):
rf.n_estimators = i # イテレーション毎に決定木の総本数を更新
rf.fit(X_train,y_train) # 学習
y_pred = rf.predict(X_test) # 予測値の取得
mse = mean_squared_error(y_test,y_pred) #平均二乗誤差の取得
trees.append(i)
mses.append(mse)
# プロット
plt.figure(figsize=(10, 6))
plt.plot(trees, mses, marker='o', linestyle='-')
plt.title('MSE in Random Forest')
plt.xlabel('Number of Trees')
plt.ylabel('MSE')
plt.grid(True)
plt.show()
イテレーション毎にn_estimators(モデルに含まれる決定木の本数)をiに更新し、決定木を1本増やしています。
この時、warm_startパラメータをTrueとすることで、それまでの学習内容を保持しています。これによって、学習済みの決定木が再利用され、イテレーション毎に決定木1本分だけ学習をすれば良いことになります。
また決定木の内容を引き継ぐので、平均二乗誤差の変化を正しく追うことができるようになります。
免責事項
より効率の良い方法がある可能性は高いです。
こんなことしなくても取得できる方法あったりしたらぜひご教授ください。