見出し画像

【Kaggle】 Goldを目指したけど、木っ端微塵に砕け散った話

note初投稿です。

KaggleのColeridge Initiativeコンペに参加しました。

今回が3度目のコンペで今までラッキーでSilverを取ったり、短期でちょろっとだけ参加してBronzeなど中途半端な成績で終っていたため、今回は「全力投球でGoldを目指す」と意気込んでの参加でした。

結果から話すと、Publicでは3rdで「ソロ金なるか!?」なんて思ってたりもしたんですが、大幅にShake DownしてPrivateでは55thでした。

画像1

・・・めちゃくちゃ悔しかったです笑
ですが、コンペ後、振り返ってみると完全に実力不足でまだまだ精進がいることを痛感しました。

失敗も多々ありましたが、学びも同じくらいあったので備忘録も兼ねて投稿します。
ポエム記事なのでQiitaやZennではなくnoteに投稿することにしました。
(単純にnoteで書いてみたかったというのもありますが)

1. コンペについて

1-1. 概要

科学論文内で引用しているデータセットを特定するコンペです。
「引用している」というのがポイントで単に論文中のデータセットを抽出するだけでは不十分であり、引用しているコンテキスト(ホストはRich Contextと呼んでいた)を特定し、その中で引用しているデータセットのみを抽出するのがコンペの目的となります。

1-2. データ

予測対象のデータとして科学技術論文が提供されます。
TrainとTestの概要は以下の通りです。
Train内の正解以外のラベルが多数Testに存在することやPublic Test内にTrainとの重複がある点などが大きな特徴となっています。

Train
    - 約14,000件
    - 約20,000のデータセットが正解ラベルとして与えられている
    - アノテーションが不完全で未知の正解ラベルが多数存在する

Test
    
- 約8,000件(Public 12%、Private 88%)
    - Public Testには一部Trainと同じ論文が含まれており、アノテーションされている以外のラベルも含めて予測する必要がある
    - Private TestにはTrainでアノテーションされているラベルと同様のデータセットはほとんど存在しない

1-3. 評価指標

評価指標はmicro F0.5 scoreでTPの判定にはJaccard係数を使います。
以下の式の通り、FNへの重み付けが軽くなっており、相対的にFPへのペナルティが大きくなるため、RecallよりもPrecisionを重視した方がよい指標になります。

画像2

2. Solution

Discussionに既に投稿しているのでここでは多くは話しませんが、以下の2段階の予測結果を組み合わせてデータセットを特定しています。

2-1. 追加ラベルを使ったテキストマッチング

論文中の正解ラベルを見てみると以下のような "the"+ ヘッドラインスタイルで書かれたデータセット名 + 括弧書きの略語 みたいな表現で使われていることが多いです。

the Alzheimer's Disease Neuroimaging Initiative (ADNI)

これを正規表現で抽出して出現頻度と辞書を使ったロジックでフィルタリングしました。
抽出した語群でLB ProbingしてたときにはPublic Scoreがガンガン上がって正直楽しかったです(笑)

2-2. 固有表現抽出(NER)

Trainの正解ラベルと1st Stageで抽出した語群などを使って、BIOシーケンスを生成して固有表現抽出器を訓練させました。

画像6

大まかなアーキテクチャはELECTRA + Bi-LSTM+ CRFでこれを実装したいというのがこのコンペの参加動機だったりします。

画像5

しかし、テキストマッチングベースのロジックでBIOシーケンスを自動生成してしまったため、本質的にはテキストマッチングとやっていることとあまり変わらず、1st Stageと組み合わせたときにあまりスコア改善はしませんでした。

3. 振り返り

最終Subの2つはベストSubではなかったのですが、いずれにしても銀圏だったため、金圏を目指すにはどうあがいても実力が足りていませんでした。
至らないところを上げるとキリがないんですが、主な敗因は以下の2つだと思ってます。

3-1. NERへのこだわりを早々に捨てるべきだった

2-2で書いたSolutionですが、本質的にテキストマッチングとやってることが変わらなかったため、続けてもScoreは上がっていなかったと思います。
Rich Contextの識別と組み合わせれば、可能性はあったかもしれませんが、そちらに関してはノーアイデアだったので早々に打ち切るべきでした。

これの実装がコンペの参加動機になっていたことやかなりの時間をかけていたこともあり、サンクコストと割り切ることができず、コンペ終盤までズルズル実験を続けてしまいました。
逆に正規表現ベースの2-1を突き進めていれば、ポテンシャル的には金圏を狙えたんじゃないかなと思ってます。(最終Subで選べたかどうかは置いておいて)

3-2. CVに代わる指針を決めずにコンペを進めてしまった

3-1とも関連していて正直これに尽きるかなと思ってます。
今回のコンペはTrainのアノテーションが不完全なため、信頼に足るLocal CVを構築するのが困難なコンペでした。

この部分に対策を立てなかったため、Public LBのScore以外の拠り所がない状態でコンペを戦い続けることになってしまいました。
正直、私のやっていたことはSolutionではなく、ただ自分のやりたいことを考えなしにやってただけということに他ならないと思います。
この対策がしっかりと打てていれば、3-1みたいな状態にもならなかったと思います。

最終Subを選ぶための指針は4位を獲得されたOsciiArtさんのTweetがめちゃくちゃ勉強になりました。
聞いてみるとめちゃくちゃ納得感あるんだけど、こういうことを開催期間中に迷わずできるようになるまでには時間がかかるんだろうなって思ってます。

成績は残念な結果に終わりましたが、学びのあるコンペだったとは思うのでもう少し、他の方々のSolution読んで復習しつつ、次のコンペでリベンジしたいと思います。

(おまけ)計算環境について

残り1ヵ月入るくらいまでKaggle Notebookのみを使っていたのですが、NERモデルの学習にあたってKaggleのGPU Quotaでは全然足りなくなってしまい、Colab Proを契約したのですが、滅茶苦茶良かったです。

画像3

具体的には以下の点でこれを月額1,000円ちょいで使えるのはかなり高コスパだと思います。
現状ではColab用のボイラープレートを書く必要があることくらいしかデメリットを思いつかないです。

    - 長時間放っておいてもセッション切れをほとんど起こさない(一晩放置でも大丈夫でした)
    - 無料版の最高スペック(P100:Kaggleと同じ)が最低ライン
    - GPUガチャでV100を引けると、P100よりも高速に実験を進められる
    - 24時間連続で稼働可能(無料版は12時間)
    - Proのみ使えるターミナル機能が便利

ターミナル機能についてですが、これはNotebookの実行中でも利用できるbashのことです。
うっかり連続稼働時間オーバーしそうになったけど、まだNotebook実行中みたいなときって、無料版だと身動きが取れなくなっちゃったりしますが、ターミナルが使えると途中までのfoldの重みはDriveに退避しておく、みたいなことができたりします。

画像4

せっかく契約して今月分もまだかなり日数あるので、早いうち別のコンペにも手を出していきたいなと思います笑

この記事が気に入ったらサポートをしてみませんか?