Kaggle - Home Credit Default Risk挑戦記録

はじめに

Home Credit Default Riskに参加し211/7198の成績を収め、シルバーメダルを獲得することが出来ました。前回の記事は「Kaggle初挑戦」というテーマで書かせていただいたので、今回は「Home Credit Default Risk」をテーマにしたいと思います。私の経験不足&力不足で正直駄文だと思いますが、温かい目で読んでいただけると幸いです。間違いやご意見がありましたら、ぜひコメントをお願いいたします。 ↓前回の記事 toshikishimizu.hatenablog.com

参考になる記事

ちなみにid:kurupicalさんが書かれた記事があり、明らかにこの記事の上位互換なので、まだ読まれていない方は先にご覧になってください。Home Credit Default Riskがどういうコンペなのか、図を交えて非常にわかりやすく説明されています。 kurupical.hatenablog.com

目次

コンペの概要

複数のテーブルデータを用いて、顧客がローンの支払いを遅延するかどうかを予測します。

やったこと

開発環境

ローカルとクラウド(GCP)の両方を使いました。Jupyter NotebookによるEDAスクリプトデバッグをローカルで行い、本番はGCPで計算させていました。正直このやり方だとコードの管理が微妙だと思ったので、次回のコンペでは改善したいですが、よくわかりません。多分、常識的なレベルなのでしょうが知見がございましたらぜひ教えてください。
- 最初からすべてサーバで開発(Jupyter Hub + vim or emacs)
- gitでローカルとサーバのコードを同期しながら開発
とかでしょうか?

GCP

$300のクーポンがもらえますのでGCP(Google Cloud Platform)のGCE(Google Compute Engine)を使いました。私の場合$200で三か月間のコンペを乗り切ることが出来ましたので、(もちろん人によりますが)最初のコンペはこのクーポンだけで十分戦えると思います。インスタンスを何度か立て直したり、並列実行するために複数立てたりするので、初期設定用のスクリプトを書いておくと便利です。たとえば私は以下のようなスクリプトを使っていました。(あくまで一例です)

wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh
bash Anaconda3-5.2.0-Linux-x86_64.sh
source ~/.bashrc
sudo apt-get update
sudo apt-get install unzip
sudo apt-get isntall htop
pip install lightgbm
pip install tqdm

mkdir input output feature source
gsutil -m cp -r  gs://kaggle-hcdr/input/* ~/input
cd ~/input
unzip files.zip

私はコンペの最初にGCS(Google Cloud Storage)にデータを置き、そこからGCEにgsutilでコピーするという方法をとっていました。KaggleはAPIでデータがダウンロードできるのでそれでもいいかもしれません。

モデル

LightGBMを使いました。XGBoostも使いましたが、前者の方が私にはあっている気がして、前者に落ち着きました。 ニューラルネットワーク(Keras)も色々と試してみましたが、LightGBMよりも結構スコアが悪かったので採用はやめました。 釈迦に説法ですが、LightGBMには - 学習が比較的高速
- 欠損値に対応
- 自動でone-hot encoding
- 特徴量が増えても副作用軽微
などのメリットがあり、画像系コンペでなければとりあえず使っておいて間違いはないです。

CV

straified-kfold(k=5)

startified-kfold(k=5)を使用しました。それぞれのfoldでテストデータに対しても予測を行い、foldで平均をとったものをモデルの出力としました。コンペにおいては信頼できるCVを出せるようにすることが極めて重要といわれています。今回の私のCVは、モデルのseedを変えるとスコアが結構変わってしまったりして、本当にこのCVを信頼してよいのか不安になることも多かったです。モデルのseedを変えながら複数試行して平均をとればよいのですが、そうすると時間がかかりすぎます。どうやってCVスコアを計算し、扱うかはとても奥が深いと思いました。

他の参加者のCVスコアについて

"Trust your local CV."という金言があり、おかげで私も617位(PublicLB)→211位(PrivateLB)というshake upを果たせました。コンペ中はどうしても自分が集団のどの位置にいるかが気になってしまいます。CVは自分のスコアの変化を知ることはできますが、他者との比較が難しい(計算方法が違う・そもそも公開されない)ので、頭では、"Trust your local CV."を理解していながらも、やはりPublicLBを気にしてしまいます。そこで、主要なカーネルは実際にローカルで動かし、あなたの計算方法でCVを出すことをお勧めします。そうすることでカーネルのモデルはCVとPublicLBにどれだけ乖離があるかを知ることができます。ベストカーネルをコピペで出してくる参加者は多く、結構なボリュームゾーンとなります。それらより少し良いCVを出せていれば(PublicLBが悪くても)メダルは取れると思います。

