Kaggle「Disaster Tweets」で非リーク純粋モデル 0.84400(トップ1〜2%相当)を目指した話

Kaggle「Disaster Tweets」で非リーク純粋モデル 0.84400(トップ1〜2%相当)を目指した話

Kaggle「Disaster Tweets」で非リーク純粋モデル 0.84400(トップ1〜2%相当)を目指した話

Kaggleの「Getting Started」コンペ Natural Language Processing with Disaster Tweets に挑戦しました。ツイート本文から「本物の災害を報告しているか(target=1)」「比喩や日常会話か(target=0)」を 当てる二値分類タスクです。

このコンペは歴史が長く、リーダーボード上位は元データ(Figure Eight社の公開アーカイブ)を テストデータと完全突合してラベルを書き写す「リークハック」で埋め尽くされています。今回はそれを一切使わず、 純粋な言語モデルだけでPublic LB 0.84400(ローカル5-Fold OOF F1: 0.81355、最適閾値: 0.47)を 獲得しました。

今回も Google Gemini 3.5 Flash(EDA)→ Google Gemini Deep Research(戦略立案)→ Google Antigravity(実装・自律実行) という3段階のAI主導ワークフローで進めました。月額2,900円の Gemini Proだけでこの規模のエンジニアリングを再現できています。仕上げのスライドはNotebook LMで作成し、 編集はいつも通りPowerPointです。


「満点」はチート。本当のトップティアはどこにあるか

Deep Researchで作らせた戦略ドキュメントは、最初にこのタスクの本質を「2つの分岐」として 整理していました。

  • Pure MLライン:Transformerと敵対的学習で汎化性能を極限まで詰める。目標F1 0.85+
  • リークハックライン:元データを特定して正解ラベルを直接上書きする。目標F1 1.0(パーフェクト)

リークハックは機械学習としての価値がなく「答えの丸写し」に過ぎません。今回はPure MLライン 一本で攻め、非リークモデルとしての実用上の限界値に迫ることを目標にしました。

EDAでわかったこと

Google Gemini 3.5 FlashにEDAを任せたところ、3つの重要インサイトが浮かび上がりました。

訓練データは7,613行、テストデータは3,263行。location列は約33%が欠損しており、 表記揺れ(USANew YorkEverywhereなど)も激しいため、そのまま 特徴量に使うのは危険と判断しました。

ターゲット分布は非災害57.0%・災害43.0%とほぼバランスしており、多数決分類器のベースライン 精度は57.0%でした。文字数・単語数そのものよりも、URLの数メンションの数の 方が強力な識別シグナルであることも判明しています。

キーワード分析では、derailment(脱線)、wreckage(残骸)、 debris(瓦礫)など90%以上の高い災害率を持つ語がある一方、aftershock(余震)や blew upのように日常会話の大げさな比喩表現として頻出し、災害率が極端に低いキーワード も見つかりました。単語の出現有無だけで判断するシンプルなモデルは、この「比喩表現の罠」で誤分類を起こします。

潜んでいたデータの罠:ラベル矛盾

データの重複状況を調べると、同じツイート本文でありながらアノテーターの解釈違いで 異なるラベル(0と1)が付与されている行が見つかりました。EDAの時点では179行の重複(69件のユニークテキスト)の うち18件でラベルが競合していると見積もっていました。

実際にモデル構築段階でテキスト完全一致に基づいて精査したところ、111件の重複・ ラベル矛盾行が特定されました(EDA時点の見積もりより広い基準での集計です)。これらは損失関数の 勾配計算を混乱させるノイズなので、クレンジングが必須という結論は変わりません。


モデル構築:伝統的MLからTransformerへ

まず、各一意テキストのラベル平均値を求め、多数決投票(Majority Voting)で支配的な ラベルへ統一しました。これにより訓練データは 7,613行 → クレンジング後7,502行 に整理され、 学習の安定化につながっています。

テキストの前処理方針も、伝統的なBag-of-Words系とTransformer系では真逆になります。 ストップワード除去やステミングは文脈を破壊してしまうため、Self-Attentionを使うTransformerには不向きです。 代わりに、URL([URL])やユーザー名([MENTION])を共通の特殊トークンに置換し、 won't → will notのような短縮形を展開して未知語(OOV)の発生を最小限に抑えました。

さらにkeyword情報が存在する場合は keyword: {keyword} | text: {text}というフォーマットで本文と物理的に結合し、 アテンション機構がキーワードと文脈の相互作用を捉えられるように入力を設計しています。

計画と現実のズレ:DeBERTa-v3-largeからRoBERTa-largeへ

