Kaggle の「House Prices - Advanced Regression Techniques」をやってみた
https://gyazo.com/06b667947c138a377369558f8fd27549
コンペの概要
住宅情報から最終価格を予測する。
変数は 79 ある。
特徴量エンジニアリングと回帰タスクの練習になる。
評価関数は二乗平均平方誤差(RMSE)
今回試したことはこちらの Notebook にまとめている。
サンプルの Notebook を試してみる
スターター notebook があるので、それをコピーすると「この辺をまずやっておくといいよ」、というコードが用意されている。
このサンプルでは、 tensorflow.keras の決定木(TF-DF)を利用する。
ランダムフォレストは OOB という考え方を利用しているため、検証データをわざわざ用意する必要がない(トレーニングデータの一部を検証データとして利用する。
pd_dataframe_to_tf_dataset に object 型のカラムを渡すとバイナリに変換される
文字列型を 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)
この変換だけ試してみたところ、訓練データでは RMSE の値が微増したものの、検証データでは微減した。
多少汎化性能がよくなったかもしれないが、大きな改善には見えなかった。
モデルをいくつか試してみる
DistributedGradientBoostedTreesModel は分散型の勾配ブースト木で、データセットはメモリに載せたものは使用できないよう。大規模データセット向けのようなので、基本的には普通の勾配ブースト木を使えば良い。
TF-DF で提供された 3 つのモデルで試したが、勾配ブースト木が多少 MSE の値が低かった。
寄与率の大きなカラムだけ残す
サンプルの Notebook にて、カラムがどれだけの寄与をするか算出していた。
また、カーディナリティの低いカラムを外してみる。
モデルは RandomForest で試してみたが、逆に MSE は大きな値になってしまった。
TODO
特徴量をちゃんと考えていなかったので、以下の記事を参考に試してみたいと思う。