Kaggle の「House Prices - Advanced Regression Techniques」をやってみた
https://gyazo.com/06b667947c138a377369558f8fd27549
コンペの概要
住宅情報から最終価格を予測する。
変数は 79 ある。
特徴量エンジニアリングと回帰タスクの練習になる。
評価関数は二乗平均平方誤差(RMSE)
今回試したことはこちらの Notebook にまとめている。
https://www.kaggle.com/code/naoki85/house-prices-prediction-using-tfdf
サンプルの Notebook を試してみる
スターター notebook があるので、それをコピーすると「この辺をまずやっておくといいよ」、というコードが用意されている。
このサンプルでは、 tensorflow.keras の決定木(TF-DF)を利用する。
ランダムフォレストは OOB という考え方を利用しているため、検証データをわざわざ用意する必要がない(トレーニングデータの一部を検証データとして利用する。
https://developers.google.com/machine-learning/decision-forests/out-of-bag?hl=ja
https://qiita.com/kenmatsu4/items/1152d6e5634921d9246e
pd_dataframe_to_tf_dataset に object 型のカラムを渡すとバイナリに変換される
https://www.tensorflow.org/decision_forests/api_docs/python/tfdf/keras/pd_dataframe_to_tf_dataset
文字列型を one hot エンコーディングしてみる
pd_dataframe_to_tf_dataset でデータセットを変換すると、文字列型はバイナリ型として扱われるようであった。
ただ、文字列型には数値による順序は関係ないはずなので、one hot encoding してみた。
get_dummies を使うと楽に変換できる。
code:py
df_num = dataset_df.select_dtypes(include = 'O')
for col in df_num.keys():
encod = pd.get_dummies(dataset_dfcol, prefix=col, dtype=int)
dataset_df.drop(col, axis=1, inplace=True)
dataset_df = pd.concat(dataset_df, encod, axis=1)
この変換だけ試してみたところ、訓練データでは RMSE の値が微増したものの、検証データでは微減した。
多少汎化性能がよくなったかもしれないが、大きな改善には見えなかった。
モデルをいくつか試してみる
DistributedGradientBoostedTreesModel は分散型の勾配ブースト木で、データセットはメモリに載せたものは使用できないよう。大規模データセット向けのようなので、基本的には普通の勾配ブースト木を使えば良い。
TF-DF で提供された 3 つのモデルで試したが、勾配ブースト木が多少 MSE の値が低かった。
寄与率の大きなカラムだけ残す
サンプルの Notebook にて、カラムがどれだけの寄与をするか算出していた。
また、カーディナリティの低いカラムを外してみる。
モデルは RandomForest で試してみたが、逆に MSE は大きな値になってしまった。
TODO
特徴量をちゃんと考えていなかったので、以下の記事を参考に試してみたいと思う。
https://www.kaggle.com/code/walzer55/house-prices
https://note.com/estyle_blog/n/n83fe11a6ca68
#ml