やみとものプログラミング日記 やみとものプログラミング日記
TOP 【Kaggleライブラリ】XGBoost回帰の雛形コード(House Prices用)
【Kaggleライブラリ】XGBoost回帰の雛形コード(House Prices用)

【Kaggleライブラリ】XGBoost回帰の雛形コード(House Prices用)

Kaggle
作成日時: 2020年2月4日(火) 13時07分
更新日時: 2020年2月4日(火) 16時30分

Kaggleの「House Prices」やってみた

モデルにはXGBoostを使った。

まずは分かりやすさを優先したかったので、使用した特徴量は次の5つだけ。


  "YearBuilt",  # 建設日

  "MSSubClass",  # 建物の等級

  "LotArea",   # 敷地面積

  "YrSold",    # 販売年

  "MoSold",    # 販売月


手元で計算したCVは約0.265。

Public Leaderboardのスコアは0.26645だった。

CVとスコアがほぼ同じなのでバリデーションはうまくできている模様。


次は特徴量の数を増やして実験。


def xgb_reg(tr_x, va_x, tr_y, va_y, te_x):
    import xgboost as xgb
    import numpy as np
    from sklearn.metrics import mean_squared_error
    
    dmat_train = xgb.DMatrix(tr_x, label=tr_y)
    dmat_valid = xgb.DMatrix(va_x, label=va_y)
    dmat_test = xgb.DMatrix(te_x)
    
    params = {"objective": "reg:linear"}
    num_round = 50
    
    # 学習を行う
    model = xgb.train(params, dmat_train, num_round)
    
    # 検証データに対して予測値を計算する
    va_pred = model.predict(dmat_valid)
    
    # 検証データの精度を計算する
    rmse = np.sqrt(mean_squared_error(va_y, va_pred))
    rmse_log = np.sqrt(mean_squared_error(np.log(va_y), np.log(va_pred)))
    
    # テストデータに対するこのモデルの予測値を返す
    pred = model.predict(dmat_test)
    
    return {
        "model": model,
        "pred": pred,
        "rmse": rmse,
        "rmse_log": rmse_log
    }


import pandas as pd
import xgboost as xgb
from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
%matplotlib inline


df_train = pd.read_csv("input/train.csv")
df_test = pd.read_csv("input/test.csv")

# 使用する特徴量を分かりやすさのため絞る
use_features = [
    "YearBuilt",    # 建設日
    "MSSubClass",   # 建物の等級
    "LotArea",      # 敷地面積
    "YrSold",       # 販売年
    "MoSold",       # 販売月
]

train_x = df_train.loc[:, use_features]
train_y = df_train["SalePrice"]
test_x = df_test.loc[:, use_features]


↑のコードを数値の特徴量を全て使う以下のように書き換えることでCVが0.146にまで改善する。


df_train = pd.read_csv("input/train.csv")
df_test = pd.read_csv("input/test.csv")

# 使用する特徴量を分かりやすさのため絞る
use_features = [
    "MSSubClass",   # 建物の等級
    "LotFrontage",  
    "LotArea",      # 敷地面積
    "OverallQual",  
    "OverallCond",  
    "YearBuilt",    # 建設日
    "YearRemodAdd"
    "MasVnrArea",   
    "BsmtFinSF1",   
    "BsmtFinSF2",   
    "BsmtUnfSF",
    "TotalBsmtSF",
    "1stFlrSF",
    "2ndFlrSF",
    "LowQualFinSF",
    "GrLivArea",
    "BsmtFullBath",
    "BsmtHalfBath",
    "FullBath",
    "HalfBath",
    "BedroomAbvGr",
    "KitchenAbvGr",
    "TotRmsAbvGrd",
    "Fireplaces",
    "GarageCars",
    "GarageArea",
    "WoodDeckSF",
    "OpenPorchSF",
    "EnclosedPorch",
    "3SsnPorch",
    "ScreenPorch",
    "PoolArea",
    "MiscVal",
    "YrSold",       # 販売年
    "MoSold",       # 販売月
]

train_x = df_train.loc[:, use_features]
train_y = df_train["SalePrice"]
test_x = df_test.loc[:, use_features]



import numpy as np

kf = KFold(n_splits=4, shuffle=True, random_state=894)

rmses = []
rmse_logs = []
ans = np.zeros(len(test_x))

for tr_idx, va_idx in kf.split(train_x):
    tr_x, va_x = train_x.iloc[tr_idx], train_x.iloc[va_idx]
    tr_y, va_y = train_y.iloc[tr_idx], train_y.iloc[va_idx]
    
    res = xgb_reg(tr_x, va_x, tr_y, va_y, test_x)
    
    rmses.append(res["rmse"])
    rmse_logs.append(res["rmse_log"])
    
    ans += res["pred"]

ans /= len(rmses)


CV = np.mean(rmse_logs)
print(f"CV = {CV}")

CV = 0.2650419448264024


data = {
    "Id": df_test["Id"],
    "SalePrice": ans
}
df_ans = pd.DataFrame(data)
df_ans.head()



コメント(0)

まだコメントがありません。
もしよろしければ下のフォームからコメント下さい。


コメントする

もしよろしければコメント下さい。

ハンドルネーム:

内容:

最新記事


【英語】テスト駆動勉強法
【英語】テスト駆動勉強法
コサイン類似度はベクトルを正規化してから内積を取っている
コサイン類似度はベクトルを正規化してから内積を取っている
【ゼロから作るDeep Learning 2】MatMulノード解説
【ゼロから作るDeep Learning 2】MatMulノード解説
『Kaggle』カテゴリの記事