【Kaggle①】Home Credit 総評:はじめてのコンペ
この記事では仕事でデータサイエンティストをしている私がはじめて Kaggle (データサイエンティストが競い合うプラットフォーム)に参加した感想と学びを書きます。ただし、コンペの具体的な内容はKaggleルールで転載禁止なのでご了承ください。
目次
参加した感想
1. 説明変数多すぎ!
2. メトリックハッキング?
学びとして感想の後で書きます。
3. わからないこと・困ったことはほかの参加者が教えてくれる
コンペ=競争、怖そう。
正直参加前は競い合いの場だし殺伐としているんでしょう。とおもっていました。
しかし、実際はみんな優しかったです。
「何からはじめていいのかわからない」「こんなエラーがでてこまっている」と投稿すると、参加者の誰かから「私はこうしてるよ!」「私はこう対策してます」みたいな返信がすぐに来ます。
参加者同士は確かにライバルではあるけれど、研究室や会社の同期・先輩みたいな印象を受けました。
データサイエンティストと議論して学びを得たいと思っている方が多いです!
4. まったく歯が立たない訳ではない
精緻に特徴量エンジニアリングやパラメータチューニングされた1位のスコアと比較しても、適当にlightgbmにぶっこんだスコアでも案外差がないなという印象です。
スコア0.001を競うゲームという認識を持ちました。
また、1位の元となるモデルや特徴量を参加者で共有する文化らしくそれを少しいじるだけでそこそこいいスコアが取れたりします。
5. Kaggle と実務との違い
0.001を競うゲームの時点で実務とは違いますが、特徴量エンジニアリングやメモリ使用量でも感じました。
Kaggleではスコアが上がるなら理由はどうあれなんでも使うという印象でした。
実務では顧客への説明責任があるので精度は向上するが説明性の悪い特徴量はあえて使わなかったり、展開性を考えて過度なパラメータチューニングは行わない場合があると思いますが、ゴリゴリ行われていました。
また、メモリについても運用観点から中間データやログを残しておくという考えはなく、RAMの30GBに処理を収めるためにガンガンデータを消しています。
参加して得られた学び
1. 説明変数の選択手法
今回のコンペで扱ったデータが集計方法によってはデータセットだけでKaggleで規定されているRAMの上限値30GBを超えてしまう大きさでした。
そこでまず全員、利用する特徴量の選択などメモリ使用量を抑える取り組みを強いられました。
私は今回以下の3つの手法を利用しました。
特徴量選択手法
- 相関係数によるフィルター法
- p値を利用した変数減少法
- Lasso回帰による埋め込み法
2. メトリックハッキング
今回のコンペは人によってはひどいコンペだったかもしれません。
メトリックハッキングによりスコアの算出方法を悪用して順位を上げる方法が発見されてしまったのです。
結局パブリックスコアのみ有効だったようですが、これにより途中からは本来の予測とは違う趣旨の分析が支配的になっていました。
評価指標の設定には最新の注意を払う必要があることを再認識しました。
3. メモリ節約術
メモリ使用量を抑えるためにint型でもint8に収まるところはint8にしてしまおうというような処理を使いました。
一般的な処理らしいですが、知らなかったのでコードを載せておきます。
for col in df.columns:
col_type = df[col].dtype
if str(col_type) == "category":
continue
elif col_type == bool:
df[col] = df[col].astype(int)
elif col_type != object:
c_min = df[col].min()
c_max = df[col].max()
if str(col_type)[:3] == 'int':
if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
df[col] = df[col].astype(np.int8)
elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
df[col] = df[col].astype(np.int16)
elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
df[col] = df[col].astype(np.int32)
elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
df[col] = df[col].astype(np.int64)
else:
if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
df[col] = df[col].astype(np.float16)
elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
df[col] = df[col].astype(np.float32)
else:
df[col] = df[col].astype(np.float64)
else:
continue
まとめ
初Kaggleコンペで実務との違いやメトリックハッキングなど珍事件を楽しむことができました。
Kaggleに参加した理由は社内でKaggle Grandmasterが行っている仕事に憧れたからです。
0.001を追い求めるKaggleと運用で回避策を考える実務では違いがありますが、データサイエンティストとしての技術を磨く場としてこれ以上のプラットフォームはないと感じました。
称号獲得を目指して引き続き参加していきます。