Shingoの数学ノート

プログラミングと機械学習のメモ

Kaggle失敗談 ~Tweet Sentiment Extraction~

日付:    カテゴリ: Kaggle


はじめに

Tweet Sentiment Extractionコンペに参加のみなさま、お疲れ様でした。

該当コンペは、以下のURLです。

https://www.kaggle.com/c/tweet-sentiment-extraction

自分は何度かKaggleに挑戦していましたが、久々にしっかりやったコンペでした。

結果は以下の通りです。

Pubric

Private

ど う し て こ う な っ た 。

メダル取ったら、こんなソリューションでやりましたとか考えていたのが恥ずかしい

あまりに悔しかったので、次に生かせるよう自戒としてブログを残すことにします。

何故こんなに落ちてしまったのか

さて、こんなに落ちた原因を探ってみましょう。

まず、リーダーボードをみると、40位以下あたりからランキングが激動してるのに対し、40位以上は比較的安定しています。つまり、Shakeしやすいコンペでも安定させるやり方はあるということですね。

自分なりにダメだったと思う点を挙げます

  1. コンペで差がつくポイントを蔑ろにしていた。(後述)
  2. 早々にアンサンブルしてスコアを上げようとしていた。
  3. アンサンブルすればモデルは上がりやすいので、とにかくアンサンブルしてしまっていた。結果、Public LBに過学習してしまっていた。

  4. CVではなく、LBでモデル評価してしまった。
  5. 早々にアンサンブルしたため、CVよりもアンサンブル結果のLBのスコアで判断してしまった。これからは、手元のCVを算出し、それを評価していきたい。(Excel等にCVとLB結果をまとめる作業をしたい。)

  6. 激動しやすい要素があったのに、ないと信じてしまっていた。
  7. シード値によってスコアが変わること、ブレンドの比率を少し変えるだけでスコアが大きく変動したことを考えると、激動しやすい要素があったのではないかと想像がつく。(結果論)

要は、 Trust CVですね。アンサンブルによるLBの上昇を信頼すると痛い目に会うことがわかりました

Tweet Sentiment Extractionの本質

コンペ概要

このコンペは、 tweet本文と感情が与えられていて、どの部分がその感情の根拠となっているかを当てるというタスクです。基本的には、文の何文字目から何文字目までかを当てるものですね。

問題点

まあここまでなら普通にBERTとかできそうなんですが、アノテーションと評価指標のコンボがなかなか鬼畜なコンペとなっています。

たとえば、以下のようなテキストです。

text Im @ the dentist ....scary people here...
selected text .scary

selected textのピリオドなんやねんという。さらに、評価指標はspace区切りでのジャッカード係数のため、「.scary」を正確に予測しなければなりません。「scary」では0です。きつい。

ですので、コンペはこのよく分からない区切りを正確に当てる必要があり、これが精度をあげる肝だったわけですね。

これにより、単純にspace区切りで単語分割したり、デフォルトのBertTokenizerで処理をすると、この謎区切りはうまく表現できません。

自分は、前処理でやるのは諦めて、ピリオドを一律で1つにしたり、それっぽくデータを後処理していました。

コンペ上位者の解法

しかし、上位者のコードを見ると、以下のことをしています。

  • ピリオド等を1つずつに分割するようにTokenizerを変える。
  • 様々なモデルから文字ごとに確率を算出し、アンサンブルする。

なぜ私はコンペ中後処理ばっかり考えて、前処理で分割することを考えなかったのか… やはり、上位陣との差はここだったのかなと思いました。

やってよかったこと

まあ、これだけ見ると自分が何もしなかったように思えるので、一応やったことを記しておきます。

  1. 評価指標の定義から、selected textの長さが短いとスコアが0になる確率が高いので、そこを重点的に重みをつけて学習させた。(+0.002)
  2. ↑は残差分析により判明した。残差分析大切。
  3. kernelにはtensorflowとpytorchのモデルが混在していたので、全てpytorchに統一した。(1dimCNNの実装はtransposeが入ったりして少し面倒臭かった。)
  4. positive、negativeの頻出単語を上からカテゴリ分けし、output層にemmbeddingして足した(これは精度上がらず…)
  5. 諦めないで提出し続ける。

次回はメダル取れるように頑張ります。


Comment Box is loading comments...