House Prices – Advanced Regression Techniques: ゼロからの高度な回帰分析

House Prices – Advanced Regression Techniques: ゼロからの高度な回帰分析

前回の「Housing Prices Competition for Kaggle Learn Users」(入門編)に続き、今回は本家「House Prices – Advanced Regression Techniques」に挑戦しました。使っているデータは入門編とほぼ同じ(train.csv / test.csv / submission形式)ですが、評価指標とスコア競争の厳しさが全く違い、入門編で書いたコードをそのまま持ち込んだだけでは通用しませんでした。この記事はその「思ったより甘くなかった」過程の記録です。

2つのHouse Pricesコンペの違い

まず整理しておくと、Kaggleには似た名前のコンペが2つあります。

項目Kaggle Learn Users(入門編)Advanced Regression(本家)
想定ユーザー完全初心者初級〜中級以上
スコア競争ほぼ無しあり(厳しいLB競争)
特徴量工夫最小限超重要
CV設計不要ほぼ必須
よく使うモデルLinear / RFLGBM / XGB / CatBoost
学習価値流れ理解Kaggle力が伸びる

使うデータはほぼ同じでも、求められる「本気度」と「技術レベル」が全く異なります。初心者の多くが入門編の感覚のまま本家に挑み、スコアが伸び悩むそうです。まさに自分がそのパターンでした。

評価指標の罠:RMSEとRMSLE

入門編ではRMSE(二乗平均平方根誤差)で評価されていましたが、本家Advancedの評価指標はRMSLE(対数を取ってからの二乗平均平方根誤差)です。似ているようで、実は性質が全く違います。

物件真値予測RMSE視点の誤差RMSLE視点の倍率
豪邸1,000万円900万円100万円0.9倍
小屋100万円0円100万円0.0倍

RMSEは「価格のズレ(絶対誤差)」をそのまま評価するため、この2件はどちらも同じ「100万円の誤差」として扱われ、高価格・低価格を区別しません。一方RMSLEは対数の差、つまり「倍率のズレ」を測るため、小屋の予測が外れたときの方が厳しく評価されます。

なぜ住宅価格にはRMSLEなのか

住宅価格は数十万円から数千万円まで幅があり、しかも右に長く歪んだ分布をしています。RMSEをそのまま使うと、少数の超高額物件の誤差だけでスコア全体が支配されてしまいます。RMSLEは倍率評価に変換することで、この不平等を是正しているというわけです。

まずは入門編のコードをそのまま持ち込んでみる

入門編では、LightGBMの軽量ベースライン(17,203)から始めて、全特徴+One-HotのLightGBM(14,638)、カテゴリを直接扱えるCatBoost(13,291)と進み、ブレンドの失敗(13,595)とMAE学習の崩壊(15,224)を経て、depthチューニングで13,118まで詰めました。

この過程で学んだ教訓は3枚のカードに整理できます。ブレンドは「弱いモデルが足を引っ張る」形で悪化し(13,595)、評価指標と学習ロスの不整合で予測が崩壊し(15,224)、depth=6が表現力と過学習抑制のバランスが取れたスイートスポットでした(13,118)。

決定的なズレ:評価基準とCV設計

この13,118のコード(catboost_depth=6)をAdvanced向けにそのまま持ち込むとどうなるか。設計思想自体は入門編と同じで、log1p学習、CatBoostのカテゴリ直接処理、TotalSFやHouseAgeなどの派生特徴量、KFold averagingとひと通り揃っています。ですが、決定的なズレが2つありました。

1つ目は評価基準がRMSE(価格空間)のままだったこと。2つ目はKFoldの分割が「価格分布を無視」していたことです。真のボトルネックはモデルではなく、検証(CV)の設計にありました。

そこで評価をRMSLE CVに変更し、さらに価格分布を考慮した分割であるStratified CVを導入しました。これでようやく真の競争領域、0.12〜0.15のRMSLE空間での闘いに入れる状態になったわけです。

想定スコアと実測:0.12306まで到達

改善段階ごとの想定スコアを整理すると、次のようになります。

改善段階想定Public RMSLE
ほぼそのまま(RMSE評価のまま)0.14〜0.15
RMSLE CVに修正0.12〜0.13
Stratified CV導入0.11〜0.12
微調整(depth / feature)0.10〜0.11

