0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Kaggle初級】House Pricesで0.1283達成までの試行錯誤まとめ(RandomForest → LightGBM)

Posted at

House Prices回帰タスク:ランダムフォレストからLightGBMへ——試行錯誤の記録とスコア改善

Kaggleの回帰コンペ「House Prices - Advanced Regression Techniques」に取り組み、スコアを 0.14465 → 0.1283(RMSLE) にまで改善しました。この記事では、ランダムフォレストから始めて、特徴量エンジニアリングや前処理、LightGBMへの切り替えなど、試行錯誤のプロセスを中級者向けに紹介します。

💡 House Pricesコンペの評価指標は Root Mean Squared Log Error(RMSLE) です。対数変換された予測値と実測値の誤差を元にスコアが算出されるため、0.1283 という値は RMSLE を意味しており、RMSE とは異なります。

はじめに

このコンペの目的は、住宅価格を予測すること。データは数値やカテゴリ型が混在しており、適切な前処理と特徴量設計が求められます。

ステップ1:ベースライン(スコア 0.14465)

まずはRandomForestRegressorで学習。

from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
model.fit(X, y)
  • 欠損補完は .fillna(0)
  • カテゴリは LabelEncoder で数値化

反省:カテゴリに順序があると誤解されやすく、汎化性能が弱かったです。


ステップ2:LightGBM導入(スコア 0.15059)

LGBMRegressor に変更し、モデルの汎化性能が向上。

from lightgbm import LGBMRegressor
model = LGBMRegressor()
model.fit(X, y)

一部のカテゴリを pd.get_dummies() で変換。初期段階としては悪くない結果。


ステップ3:欠損値補完の改善(スコア 0.15340)

  • object型 → "None"
  • 数値型 → median
for col in all_data.columns:
    if all_data[col].dtype == "object":
        all_data[col] = all_data[col].fillna("None")
    else:
        all_data[col] = all_data[col].fillna(all_data[col].median())

反省:この段階で特徴量数を絞りすぎて情報損失が発生。


ステップ4:特徴量エンジニアリング(スコア 0.15006)

以下のような派生特徴量を追加:

  • TotalSF: 地下+1F+2Fの面積合計
  • HouseAge: 築年数
  • RemodAge: 改築後年数
  • TotalBathrooms: 全バスルーム合算
  • TotalPorchSF: 全ポーチ面積
  • HasPool: プール有無(0/1)
all_data["TotalSF"] = all_data["TotalBsmtSF"] + all_data["1stFlrSF"] + all_data["2ndFlrSF"]
all_data["HouseAge"] = all_data["YrSold"] - all_data["YearBuilt"]
# 他略

ステップ5:One-Hot全適用 + 外れ値除去(スコア 0.1283)

  • 全カテゴリ変数に get_dummies()
  • 外れ値を GrLivArea > 4000 & SalePrice < 300000 で除外
  • 目的変数に log1p() を使って正規化
final_model = LGBMRegressor(
    n_estimators=3000,
    learning_rate=0.01,
    num_leaves=32,
    colsample_bytree=0.7,
    subsample=0.7,
    max_depth=6,
    reg_alpha=0.1,
    reg_lambda=0.1,
    random_state=42
)
final_model.fit(X, y)

結果

最終的に スコア 0.1283(RMSLE) を達成。Feature Engineering + LightGBM + log変換の組み合わせが効果的でした。


まとめと学び

ランダムフォレスト vs LightGBMの特徴比較

モデル ランダムフォレスト LightGBM
学習アルゴリズム バギング(複数の決定木の平均) 勾配ブースティング(決定木の連続構築)
精度 初期モデルとして安定(過学習に強い) 高精度だがチューニング次第で過学習の可能性あり
訓練速度 遅め(並列化されるが全木構築が必要) 非常に高速(Leaf-wiseのアルゴリズム)
ハイパーパラメータ 少なめで扱いやすい 多めでチューニングが必要
特徴量重要度 解釈性が高い(feature_importances_で確認可) 同様に確認可能だが、モデルが複雑な場合は注意が必要

このように、ランダムフォレストは初期段階で使いやすく、LightGBMは最適化すれば高性能を発揮するため、回帰タスクではLightGBMが最終的に優位となることが多いです。

  • LabelEncoder は分類用。回帰にはOne-Hot推奨
  • 欠損値処理は「意味を考える」ことが大事
  • 特徴量削減は慎重に。削りすぎ注意
  • log変換は右に偏るデータに効果的

今後は、Optunaなどを使ってハイパーパラメータの自動最適化や、Stackingによるアンサンブルなどにも挑戦したいと思います。


ご覧いただきありがとうございました!Kaggleに取り組む方の参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?