Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

Pythonで機械学習(kaggle入門その4)

はじめに

以前取り組んだ「House Prices: Advanced Regression Techniques」のモデルの構築、予測について、 XGBoostを試してみました。

XGBoostとは

勾配ブースティングとランダムフォレストを組み合わせたアンサンブル学習モデルのフレームワークです。
アンサンブル学習は、複数の学習器を使用してそれらの予測結果を統合することで、汎化性能(精度)を向上させます。
Kaggle内でも安定して良い精度を期待できるとして非常に多く使用されています。

モデル作成及びスコアリング

予めXGBoostをpip install xgboost 等でインストールしておきます。

# xgboostをインポート
import xgboost as xgb
# XGBoostモデル作成
xg_boost = xgb.XGBRegressor(colsample_bytree=0.8, subsample=0.5,
                            max_depth=3)

# 訓練用データの説明変数と目的変数にて学習
xg_boost.fit(x_train, y_train)

パラメータはいろいろチューニングできますが、今回は主要なパラメータの以下を設定しました。

  • colsample_bytree:0.8(各木においてランダムに抽出される列の割合)
  • subsample:0.5(各木においてランダムに抽出される標本の割合)
  • max_depth:3(木の深さの最大値)
# feature_importances_関数で特徴量の重要度を確認
rank = np.argsort(-xg_boost.feature_importances_)
sns.barplot(x=xg_boost.feature_importances_[rank], y=x_train.columns.values[rank], orient='h')
plt.title('Feature Importance')
plt.tight_layout()
plt.show()

f:id:jspnet:20191118184817p:plain

# モデルにテストデータを投入し予測
y_pred = xg_boost.predict(x_test)
Id = np.array(test["Id"]).astype(int)
result = pd.DataFrame(y_pred, Id, columns = ["SalePrice"])

# 予測データの確認
result.head(10)
SalePrice
1461 128155.429688
1462 155419.015625
1463 150589.531250
1464 170318.640625
1465 209070.265625
1466 169684.640625
1467 158735.265625
1468 159577.421875
1469 186008.296875
1470 117567.906250
# 予測データをCSVファイルに出力
result.to_csv("xgboost_result.csv", index_label = ["Id"])

予測データの提出&スコア確認

予測データを提出したところ、結果は「0.17018」で前回のランダムフォレストの「0.22419」から大幅に良くなりました。
パラメータチューニング等すれば、まだまだ改善する余地はありそうですが、また今度に。
また、XGBoostと並んでKaggleの上位ランカーもよく使用しているLightGBMについても気になるので今後試してみたいと思います。