概要
大した内容ではありません。
2ヶ月くらい前に下書きした内容なのですが、削除するくらいなら公開しようと思いました。
この記事では機械学習の初心者レベルの実験をしています。
https://qiita.com/katsu1110/items/a1c3185fec39e5629bcb
↑このページを参考にしています。勉強になりました。
欠損値などを自分の考えできれいにしたりして、ランダムフォレストの分類器に入れて、評価をしました。
logを使ってターゲットの列を正規分布にしたら、どのくらい効果があるのか
これが、今回の記事の目的です。これ以外の作業は一切修正しないで、結果を比較してみようという考えです。
#RandomForestで学習させる
from sklearn.ensemble import RandomForestRegressor
rdf = RandomForestRegressor(n_estimators=200, max_depth=5, max_features=0.5, random_state=449, jobs=-1)
clf = rdf.fit(x_train, y_train)
print('train: {:.4%}'.format(clf.score(x_train, y_train)))
print('test : {:.4%}'.format(clf.score(x_test, y_test)))
y_pred_train = rdf.predict(x_train)
y_pred_test = rdf.predict(x_test)
from sklearn.metrics import r2_score
print("trainのR2 : {:.4%}".format(r2_score(y_train, y_pred_train)))
print("test のR2 : {:.4%}".format(r2_score(y_test , y_pred_test)))
# 平均絶対誤差(MAE)
from sklearn.metrics import mean_absolute_error
print("trainの平均絶対誤差(MAE) : {:.4f}".format(mean_absolute_error(y_train, y_pred_train)))
print("test の平均絶対誤差(MAE) : {:.4f}".format(mean_absolute_error(y_test , y_pred_test )))
# 平方根平均二乗誤差(RMSE)
from sklearn.metrics import mean_squared_error
print("trainの平均二乗誤差(RMSE): {:.4f}".format(np.sqrt(mean_squared_error(y_train, y_pred_train))))
print("test の平均二乗誤差(RMSE): {:.4f}".format(np.sqrt(mean_squared_error(y_test , y_pred_test ))))
# RMSLE (Root Mean Squared Logarithmic Error)
# 外れ値に強い
from sklearn.metrics import mean_squared_log_error
print("trainのRMSLE : {:.4f}".format(np.sqrt(mean_squared_log_error(y_train, y_pred_train))))
print("test のRMSLE : {:.4f}".format(np.sqrt(mean_squared_log_error(y_test , y_pred_test ))))
このようにやりました。
そして、ターゲットをlogを使わないで出てきた結果はこのようになりました。
trainの正解率 (Accuracy): 91.4618%
test の正解率 (Accuracy): 83.6505%
trainのR2 : 91.4618%
test のR2 : 83.6505%
trainの平均絶対誤差(MAE) : 16175.1998
test の平均絶対誤差(MAE) : 19230.9896
trainの平均二乗誤差(RMSE): 22927.9516
test の平均二乗誤差(RMSE): 33601.6305
trainのRMSLE : 0.1432
test のRMSLE : 0.1511
これに対して、ターゲットをlogを使って正規分布に疑似化した場合は、以下のようになりました。
trainの正解率 (Accuracy): 90.5080%
test の正解率 (Accuracy): 86.0260%
trainのR2 : 90.5080%
test のR2 : 86.0260%
trainの平均絶対誤差(MAE) : 0.0893
test の平均絶対誤差(MAE) : 0.0990
trainの平均二乗誤差(RMSE): 0.1238
test の平均二乗誤差(RMSE): 0.1455
trainのRMSLE : 0.0096
test のRMSLE : 0.0111
なんか、評価の数値が全然ちがう結果になっているところがありますが、MAEはlogにしているからだと思いますが、RMSLEがぜんぜん違うのは、ちょっと意味不明です。(何か間違っていると思いますが、とりあえず記事にしてしまいました。)
結果
以上の評価結果で、提出ファイルを作って提出したところ、
ターゲットにlogを使わないで学習させた場合の結果は、
RMSLE 0.17481 4,635チーム中3591位でした。
これに対して、ターゲットにlogを使って学習させた場合の結果は、
RMSLE 0.16123 4,635チーム中3277位でした。
ということで、ターケットの正規化は効果ありということを確認出来ました。