ランダムフォレスト① (構築・評価)

ランダムフォレスト

ランダムフォレストとは、決定木を複数生成して、それぞれの結果を総合的に判断して学習を行うアルゴリズムです。

単純な決定木ではテストデータに対して比較的高精度で予測はできていましたが、過学習に陥りやすいという問題がありました。

その問題を解消するためにランダムフォレストでは、それぞれの決定木で過学習が起きてしまうことを前提に異なる決定木モデルを複数生成し、それぞれの結果の平均をとることで、予測精度は保ちつつ過学習を抑制しようという仕組みとなっています。

複数のモデルを組み合わせて、高精度なモデルを作る手法のことをアンサンブル法と言います。

ランダムフォレストモデル構築

ランダムフォレストモデルの構築を行います。

scikit-learnRandomForestRegressorクラスを使用します。

[Google Colaboratory]

1
2
3
from sklearn.ensemble import RandomForestRegressor

rf = RandomForestRegressor(n_estimators=10, max_depth=20, random_state=0).fit(X_train,y_train)

n_estimatorsは、ランダムフォレストのハイパーパラメータの1つで、生成する決定木の数を指定します。(3行目)

[実行結果]

残差プロット

予測値を算出し、結果を残差プロットで表示します。

[Google Colaboratory]

1
2
3
4
5
6
7
y_train_pred = rf.predict(X_train)
y_test_pred = rf.predict(X_test)

y_train_pred = np.expand_dims(y_train_pred, 1)
y_test_pred = np.expand_dims(y_test_pred, 1)

residual_plot(y_train_pred, y_train, y_test_pred, y_test)

[実行結果]

一部大きく外れているものもありますが、かなり良く予測できています。

精度評価スコア

最後に精度評価スコアを表示します。

[Google Colaboratory]

1
2
3
4
print("訓練データスコア")
get_eval_score(y_train,y_train_pred)
print("テストデータスコア")
get_eval_score(y_test,y_test_pred)

[実行結果]

テストデータのR2スコアが0.75となり、単純な決定木データよりは良い結果となりました。

また、単純な決定木でmax_depthを20にした場合は過学習に陥っていましたが、ランダムフォレストでは10本の決定木の平均をとっているため、過学習には陥っていません。