Kaggle Tutorial

【House Prices】欠損処理・特徴量・回帰モデル・提出

多数の欠損とカテゴリを処理し、回帰モデルで House Prices の submission を作って提出します。

多くの欠損とカテゴリに対処する#

House Prices は特徴量が約 80 と多く、欠損もカテゴリも多数あります。 Pipeline と ColumnTransformer でまとめて処理すると、データリークなく安全に扱えます。

import numpy as np
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder

train = pd.read_csv("/kaggle/input/house-prices-advanced-regression-techniques/train.csv")
test = pd.read_csv("/kaggle/input/house-prices-advanced-regression-techniques/test.csv")

y = np.log1p(train["SalePrice"])
X = train.drop(columns=["Id", "SalePrice"])
X_test = test.drop(columns=["Id"])

num_cols = X.select_dtypes("number").columns
cat_cols = X.select_dtypes("object").columns

pre = ColumnTransformer([
    ("num", SimpleImputer(strategy="median"), num_cols),
    ("cat", Pipeline([
        ("imp", SimpleImputer(strategy="most_frequent")),
        ("oh", OneHotEncoder(handle_unknown="ignore")),
    ]), cat_cols),
])

handle_unknown="ignore" で、test にしかない水準が来ても落ちないようにします。

回帰モデルで学習・提出#

from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import cross_val_score

model = Pipeline([("pre", pre), ("gbr", GradientBoostingRegressor(random_state=42))])

# 評価指標(log スケールの RMSE)で CV
scores = cross_val_score(model, X, y, cv=5, scoring="neg_root_mean_squared_error")
print(f"CV RMSE(log): {-scores.mean():.4f}")

model.fit(X, y)
pred = np.expm1(model.predict(X_test))   # expm1 で価格スケールへ戻す

submission = pd.DataFrame({"Id": test["Id"], "SalePrice": pred})
submission.to_csv("submission.csv", index=False)

ヒント

目的変数を対数化したので、CV も log スケールの RMSE で測るとコンペの評価指標と一致します。 scoring をコンペ指標にそろえるのが、CV を信頼する近道です。

理解度チェック#

Quiztest にしか現れないカテゴリ水準があってもエラーで落ちないようにする OneHotEncoder の設定は?

次のステップ#

次は特徴量を強化し、複数モデルを束ねるアンサンブルの入口に進みます。