フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

Nisikaの中古マンション価格予測のデータでモデル構築する

はじめに

  • 前回と前々回でデータの加工及び可視化を行ったので、今度はモデルの構築を行ってみる

px-wing.hatenablog.com

px-wing.hatenablog.com

モデル構築

## モデル構築
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error as mea

## 学習データを検証データと学習データを分ける。test_sizeで0.2を指定しているので、ランダムで20%のデータを検証データとする
df_train, df_val = train_test_split(df, test_size=0.2)

## 目的変数と説明変数とで分ける
### 目的変数をtrain_y,val_yに説明変数をtrain_x,val_xに格納する
col = "取引価格(総額)_log"
### 学習データ
train_y = df_train[col]
train_x = df_train.drop(col, axis=1)
### 検証データ
val_y = df_val[col]
val_x = df_val.drop(col, axis=1)

trains = lgb.Dataset(train_x, train_y)
valids = lgb.Dataset(val_x, val_y)

### LightGBMに設定するパラメータ
params = {
    "objective": "regression",
    "metrics": "mae"
}

## num_boost_roundはLightGMBの学習回数を指定するパラメータ。defaultは100になっている
## 複数の決定木を作成して直列に実行していく。
## early_stopping_roundsは過学習が発生した場合、過学習を停止させるパラメータ
model = lgb.train(params, trains, valid_sets=valids, num_boost_round=1000, early_stopping_rounds=100)

モデルの検証

## predictに検証データ用の説明変数(val_x)を設定する
## vals変数に目的変数の予測値が代入される
vals = model.predict(val_x)
## 平均絶対誤差 モデルで算出した予測値(vals)と実際の観測地(val_y)を比較する
mea(vals, val_y)

テストデータで検証とコンペ提出用CSVファイル出力

## テストデータの読みとデータの加工処理
df_test = pd.read_csv("test.csv",index_col=0)
df_test = data_pre(df_test)
predict = model.predict(df_test)
df_test["取引価格(総額)_log"] = predict
df_test[["取引価格(総額)_log"]].to_csv("submit_test.csv")

特徴量重要度の確認

### あるモデルモデルを作ったときに、そのモデルでつかっている説明変数の中で、どの説明変数が目的変数に寄与しているかを確認する
pd.DataFrame(model.feature_importance(), index=val_x.columns, columns=["importance"]).sort_values("importance", ascending=False)

結果

f:id:PX-WING:20220225001040p:plain