実際にRMSLE整合・Stratified CVで書き直したCatBoostコード(advanced_catboost_rmsle_stratified)を実行時間4.66分で回したところ、Public LBは0.12306。「House Prices 初〜中級の完成形」と言えるスコア帯に到達しました。単一モデル・depth=6(過学習抑制寄り)・定番の派生特徴量のみ、Stacking / Blendingなしという構成での結果です。

アンサンブルに挑戦:ElasticNet・Lasso・Ridge・SVR・CatBoost

ここからさらに0.12を切りに行くため、複数モデルのアンサンブルを試しました。ElasticNet、Lasso、Ridge、SVR、CatBoostのOOF(Out-of-Fold)予測をRidgeでメタモデリングするという構成です。各モデルのOOF RMSLEは次の通りでした。

モデルOOF RMSLE実行時間
ElasticNet0.109910.02分
Lasso0.109890.02分
Ridge0.110930.01分
SVR0.113790.08分
CatBoost0.118119.47分
Meta(Ridge)0.108200.00分

OOFだけ見るとMetaモデルの0.10820は好スコアに見えますが、実際のPublic LBは0.12303。0.12306からわずかに上がっただけで、計算コストに見合わない非効率さでした。結果的に、単体のCatBoostが既に予測の大部分を担っていたことが判明した形です。CatBoost単体をさらに上げるチューニングも試しましたが良い結果にならず、もとのCatBoost(0.12306)がそれなりに良かったのだと思われます。今回はここまでで一区切りとしました。

スコア階層で見る現在地

今回たどり着いた0.123というスコアが、このコンペ全体のどのあたりに位置するのかを整理しておきます。

TierRMSLE目安
Tier 1≦ 0.09上位勢 / アンサンブル極限
Tier 20.10〜0.11強力な単一モデル / 高度な微調整
Tier 30.12〜0.15中級者・上位志向 / 手堅い単一モデル(今回はここ)
Tier 40.15〜0.20初〜中級者中心 / ベースライン層
Tier 5> 0.20基礎的モデル中心 / 初心者

0.123は「House Prices 初〜中級の完成形」というポジションで、Tier 3のちょうど中心あたり。上位数%が争うTier 1(0.09以下)にはまだ距離がありますが、そこには明確な理由がありました。

上位1%(0.06台)は別次元

上位勢が0.06台を出すためにやっていることを覗いてみると、次のような「非常識な」アプローチが並んでいました。

  • Complex Stacking — 単純な平均ではなく、LGBM・CatBoost・ElasticNetの高度なメタモデリング
  • 手動外れ値調整 — データ分布を目視確認し、ドメイン知識に基づく緻密なノイズ排除
  • Target Encoding / Ordinal Mapping — カテゴリ変数のより攻撃的で高度な数値変換
  • Private LB Overfitのリスク許容 — Public順位を犠牲にしてでも、Privateでの跳ね上がりを狙う攻めの設計

0.12の壁を越えてKaggle上位層へ食い込むには、単純なアンサンブルの積み増しではなく、こうした一歩踏み込んだ設計判断が必要になるようです。今回はそこまでは踏み込まず、「評価指標とCV設計を正しく合わせれば、単一モデルでも0.123まで届く」というところまでを確認できました。

まとめ

今回の教訓は、モデルの強さよりも先に「評価指標(RMSE vs RMSLE)」と「検証(CV)の設計」を競技のルールに合わせることが最優先だったという点に尽きます。入門編のコードをそのまま持ち込んだだけでは0.14〜0.15止まりだったはずが、RMSLE CV化とStratified CVの導入だけで0.12306まで一気に縮まりました。アンサンブルは今回の条件では伸びしろが小さく、次に狙うならStacking・手動外れ値調整・Target Encodingといった、より踏み込んだ技を試すことになりそうです。ChatGPT 5.2と一緒にKaggle環境で実行しています。コードとCSVはhouse-advanced-code-csv、スライドはhouse-learn-advanced-v01・Advanced_House_Prices_Blueprintとしてこの記事の下に添付しています。

ML/AI/Kaggleカテゴリの最新記事