【Kaggle】HomeCreditコンペ上位入賞者の手法まとめ(メモ)
KaggleのHomeCreditコンペに参加しました。初めてのKaggleコンペ参加です。
HomeCreditコンペは、ローンの支払が出来たかどうかを予測するもので、Kaggleの中で過去最大の参加者数のコンペでした。
私は、7198チーム中97位(上位1.5%)でした!
目標を上位5%にしてたので結果には満足していますが、今後より上位を目指すためにも、
自分の復習・勉強用に上位入賞者の手法をまとめたので共有します。
自分のコンペ振り返りについては別記事でまとめます。
前提
- あくまでメモなので、このコンペに参加もしくは、データの内容を理解していないと解読できないところ多いです
- 特に特徴量とかは参加していないと意味わからないと思います
- あくまで自分用メモなので出来ていなかったところや気になったところ中心に書いています
- 流し読みした部分もあり、解法が間違っている可能性もあります。もし何かあればコメントください
詳しい内容を見たい人は下記に上位入賞者毎の解法へのリンクがまとまっているので、こちらを見てください
**COMPETITION WRITEUP INDEX** (UPDATING!!!) | Kaggle
6thを除くTop10の内容を書いてます
上位者の全体傾向
- モデルはLightGBMが中心だが、NeuralNetwork(NN)も使っているケースが多い
- 特徴量の作成(Feature Engineering)に力を入れている
- 存在しないデータ(interest rate)、欠損値(EXT_SOUCE)の推測
- 過去の支払いについて、時系列を考慮した特徴量つくり
- Stackingで精度をあげるために、いかに精度が高いながらも多様性のある(相関の低い)モデルを作るかが重要
- 特徴量選択で工夫、学習手法を増やす、チームメンバーを増やして多様性を増やすなど
1st
特徴量
- interest rate の予測モデルを作り、特徴量に利用
- 特徴量の近い500個のデータのTARGET平均値を特徴量にする。
- 特徴量はEXT_SOURCE_Xとcredit/annuity
- AMT_ANNUITYと過去最大の分割支払い額の比率
- EXT_SOURCE_3で割った値が有効だった
- カテゴリ変数をLabelEncoding
- previousの中でも最新のpreviousのカテゴリ変数を利用
- いくつかの観点でaggregate
- previousの直近N回、最初のN回、直近N日など閾値を変えてaggregate
- installmentの1~4回目の支払い(NUM_INSTALMENT_NUMBER)のみでaggregate
- 支払いが遅延したものをaggregate
- REGION_ID_POPULATIONをカテゴリ変数として扱う
- 直近のDAYS CREDIT
- 日齢を年齢に変換して利用 AGE_INT: int(DAYS_BIRTH / -365)
- 直近1000日のAMT_PAYMENT - AMT_INSTALMENTの平均
- リッジ回帰による特徴量選択
推定モデル
- NN:DAEを利用
- stacking3層
- 一層目 NN,XGB,LightGBM,
- 二層目 NN,ExtraTree,Hill Climber.
- 三層目 average
- ExtraTreeでは、AMT_INCOME_TOTALも特徴量に追加
- EXT_xの推測、穴埋めは効果なかった
2nd
チーム構成
- 人数が多いチームだが、分担を明確にしていいmodel pipelineが出来た
- https://cdn-ak.f.st-hatena.com/images/fotolife/g/greenwind120170/20180901/20180901083809.png
推定モデル
- LGBM,NN,RNN,CNN,RGF,CatBoost
- チームメンバーで作るモデルが分担
Stacking/Blending
- Adversarial Stochastic Blending
- testとtrainを区別するモデルを作成。各特徴量セットで、そのモデルの精度を元に重み付け。使うtrainはランダムで抽出
その他
- 同じ人が複数のSK_ID_CURRを持ってることが判明。そして、同じ人だと同じ結果になりやすいため、推定結果にたいして重み付け実施
3th
特徴量
- 特徴量はCVでしぼって250個くらい
- 一度数を減らすと学習時間も短く試行錯誤もやりやすかった
- SK_ID_PREV単位での予測を特徴量に利用
- EXT_SOURCEの推測
- 推測値と実際の値の差分はいい特徴量に
推定モデル
- たくさん作ったモデルのなかから、相関の低いモデルを数個選定
- モデルはLGBM中心で、NNとXGBも
- Stackingは、LGBM,RandomForest,ExtraTree,LinearRegressionの4つを使いaverageをとる
- stacking時にはいくつかの元の特徴量も利用
- stackingで使った特徴量は1つずつ増やして試した。特徴量も多くないから早い
- ExtraTree,LinearRegressionでは、欠損値は平均でうめた
4th
- 過去N回のinstallments and pos,bureau featuresでaggregate
- 大量の特徴量セットから、特徴量を選択して相関の低いモデルをたくさん作る。
- oof毎にRFEを使って特徴量選択
- BayesianOptimizationの時の試行毎の予測結果を保存して利用した
- revolving loan の予測結果を修正した(0.4を越えたら0.8かける)
5th
特徴量
- 行ごとの推定
- installment,bureau,pos,creditそれぞれ、行毎にtargetの推定を実施
- 推定結果をSK_ID_CURR毎にaggregateして、min,max,mean等を特徴量に
- interest_rateの予測
- 予測interest_rateは現実的な範囲の価にしぼって利用
- 一般的な金融リスクスコアの計算方法を調べ、それを特徴量とした
- 一部のカテゴリ変数を数値化。例えば、NAME_EDUCATION_TYPE
- 色んな特徴量でaggregate
- 例 CREDIT_TYPE+CREDIT_ACTIVE
推定モデル
- ニューラルネット
- ユーザの過去の支払い状況を2次元マトリクスにして、1dCNN+LSTMを使ったNNを作成
- NNの予測結果をLGBMにいれる
7th
- とにかく新しい特徴量増やして試し、新たなモデルを作る
- LGBMとNN13個のモデルで線形回帰によるスタッキング
- 直近n月やn日のデータに分けて特徴量化
- 公開カーネルhttps://www.kaggle.com/jsaguiar/lightgbm-7th-place-solution
8th
- bureauとprevious両方合わせて、月毎にまとめる
- aggregateで大量のnanが発生するので0埋め
- 各テーブル毎からの予測値を特徴量に使う
- スタッキング構成
9th
推定モデル
- xgb, lgbm, catboost, logistic regression, random forest, extra trees
- 結果、CVとLBの関係がかなり安定
- LightGBMについて、gbdtよりdartのほうがよかった。恐らく特徴量が多いから
- dartで特徴量が多いときはfeature_fractionを減らすと良い
- NN
- Entity Embedded Neural Networksがよかった。
- 詳細はEddy's kernel from Porto Seguroを見るとよい
- バッチサイズは小さいほうが精度よかった
- RankGauss Normalizationには小さいepochが必要
- MinMaxScalerは必要
- 層の数を増やしたほうが精度がいい
- Entity Embedded Neural Networksがよかった。
- stackingよりaverage belendingのほうがよかった
特徴量
- 時系列の情報に対して、速度・加速度のような値を算出。速度は前月との差分、加速度は差分の差分
- CNT_INSTALMENT_FUTUREの遷移の仕方(基本1つずつ減るが一気に減るとまとめて返したことになる)
- posなどで、(1-(DAYS_VALUE)/(minimum_value))のような割合を各特徴量にかけた
10th
特徴量
- instalmentの(DAYS_INSTALMENT-DAYS_ENTRY_PAYMENT)は有効な特徴量であり、さらに直近1年のものに絞ると有効だった
- creditの上限に対して利用した割合を特徴量に
- 特に直近のものは有効
- interest rateの推測を特徴量に
- NAME_CONTRACT_TYPE別にモデルを作成
- previousの直近N回、最初のN回、直近N日など閾値を変えてaggregate
- EXT_SOURCE_Xの欠損値を推測モデルで埋める