【kaggle】AMEXコンペで銀メダルを獲得してKaggle Masterになりました【AMEX解法】

Kaggle

kaggle masterになりました

今回のAMEXコンペで銀メダルを獲得し、Kaggle Masterに昇格しました!肝心の金メダルについてはチームメイトの皆さんのおかげなので実力的にはまだまだですが、昇格できて素直にうれしいです。

Masterの振り返り記事はまた気が向いたときに書くとして、今回はAMEXコンペの解法について書かせてもらおうと思います。

AMEXコンペについて

コンペ概要

今回参加したコンペは、「American Express – Default Prediction」という、クレジットカードの使用履歴からユーザーが債務不履行に陥るかどうかを予測するテーブルデータコンペです。(コンペ概要は下記)

American Express - Default Prediction
Predict if a customer will default in the future

タスクはテーブルデータを使ったシンプルは二値分類のタスクになっており、初心者でも参加しやすいと考え、初心者の友人と一緒に参加しました。

コンペ全体としては下記のような特徴がありました。自分がこれまでの参加したコンペでは見られない特徴だったのでなかなかつらかったです。

  • データセットが大きく、KaggleNotebookではメモリに乗らない
  • データが匿名化されており、意味のある特徴量が作りにくい
  • LBのスコアに差が見られない

上記の特徴に対して行った対策は後述いたします。

結果

結果は 1627位 から 1409位ShakeUpして218位でした。

Publicの順位がずっとメダル圏外にいたので、結果見て1409位のShakeUpには笑ってしまいました。

初の4桁ShakeUp


解法

方針

LBの詰まり具合から、1.リークは見られなさそう、2.magic featureは見られなさそう、という観点からアンサンブルゲーになると予想していたので、

「特徴量とモデルをいっぱい作る → アンサンブル」

という方針を早めに決めていました。

最終的に我々のチームは、17個のシングルモデルをStackingとBlendingでアンサンブルしたものを最終サブに選びました。

シングルモデル

作成して、アンサンブルに使ったシングルモデルは下記の17個です。GBDT系のモデルについては、こちらのNotebookの特徴量をベースに、オリジナルの特徴量を足していくという方法でモデリングを行い、NN系のモデルについてはGPUのメモリの都合上、少なめの特徴量だけでモデリングを行いました。

また、BigShake が予想されたため、代表的なモデルはSeedBlendを実施してモデルの堅牢性を高める小細工も使いました。

作成した特徴量の詳細については、次章に記載します。

ModelFeatureCVPublicPrivate
LightGBM1462 cols
(base feature)
0.7972910.798750.80696
LightGBM1472 cols
(base + kmeans)
0.7958790.797440.80567
LightGBM(seed blend)2011 cols
(base + c3)
0.7975310.798640.80555
LightGBM(seed blend)2023 cols
(base + c3 + statedate)
0.7977780.797690.80533
XGBoost(seed blend)2011 cols
(base + c3)
0.7940190.796050.80410
XGBoost1472 cols
(base + kmeans)
0.7941410.798990.78922
XGBoost (pyramid)1581 cols0.7969860.797680.80572
CatBoost(seed blend)2011 cols
(base + c3)
0.7948420.796160.80412
CatBoost2023 cols
(base + c3 + statedate)
0.7945480.796430.80385
Tabnet435 cols0.7883580.782940.79021
GRUraw data0.7867810.798360.79836
Deeptable(seed blend)435 cols0.7895380.791040.80046
LSTMraw data0.7861040.787640.79637
Transformerraw data0.7867810.789400.79862
Logistic Regression2011 cols
(base + c3)
0.7823160.778610.78986
Logistic Regression2023 cols
(base + c3 + statedate)
0.7823950.778470.78992
シングルモデルスコア


アンサンブル

アンサンブルは前述のシングルモデルを利用して、StackingとBlendingでアンサンブルを実施しました。CVとしてはBlendingの方が高くなったのですが、LBのスコアはStackingの方が高くなりました。Blendingの方はCVにOverfitしていただけのようです。

MethodCVPublicPrivateremarks
Stacking 0.800020.799640.80736分類器にはRidge Classifierを利用
Blending0.800290.799390.80724Optunaを用いて重みの調整
最終サブスコア


やったこと

RAMの増設

まずローカルマシンのRAMを32G → 96Gに改造しました。データがRAMに乗らない問題はこのコンペの共通課題だったと思うので金にものを言わせて解決しました。データの省メモリ化?金で殴れば必要ありません。

特徴量

今回のコンペは特徴量が匿名化されており、意味のある特徴量を作成するのは困難であったため、特徴量作成パートはほとんどおまじないのような作業になりました。いろいろ試したのですが、ベースの特徴量以外に、最終サブに使った特徴量は下記のものになります。

C3 (tsfresh)

チームメイトに教えてもらった時系列特徴量自動作成のライブラリのtsfreshを活用しました。時系列関係の統計量を指定すると自動で特徴量を作成してくれます。

今回はいろいろ試した結果「C3」と呼ばれる特徴量が少し効いたので最終サブにも利用しました。tsfreshの使い方については時間あったら記事にしてみようと思います。

tsfresh — tsfresh 0.20.2.post0.dev10+g1297c8c documentation


kmeans cluster

kmeansのクラスタリング結果とクラスター中心までの距離を特徴量に利用しました。これを入れると単独モデルの精度は下がったのですがアンサンブルに入れると少し精度が上がったので最終サブには利用しました。

statedate(日付特徴量)

こちらのNotebookで紹介されていた日付特徴量を実装しました。CVが小数点第4位以下で向上しました。


反省点

一番の反省点はシングルモデルの精度向上に取り組む時間を取れなかったことです。

方針をアンサンブル+特徴量で攻めると決めたため、優先度が「シングルモデル<モデルの数」となっており公開Notebookに毛が生えた程度のモデル作成しかできませんでした。

コンペに本腰を入れ始めたのが遅かったのもあるのですが、上位陣のSolutionを読んでいると単独モデルでCVが0.8を越えるモデルを作っておられる方もおられたので、アンサンブルに逃げてしまった風に感じ反省しました。

最後に

結果的にKaggleMasterになることができましたが、肝心の金メダルはつよつよな皆さんにとってもらったものなので、実力的にはまだまだだと思ってます。これからも精進を続けてこのコミュニティに貢献できるように頑張っていきたと思います。

コメント

タイトルとURLをコピーしました