「ProbSpace」というプラットフォームで開催された「給与推定」コンペが23日に終了しました。私は途中で まぐちさん とチームを組み、最終順位は7位でした。
PublicとPrivateが分かれていないのは残念でしたが、恐らく独自に作成したデータセットを用いた、初学者でも取り組みやすい程よい難易度に設定されたコンペだったと思います。discussionシステムも存在していました。
本記事では、上位陣が公開した解法をまとめます。
一覧
1位
https://prob.space/competitions/salary-prediction/discussions/senkin13-Post46bdfde9468e3d01f4e7
1位の方は、5段階の処理を経て最終的な予測値を算出していました。
- LightGBMで152の特徴量を用いて予測
- LightGBMの残差が120未満のデータのみをダウンサンプリングして、Neural Networkで予測
- Neural Networkの残差が129未満のデータのみをダウンサンプリングして、Neural Networkの残差を新しいtargetにして、LightGBMで予測
- LightGBMの残差が129未満のデータのみをダウンサンプリングして、LightGBMで予測
- trainのtargetの値でtestを埋める後処理(trainとtestが似ている2件のみ)
残差を取りながらの多段推論がここまで効果を発揮するとは驚きでした。このアイディアはKaggle「Predicting Molecular Properties」コンペのCPMPさんの7位解法*1を参考にしたそうです*2。
2位
2位の方は、480個のNeural Networkのアンサンブルでした。「Feature Encoding」と呼んでいる手法で特徴量自体を480通りに変換しているそうで、とてもユニークな取組だと感じました。
「Feature Encoding」というのは私が勝手につけた名前で、本当は別の名前があるかもしれません。
— 武田敦志 (@atushiTAKEDA) December 22, 2019
給与コンペの場合、12個の特徴量(1個は手動作成)から16次元の連続値ベクトルに変換(Encode)していました。この変換のパターンを480種類作り、これらの出力ベクトルをNNの入力値としていました。
4位
4位の方は、Neural NetworkのSeed値を変えながらのアンサンブルのようです。活性化関数の利用回数を意図的に減らすなどで、過学習への対策をしていました。
6位
6位の方もNeural Networkのアンサンブルで、10個を混ぜたそうです。
給与コンペ、上位2名とも NN 使ってますね。僕も NN 10個のアンサンブルで6位でした。カテゴリ変数を NN でエンコーディングするのが効くコンペだったみたいです。
— maruyama (@rntrnaru) December 23, 2019
7位
最終的なベストスコアは、Neural NetworkとLightGBMの重み付き和でした。チームマージ時点で、まぐちさんがNeural Network、私がLightGBMを進めていました。私の具体的な取り組みについては、discussionに投稿済です。
10位
特徴量エンジニアリング+LightGBMという、テーブルデータコンペの王道の取り組みでした。個人的に興味深かったのは次のデータ水増しです。今回は恐らく独自に作成したデータセットなので、特に効果を発揮する可能性があったと思います。
EDAからsexとtargetだけに注目すると2変数間に関係がなさそうだったので、試しにtrainのsexだけを反転させたデータを元のtrainにくっつけてデータ量を2倍にして学習しました。
おわりに
本記事では、ProbSpaceで開催された給与推定コンペの上位陣解法をまとめました。
*2: Hi,CPMP, my using residuals idea is from your solution of Predicting Molecular Properties,that help improved a lot,then I found using more stages, and different features at every stage can improve much more,thanks a lot.