Deep Researchの戦略ドキュメントは「もつれ戻し注意機構(Disentangled Attention)」を持つ DeBERTa-v3-largeを絶対的な最適解として推奨し、敵対的学習SiFT(Scale-invariant Fine-Tuning) の併用を提案していました。ところが実際にPyTorch環境で学習を回すと、DeBERTa-v3は勾配計算が不安定になり NaN lossが頻発。そこで、Twitterのような短文・ノイズの多いテキストに対して極めてロバストに収束する RoBERTa-large(355M params)にバックボーンを切り替え、敵対的学習は同系統の FGM(Fast Gradient Method)を採用しました。

FGMは、埋め込み空間上の単語ベクトルに逆伝播の勾配方向へ微小なノイズ(ε=0.5)を加えた状態で 損失を計算し、重みを更新する仕組みです。これにより、わずかな綴りミスや見慣れない地名に対しても予測がブレない 頑健性を獲得しました。

データクレンジング → 前処理 → RoBERTa-large + FGM → 検証 → 閾値最適化、という一連の パイプラインを図にするとこうなります。

検証はクラス割合を維持した5-Fold Stratified K-Foldで実施し、本番の予測性能と完全に 相関する評価ループを構築しました。通常の閾値0.5ではなく、5フォールド全ての検証予測(Out-of-Fold)をプールし F1スコアを最大化する閾値を[0.30, 0.70]の範囲でグリッドサーチした結果、最適閾値は0.47でした。


結果:非リークモデルとしての実用上の最高峰

データクレンジング(111件のラベル矛盾を多数決で排除)、FGM敵対的学習、閾値最適化(0.47)の 3本柱により、ローカル5-Fold OOF F1 0.81355 から Kaggle Public Leaderboard 0.84400 まで 伸ばすことができました。

このコンペのリーダーボードを俯瞰すると、以下のような位置づけになります。

スコア帯位置づけ
1.00000リークハック(チート)。機械学習としての価値はなし
0.85000〜0.86000非リークにおける理論上の限界値(大規模アンサンブル+疑似ラベル)
0.84400(今回)チートなしモデルとして最高峰。トップ1〜2%相当
0.82000〜0.83500標準的なBERT-base/RoBERTa-baseのファインチューニング
0.78000〜0.81000TF-IDF+古典的ML、Bi-LSTMなど
0.57000多数決ベースライン

学習から提出ファイル生成までの全パイプラインの実行時間は約2時間34分36秒(154分)。 RTX 3060(12GB VRAM)上でPyTorch 2.6.0 + CUDA 12.4を使用しています。5-Fold CV(5倍)× FGM敵対的学習 (約2倍)× RoBERTa-largeの高負荷、というのがこの実行時間の内訳です。

次にやるとしたら

スコア0.84400はすでに高水準ですが、非リークモデルの極限(F1 0.85以上)に近づくための ロードマップも整理しました。短期的には、DeBERTa-v3-large(学習率を2e-6〜5e-6まで下げ、AdamWの eps=1e-6を使えばNaNを回避できることを確認済み)やELECTRA-largeとのブレンディング、 Twitter特有のメタ特徴量(URL数・ハッシュタグ数など)をRoBERTaの埋め込みベクトルと結合するメタ特徴量 スタッキングが候補です。

中期的には、テストデータのうち自信度が極めて高い(確率0.95以上または0.05以下)サンプルに 疑似ラベルを付与して再学習する半教師あり学習と、バリデーションで誤分類したサンプルを目視で確認する エラー分析によるデータセントリックなクレンジングを検討しています。


まとめ

The Benchmark:リークデータを排除した純粋な言語モデルで、実用性の 理論限界に迫るスコア(0.84400)を証明。

The Engineering:FGM敵対的学習と厳密な閾値最適化(0.47)の組み合わせが、Twitter 特有のノイズ環境下での汎化性能の鍵になった。

The Paradigm:GeminiとAntigravityによるAI主導ワークフローが、リサーチから実装までの 時間を劇的に圧縮し、高度なML設計を低コストで実現した。

計画と現実のズレも収穫:Deep Researchが推したDeBERTa-v3-large + SiFTは理論上の 最適解でしたが、実際の学習ではNaN lossで崩壊。RoBERTa-large + FGMへの切り替えという「うまくいかなかった 実験も記録しておく」姿勢が、最終的な安定性につながりました。

The ultimate battle is always isolating the signal from the noise.
(究極の戦いは、常にノイズからシグナルを分離することにある)

ML/AI/Kaggleカテゴリの最新記事