Pythonでデータサイエンスを試す(回帰をランダムフォレストで)

ランダムフォレストは決定木と同様に、回帰にも使用可能です。

と言うわけで重回帰分析と比較してみます。 ▼重回帰分析はこちら esu-ko.hatenablog.com

ランダムフォレスト回帰を試す

分類に使うときのコードは以下に書いていますが、ランダムフォレスト回帰は使用するオブジェクトが異なります。 esu-ko.hatenablog.com

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score

df = #いい感じに読み取ったデータ

rf = RandomForestRegressor(criterion='mse')
rf.fit(y=df['Revenue'],X=df.loc[:,['CM','Temp','Firework']])


#結果の確認1:R^2
r2_score(df2['Revenue'],rf.predict(df2.loc[:,['CM','Temp','Firework']]))
#0.9137855518142957

#結果の確認2:特徴量の強さ
rf.feature_importances_
#array([0.18285262, 0.62781003, 0.18933735])

結果をみてみると、R2はさすがです。
また重回帰分析で帰ってくる回帰係数とランダムフォレストで得られる特徴重要度は全く別なため、数値を比較してもしょうがありません。

回帰係数は、その変量を一単位動かした場合の結果への影響、であるのに対し、特徴重要度はあくまで、変数間の影響度の違いになります。
(特徴重要度は足すと1になります。)

ここでは、CMとFireworkは同じくらいの影響度ですが、Tempは相対的に非常に強い影響を与えることがわかります。

回帰係数はそのままだと、変数間の相対比較ができないで、特徴量の影響を比較したい場合はこちらの方が良いかもですね。

汎化の話

一応、splitしてみておきます

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(
    df.loc[:,['CM','Temp','Firework']],
    df['Revenue'],
    test_size=0.3)

rf = RandomForestRegressor(criterion='mse')
rf.fit(y=y_train,X=X_train)

#未知のデータの確認
r2_score(y_test,rf.predict(X_test))
#0.25862096942908197

うん、低いね、と。
実務でもランダムフォレスト回帰は汎化が難しい、と言う印象なのですが、この辺どうなってるのか、知りたいなあ、と。