1st
- score
- public 0.14445
- private 0.30626
「本当に予想外でした。上位10%に入ることを望んでいましたが、それ以上のことは夢にも思っていませんでした。」
- DNNを使用
- GBDTは明らかに過学習だったので非採用
greeks
は未使用- FEは過学習に繋がった
- DNN based on Variable Selection Network(論文)
- 正規化はMinMaxScalerやStandartScalerでなく、8つのニューロンを持つ線形射影
- 最終的に確率を重み付けし直すと、とてもうまくいった。
- cvは機能していた
- 10foldで10-30回学習し、cvを元に各foldで裁量のモデルを2つ選ぶ
- cvは0.25-0.05まで変動するほど不安定だった
- 予測しにくさを表現する新しいラベルを作成
- y_true = 1かつy_pred < 0.2、y_true = 0かつy_pred > 0.8 を1
- それ以外はラベル0
- このラベルはいいCVを切るために使用、scoreは0.02向上
2nd
- score
- public 0.18941
- private 0.32586
- CV 0.21996
「控えめに言って、私は完全にショックを受けています。今日朝起きてチームメイトにおめでとうと言われましたが、何位になったのか興味が湧きました。 それが2位だったのを見たとき、私は大笑いしました。」
- model
- Catboost, XGBoost, TabPFN
- lightgbmはよくなかった
- 前処理
- greeksを使ってtimeを特徴量に加える。testにはgreeksがないのでmax(time)+1を使用
- timeが存在しないtrain行は削除して学習(全体の23%らしい)
- umapで他のデータから離れたデータにtimeが存在しなかったから
- umapで次元を減らし、kmeansでクラスタにラベリングする
- feature permutationで特徴量選択
- nanは-100で補完
- 4fold
3rd
- score
- public 0.21545
- private 0.33974
- CV 0.24217
「このような結果を残せたことに本当に驚きました。実は、このコンペティションに参加し、ベースライン・コードを実装しただけで、普段は残業が多い会社だったので、それからこのコンペティションに取り組むことはほとんどありませんでした😅。」
- model
- catboost
- lightGBMはよくなかった
- 前処理
- 全特徴量ペアの比率を特徴量を作成 約1500個
4th
- score
- public 0.16087
- private 0.34077
- CV 0.03346?
「リーダーボードで大Shakeを目の当たりにし、その結果、私がLBの一番上に行くことになり、とても驚いている。」
- model
- CatBoost(ハイパラチューニングなし
- 処理
- 特徴量のギャップを再帰的に埋める
r = CatBoostRegressor() is_null_c_train = train.columns[train.isnull().any()] is_null_c_test = test.columns[test.isnull().any()] nulls = list(is_null_c_train.append(is_null_c_test)) for c in nulls: null_c_train = train[c].isnull() null_c_test = test[c].isnull() except_c = [x for x in train.columns[1:-1] if x not in [c]] r.fit(train.loc[~null_c_train, except_c], train.loc[~null_c_train, c], verbose = False) if len(train[null_c_train]) > 0: train.loc[null_c_train, c] = r.predict(train.loc[null_c_train, except_c]) if len(test[null_c_test]) > 0: predicted = r.predict(test.loc[null_c_test, except_c]) if c == 'EJ': predicted = np.round(predicted) test.loc[null_c_test, c] = predicted
- greeks['Epsilon'] Unknown は greeks['Epsilon'].min() で埋める
- 'Alpha'、'Beta'、'Gamma'、'Delta'の各値に対するCatBoostClassifierの予測値を特徴量として使用
- イプシロンでソートしたときの行番号を使用
- 特徴量重要度が4番目に高くなった
- public,privateともに0.03ほど改善
- 5fold
5th
- score
- public 0.20333
- private 0.34286
- CV 0.21979
「私は数ヶ月前に基本的なソリューションのsubmitを提出し、コンペティションのことは忘れていた。朝、友人たちが祝福してくれたときには驚いた。」
- 各α、β、γ、δのモデルを訓練し、これらの確率を積み重ねて特徴量として使用。
- 各特徴量について LightGBMで imputer model を作成
- これがなくてもそこまでスコアに影響はない
- RepeatedStratifiedKFold(n_splits=5, n_repeats=5)と基本的なcatboostモデルを使用。
6th
- score
- public 0.206555
- private 0.34696
- model
- XGBoost
- 複数のパラメータで学習し、アンサンブル
- XGBoost
- pandasの'interpolate’で欠損値補完
- ランダムフォレスト、gini-importance'を使用してデータセットで最も重要な特徴を探す
- ここに詳しいか?
7th
- score
- public 0.18113
- private 0.34752
- CV 0.18034?
「コンペティションの序盤にいくつかサブミッションをした後、大きなShakeが予想できたのでそれ以上取り組まなかった。」
- Fill Nan data with 0
- 5 fold Multi Label Stratified using Greeks Values
- EJ was categorical so used Label Encoding
- Also Label Encoding for Beta, Gamma and Delta
- sed MultiClass CatBoost Classifier for all the models
- ベータ、ガンマ、デルタを予測するモデルを作り、特徴量として使用
8th
- score
- public 0.19
- private 0.34
「率直に言って、この結果には多少ショックを受けた。大混戦が予想されるとは思っていたが......トップ10に入るとは思っていなかった。」
- model
- XGBoostとTabPFN
- ある人がクラスよりも特定の年齢関連状態にあるかどうかを予測することに重点を置いた
- クラスだけを予測するよりも効果的だった
- 欠損値埋めはinputeモデルを作成して埋めた (public +0.04 private+-0
- 特徴量は特に作成しなかった
- 特徴量選択はimportanceをもとに実施
- ※すべての特徴量を使ったもののほうがprivateは良かった
- alpha(class), beta, delta, gammaを予測するモデルを作ってアンサンブル
9th
「これは本当に予想外だった。銅メダルすら考えてもいなかったのに、9位でここにいる!」
part1
- model
- XGBoostとTabPFNのアンサンブル
- データ分布のバランスをとるためにオーバーサンプラーを活用
- テストセットにEpsilon.max() + 1のギリシャのイプシロンを使用
- SimpleImputer with the strategy set to 'constant'.
- 5-fold
part2
- model
- XGBClassifier, LGBMClassifier
- イプシロン不使用
- 特徴量のスケーリングを実施
- 特徴量選択を実施
- 15-fold
おわりに
Light GBMは微妙。foldも20まで行かないで5-10, greeksのΒ,γ,δを予測して特徴量にする方針は多い気がします。(が、その高いソリューションでもみんなやってる可能性はあります・・・
皆さんover fittingに気を使ってはいますが、その上での運ゲーだったのかは私にはよくわかりません。
また、私が英語に弱いため、情報が正しくなくなっているかもしれません。その場合はリンク先のkaggle discussionをご参照ください。