特徴量

特徴量の管理

featherで管理しました。csvよりも容量が大きいですが、読み書きが高速です。この辺りは人によってやり方が色々あるようです。featherを用いた管理についてはid:amaotoneさんの以下の記事とGitHubを参考にさsていただきました。 amalog.hateblo.jp

特徴量エンジニアリング

多くの人がやっている通り
- 既存のカラム同士の四則演算
- min,max,mean,var,countなどを用いた集計
などを中心にオリジナリティがあるものも数個足しました。最終的には特徴量の数は1000くらいになりました。LightGBMは特徴量を増やしすぎても致命的な副作用はでませんが、無駄な特徴量があると学習も遅くなるので、思考停止して特徴量を量産するのはあまりよくないです。自作にしろコピペにしろ「狙いをきちんと説明できる特徴」を採用するのが重要だと感じました。目的をもって特徴量を作ると、あまり効果がなかったとしても、そこから何らかの知見を得られることが多いです。

CVの確認

特徴量生成の試行錯誤の過程で新特徴量の有無でCVがどう変化するのを知りたい時があります。このとき既存の全ての特徴量を使って学習するのではなく、「新特徴量に関連するもの」と「コンペで明らかに重要な特徴」だけで学習させました。
- 特徴量の追加に対してスコアが敏感になる
- 学習が速く、試行錯誤を増やせる
などのメリットがあると思います。

特徴量の削除

基本的には削除は行わない方針で行きました。ただし、何度か実験する中で、importanceが0のものはさすがに無駄だと思い削除しました。 また、過学習の可能性があるのでimportanceが高いからといって良い特徴量とは限りません。そこで最初から与えられているカラムに関しては、一つカラムを削除してCVを計算する操作をすべてのカラムに対して行い、削除した場合の方がCVが改善しないかをチェックしました。この方法は、RFE(Recursive Feature Elimination; 再帰的特徴量削減)っぽいですが重要度ではなくCVスコアに基づいて行いました。

ハイパーパラメータ

kernelのハイパーパラメータを手動で弄りながら使っていました。途中、グリッドサーチやhyperoptを試してみたのですが、時間をかけている割にはあまり精度が変わりませんでした。それよりも特徴量エンジニアリングに時間を割いた方がよいと思い、チューニングはあきらめました。また、ハイパーパラメータを弄り始めると今まで検証してきた実験の前提が変わり、やり直したくなってしまいます。基本的にはコンペ終盤までは固定でよいと思いました。

学習率

多くの場合で学習率を下げてステップを増やせば、精度が上がります。一方、これらの工夫は特徴量エンジニアリングとは切り離して考えられます。そこで、試行を速く回すために学習率は大きめ(0.1くらい)にしておいて、コンペ終盤に小さく(0.01-0.02くらい)しました。

アンサンブル

k-foldとLightGBMのseedを変えて複数の予測を行い、それらを平均してみましたがPublic LBが大きく変わることはありませんでした。(後から気づきましたがk-foldのseedを変えてしまうと、アンサンブルモデルのCVを算出することができなくなってしまうので、あまり得策ではないかもしれません。)結局、最後のサブミッションの一つはCVが最も高いシングルモデルの出力をそのまま提出しました。もう一つのサブミッションでは、そのモデルの予測ととベストカーネルの予測をブレンドしました。ブレンドする際は分散を統一するなどの処理が必要です。結果論ですが、どちらのスコアももあまり変わらなかったようです。コンペ終盤は仕事で時間が確保できなかったので、次回はここら辺もしっかりと取り組みたいです。

情報収集

ホットなKernelやDiscussionは基本的に目を通した方がよいです。自分が悩んでいることがすでに解決されていたり、今までになかった視点でデータを見れるようになります。また、自分がどういうオリジナリティをもって取り組めているかの比較ができます。

さいごに

Home Credit Default RiskでKaggleに初挑戦し初メダルを取れたことは本当にうれしかったです。日本のkaggleコミュニティ(slack, twitter)は大変優れており、ほとんどがそのおかげといっても過言ではないです。ありがとうございました!

最近は画像コンペしかなく参加するか迷っていたのですが、先日Google Analytics Customer Revenue Predictionという新しいコンペが始まりましたので、次はこれに挑戦したいと思います!

記事を最後まで読んでいただきありがとうございました!