2018年のKaggleの"leak"を眺めてみる
はじめに
2018年のKaggleでは、何かと "leak" という単語が話題になった印象があります。
https://www.kaggle.com/docs/competitions#leakage
今回は、Meta Kaggleのデータを分析し、2018年のコンペで話題になった "leak" を眺めてみました。
分析の概要
- 2018年に公開された全てのdiscussionから、タイトルに "leak" を含むものを抽出
- ただし対象コンペは、2018年に開始したレート変動を含むものとする
対象コンペの抽出
discussionに関するデータセットには、コンペ名が記載されていませんでした。今回は "ForumId" をキーに結合することで、discussionとコンペ名を紐づけます。
compe = pd.read_csv("Competitions.csv") # datetime型に変換し、開始日が2018年のデータを抽出 compe['EnabledDate'] = pd.to_datetime(compe['EnabledDate']) compe2018 = compe[compe['EnabledDate'].dt.year == 2018] # レート変動を含むコンペに絞る compe2018 = compe2018[compe2018['CanQualifyTiers']] # ForumIdがfloat型だったので、int型に変換 compe2018['ForumId'] = compe2018['ForumId'].astype(int)
全17件のコンペを抽出できました。
"leak" を含むdiscussionの抽出
df = pd.read_csv("ForumTopics.csv.zip") # datetime型に変換し、作成日が2018年のデータを抽出 df['CreationDate'] = pd.to_datetime(df['CreationDate']) df2018 = df[df['CreationDate'].dt.year == 2018] # タイトルに "leak" を含むデータの抽出 df2018 = df2018[df2018['Title'].str.lower().str.contains('leak', na=False)]
タイトルに"leak" を含むdiscussionを抽出できました。なお事前に大文字を小文字に変換した上で文字列検索しているため "Leak" なども抽出できています。
データの結合
これら2つのデータを "ForumId" をキーに結合します。
merged = pd.merge(compe2017[['ForumId', 'Title']], df2017, on='ForumId', how='left') merged[['Title_x', 'Title_y', 'TotalMessages', 'CreationDate']].sort_values('CreationDate').reset_index(drop=True)
時系列順に "leak" を含むdiscussionをコンペ名と紐づけて表示できました。
結合結果がNullになったコンペ、すなわち一度も "leak" を含むdiscussionが投稿されなかったコンペは下記の通りです。
結果を眺める
「Santander Value Prediction Challenge」の登場回数が圧倒的に多いですね。
登場回数が1件より多い、上位の3つのコンペを少し詳しく見てみます。
merged['Title_x'].value_counts()
Santander Value Prediction Challenge 26 TalkingData AdTracking Fraud Detection Challenge 4 Airbus Ship Detection Challenge 3 RSNA Pneumonia Detection Challenge 1 Google Landmark Recognition Challenge 1 Google AI Open Images - Visual Relationship Track 1 TrackML Particle Tracking Challenge 1 Home Credit Default Risk 1 Quick, Draw! Doodle Recognition Challenge 1 Avito Demand Prediction Challenge 1 2018 Data Science Bowl 1 PLAsTiCC Astronomical Classification 1 The 2nd YouTube-8M Video Understanding Challenge 1 Google Landmark Retrieval Challenge 1 TGS Salt Identification Challenge 1 Google AI Open Images - Object Detection Track 1 Inclusive Images Challenge 1
Santander Value Prediction Challenge
このコンペでは、IDとカラムをうまく並び替えることでtargetの値が分かる "leak" がありました。後に優勝するGiba氏によって "leak" が暴露されると、探索方法や見つけた個数などが活発に議論され、多くのスレッドが立てられました。
TalkingData AdTracking Fraud Detection Challenge
このコンペでは、未来の情報を特徴量として利用できました。この意味でのモデルの "leak" が話題に挙がったと認識しています。
http://www.matthewemery.ca/presentation/talking-data/#/17
また4thの方の解法として、重複するデータに異なるラベルが付与される "leak" があったそうです。
As you have all noticed, there were duplicate samples with different labels.
Solution to Duplicate Problem by Reverse Engineering (0.0005 Boost) | Kaggle
このコンペは十分にdiscussionを終えていなかったので、他に記載するべき情報があれば教えてください。
Airbus Ship Detection Challenge
このコンペでは、テストデータの画像が学習データの画像をシフトしたものだと判明しました。最終的には中断期間を経て、新たなテストデータが用意されました。
Data Leak and Next Steps | Kaggle
[追記 20181230]
今回の集計からは漏れたコンペ
2018年のKaggleを追っていた方は、いくつかのコンペが漏れているとお気づきかもしれません。
筆者が把握している限り、次のコンペでは "leak" に関する話題がありました。
- TGS Salt Identification Challenge
- Two Sigma: Using News to Predict Stock Movements
- Google Analytics Customer Revenue Prediction
本記事でこれらを抽出できなかった理由ですが、1つ目の塩コンペの場合は "leak" ではなく "puzzle" という表現が使われていたためです。
残りの2つについては、Meta KaggleのCompetitions.csv内に、まだ終わってないコンペは入っていないのが原因でした。
Two Sigmaコンペは2ステージ制なのですが、1stステージの予測対象が過去の株価であったため、外部データを参照することで値を当てられる仕組みになっていました。しかし最終的な順位決定には未来のデータを利用する(2ndステージ)ということで、運営の判断としてコンペは続行されています。
Rコンペは、テストデータにGoogle Analyticsのデモ用のデータが使われていると判明し、テストデータを変更して再始動することになりました。
Competition Relaunch Details | Kaggle
またPlaygroundのコンペですが、PUBG Finish Placement Prediction (Kernels Only)でも "leak" があったようです。
Data Leak and Next Steps | Kaggle
[追記おわり]
おわりに
本記事は、Meta Kaggleのデータを分析し、2018年のコンペで話題になった "leak" を眺めてみました。年末のお遊びなので、特にオチはないです。
2018年のKaggleのLeakage事例集って記事を書こうかと思ったが、よく考えなくても、特に来年へ学びを得られるものが無さそうだなあ。読み物としては普通に面白そうだけど。
— u++ (@upura0) December 10, 2018
タイトルだけでなく、discussionの中身に "leak" の文字列がある場合を考慮に入れても良かったかなと思っています。あと今回は割愛しましたが、同様の分析を年別に実施することで、「本当に今年 "leak" が多かったのか」の確認もできそうな気がしました。
実装はGitHubで公開しています。