テーブルデータ分析コンペに参加して(メモ)

データ分析コンペ(テーブルコンペ|ビギナー用)に参加した際に自分なりに工夫した点のメモ。
(ちなみにコンペの結果は7位でした)

コンペの内容

中古マンションの価格を予想するというもの。
2000年第1四半期〜2020年第2四半期までのデータを使い、2020年第3,4四半期の価格を予想する。

データの内容(説明変数)は、マンションの所在地情報や用途、面積や築年数などの情報。

工夫した点

変数選択

各変数を使うか否かのパラメータをoptunaを使って最適化し、最もテストデータの精度が高くなるような変数セットをコンペ提出用サンプルの予測に用いた。

カテゴリ変数の取り扱い

主に以下の三つのエンコーディングを実施。

  • ラベルエンコーディング(Label encoding)
  • カウントエンコーディング(count encoding)
  • カウントラベルエンコーディング(count label encoding)

複数のラベルを含む場合がある変数は、one-hotエンコーディングも実施。
(例|「用途」という変数は "住居、店舗" と複数の項目を含む)

ターゲットエンコーディングも検討したが、過学習を起こしてしまったので最終的には使用しなかった。

また、変数ごとの交互作用を考慮したカテゴリ変数もいくつか用意した。

欠損値補完

変数ごとに以下の処置を実施

  • 欠損値のまま、もしくは("不明")というカテゴリに変換。
  • 関連してそうな他の変数の値を参考に補完。
    (例|「面積」の欠損値を「間取り」の変数を使ってAggregationした値で補完する)
  • 予測モデル(lightGBM)を使って欠損値を補完する。
    (重要度が高い変数の欠損値補完にこの方法を使うと、最終的な予測精度が向上した)

予測モデル

XGBoost, lightGBM, catBoostのアンサンブルで作成
それぞれでモデルに対して、乱数を変えて100回予測値を算出。これらの平均値と中央値を最終的な予測値とした。

ハイパーパラメータ最適化

optunaを使って最適化した。
(googlecolabの連続稼働時間が12時間なので、この範囲内で最適化)

欠損値補完用の予測モデルのハイパーパラメータ最適化はlightGBM Tunerを使用。

精度検証方法

精度検証(ハイパーパラメータ)でのデータ分割は、実際のコンペ提出用サンプルを想定して実施した。

精度検証
学習用サンプル:2000年第1四半期〜2018年第4四半期
精度検証サンプル:①2019年第1,2四半期、
         ②2019年第3,4四半期、
         ③2020年第1,2四半期

コンペ提出
学習用サンプル:2000年第1四半期〜2020年第2四半期
コンペ提出用サンプル:2020年第3,4四半期

外部データの活用

地区名や最寄駅などなどカーディナリティが高い(ラベルの種類が多い)変数は、なるべく外部データを使って人口密度や乗降者数などの量的な変数に変換するようにした。

反省点

  • ハイパーパラメータの最適化は最後の最後にするべきだった
  • コンペの終了間際に外部データの申請する人が多かったので、最終週で他の人が使っている外部データを使えるか色々試してみるべきだった。

関連書籍

関連書籍