arutema47's blog

書いたり書かなかったり。

クソコンペオブザイヤー2021

よくぞこの記事に来てくれた。
褒美としてクソコンペに参加する権利をやろう

f:id:aru47:20211212193533p:plain

本記事について

クソコンペオブザイヤー2021(KCY2021)へようこそ!

どうも、クソコンペ愛好家のarutema47です。

本記事はKaggleアドベントカレンダー(裏)の12日目の記事となります。

よくKaggleが(仕事の)役に立たないと言われる要因として

  • データセットがキレイすぎて非現実的
  • 実際に仕事ではそのようなキレイなデータセットは手に入らない
  • 評価指標の設計こそデータサイエンティストの仕事として重要

という意見があり、ある程度的を得ていると思います。

一方でKaggleや他コンペサイトも常時キレイなデータセットかつ考え抜いた評価指標を提供しているわけではありません。評価指標のバグは日常茶飯事ですし、データのアノテーションバグなどもよくあります。ただこれらのバグに対しても指摘をすればすぐに対応してくれ、コンペに大きな支障があることは少ないです。

しかし明らかに狂ったデータセットやタスク設計のまま、最後までコンペが走ってしまうことが年に何度かあり、そのようなコンペはクソコンペの名を(主にTwitterで)冠します。これらのコンペにコミットしてしまうと中々辛いものがあるのですが、(良コンペからは決して学べない)反面教師として学べる事項が多いと思っています。

そのため本記事はクソコンペから反面教師として学びを得ることを主たる目的とし、特定ホストを中傷する意図はありません(炎上気味なタイトル付けといてなんですが)。またクソコンペの判断基準は著者独自のものです。もし他に取り上げたいコンペがありましたら、是非別記事を書いてみてください!

そして月刊Kaggleは役に立たないといった意見で"タスク設計やデータがキレイすぎる"と聞いた時はこのようなクソコンペも過去にったことをそっと思い出してください:angelface:

クソコンペを考える

KCY2021のノミネート前に著者が考えるクソコンペの要因を挙げます。端的にクソコンペとなりえる要因(以後クソ要因と略)は大きく4つほどあると思っており、それぞれブレークダウンしてみます。

クソ要因

  • A データセットの品質が低く、コンペに重大な支障がある
  • B タスク設計が悪い(今の技術では解くのが困難、評価指標が良くない)
  • C 致命的なリークがある
  • Dタスク設計に面白みがない(参加者目線ですが)

Aはまさに一番学びのあるクソ要因であり、本記事でも積極的に取り上げたいと思います。データセットの品質というと例えばラベルエラーがまず挙がります。後述するようにラベリングエラーが大きすぎるとモデル精度を正常に測ることができなくなってしまい、コンペが成り立ちません。

Bはタスク設計が難しすぎる・現在の技術では解くのが困難なため結果運ゲーとなってしまうコンペを指します。例えば6ヶ月後の株式を予測するコンペなどはタスク設計が難しすぎ、運ゲーとなってしまい参加者としてあまり面白みはありません(e.g. Jane Street Market PredictionTwo Sigma: Using News to Predict Stock Movements)。一方で同じ金融タスクでも短期間のボラリティ予測とタスク設計を工夫したOptiver Realized Volatility Prediction色々ありましたが最終的には比較的良コンペだったのではないかと思っています(Time-series APIを使用しなかったためリークはありましたが。。)。

Cは学習データと同様のデータが評価データに混入してしまう"リーク(Leakage)"と呼ばれる現象です。これが起きてしまうとモデル自体よりもLeakageを如何に活用するかを焦点として参加者がスコアを伸ばしてしまうのでコンペとしての面白みやホストの目的も形骸化してしまいます。

Dはあまり賞金ありコンペでは見られませんが、タスクがシンプルすぎる(出来ることがない)ためあまり学びのないコンペになりがちです。例えばよくplaygroundで設定されているflower classificationなどは特段やることがなく、アンサンブルゲー+運ゲーになってしまいがちです。

どうしたらクソ要因を減らせるのか?

それでは逆に良コンペの例を見てみましょう。

例えばatmacupでは運営が複数ベースラインを用意しある程度自らデータ解析を行いタスク難易度解析やスコア予測を行っていることが伺えます。

そのためこの段階で1)タスクに無理がないか?2)(すぐに見つかる)リークはないか?3)データ品質は適切か?といったパイプクリーニングを行うことができます。

このようにコンペを開く前にDSとデータ取得サイドで連携し、ある程度のベースラインを作ることでクソ要因の多くを取り除けるのではないかと思います。(言うは易し^^)

Shakeが大きいコンペがクソコンペか?

クソ要因Bの場合等、クソコンペでは大きいShakeが起きることがあります。一方でShakeが起きたからクソコンペ、という論調もたまにDiscussionでみますがケースによると思います。自分はShake要因が予想できたかどうか、というのが大きいと思います。例えば

  • 1 PublicとPrivate分布の違いが予め示唆されている、またはそれを解くのがコンペ目的の場合。(例:BengaliPANDAコンペ)
  • 2 そもそもPublicデータが少なく、trust CVが推奨される場合(例:OSICなど医療コンペに多い)

といった場合は大きなshakeが予想され、それへの対応も分析者の力量のうちとなります。

一方でタスク設計の不味さによってShakeが起きるとクソコンペ認定されるケースが多いのかと思ってます(例:Malwareタピオカコンペ)。

クソコンペを避けるには

クソコンペは傍から見ている分には面白いですが、真面目に参加すると痛い目に会います。そのため自分でクソコンペを察し回避することも重要となります。これらは経験などによって培われますが、どうしても初心者だが良コンペを掴みたい場合は

  • 1 Bestfitting特徴量
  • 2 金圏GM比率

などを見ると良いです。1についてですが、強い人はデータを見る嗅覚が発達しているのでヤバそうなコンペにはあまり参加しません。そのためKaggleRanking上位のBestfitting,Diter,Psi,Guanshuoが参加しているかをみてみると良いと思います。

2についてですが、強い方が参加しているのにも関わらずLBの金圏にほとんどGMがいないコンペはShakeが起きる可能性が大きいです。こちらはクソコンペとは限りませんが、耐shake体制を取りCVの切り方を注意深く見直す事が推奨されます。

KCY2021 グランプリ候補

ようやく本題のクソコンペオブザイヤーのグランプリ候補について述べます。

また繰り返しとなりますが、本記事ではクソコンペから教訓を得るのが目的であり順位付けなどはしません。そのため挙げるコンペの順番は順不同です。

Kaggle Cassava Leaf Disease Classification(タピオカコンペ)

f:id:aru47:20211212193736p:plain

www.kaggle.com

  • arutema参加: あり

アフリカの主要な農作物であるタピオカの病気を低画質スマホカメラ映像から判別可能なAIシステムを作るー社会的インパクトの極めて高いコンペ開催に参加者は盛り上がり、結果として3900チーム以上を集めた。タスクも単純で事前コンペも開催しているから品質も大丈夫なハズ、そう信じて多くのKagglerがGPUに火を付けた。

しかし何をやってもスコアが上がらない。そして音信のないホスト。混迷と迷走の3ヶ月の後に参加者に待っていたのは盛大なshakeであった。

f:id:aru47:20211212194756p:plain

クソ要因

データセットの品質(特にラベリング品質)がtrain/testともに低いのが厳しいコンペでした。

ベースラインモデルの混乱行列を見てみると

f:id:aru47:20211212195421p:plain

とclass:0(Cassava Bacterial Blight)とclass:4(健康)のクラスが異様に精度が低いのがわかります。

f:id:aru47:20211212195546p:plain

特にclass0と4は取り違えやすく、目で見てもほぼ健康にしか見えない画像が病気としてラベルされておりラベリング品質が低くかったです。 Trainがノイジーなのはともかく、Testのラベルもノイジーで低品質だと正常にモデル評価することは難しく、"俺は何をやらされているんだ?"感が強かったです。 (PublicとPrivateは相関していたことからPrivateラベル品質も同様に低かったかと思います)

教訓:ラベリング仕様について固めずにデータだけ取ってしまうと低品質なデータセットが出来上がってしまう。病気と健康を分ける定量的なクライテリアを用意し、ラベリング仕様として反映するべきだった。

Leak疑惑

www.kaggle.com

一位はPublic/Privateの完全優勝を達成しています。1位と2位参加者が精度向上のキーとして挙げていたのはTensorFlowHubにホストが上げていたCropNetというモデルであり、これをアンサンブルに加えることでスコアが大幅上昇したそうです。ノイジーなデータでこのようにモデル一つが効くことは怪しく、ホストはtestデータで学習したモデルをHubにアップロードしていたのでは?という疑惑が残りました。

RSNA-MICCAI Brain Tumor Radiogenomic Classification

f:id:aru47:20211212193827p:plain

www.kaggle.com

  • arutema参加:エアプ

RSNAコンペにクソコンペなしーそう言われるほどRSNA主催コンペは定評があり、今回もGunaxioとBestfittingが名勝負を繰り広げてくれると誰もが期待した。

しかし蓋を開けてみると早々にProbingによるLB崩壊、盛り上がらないディスカッションと暗雲が漂う。

俺達のRSNAならきっとどうにかしてくれる。。という願いも届かずPrivateは散々なshakeだった。

f:id:aru47:20211212200625p:plain

クソ要因

中の人変わった?という声も聞かれるくらい過去のRSNAとは打って変わった運ゲーのクソコンペであった。Discussionを見るとランダムで推論した方がEfficientNetより性能が出た*1CV,LB,PB全てが乖離していたと言う声があり、機械学習で解けるタスクだったかという根底が怪しく、ホストのベースライン作成が疎かだった可能性がある。1位のチーム名が"I hate this competition"だったことから闇の深さが伺える(なお順位確定後にI love this competitionに変わった)。

画像データを使ったレモンの外観分類(レモンコンペ)

f:id:aru47:20211212193915p:plain

signate.jp

我ら日本国が誇るコンペサイトSignateから通称レモンコンペが堂々のエントリーを果たした。

ルールにあるアンサンブル禁止令に若干の不安と炎上を挟みつつもレモンの品質等級検知という社会実装であり注目度も高く、賞品のレモン10kg欲しさに大勢の参加者が集まった。

しかし初日から評価指標がQuadratic WeightedKappaにも関わらず0.99を叩き出すぶっ壊れ具合と運営の明後日に向いた回答でTwitterは大荒れ。一夜にして時のコンペになった。

クソ要因

QWKで0.99..を出すのはいくら問題が簡単でも難しく、リークが原因だった。

リーク内容

配布されたデータは同一レモンを異なる角度で撮影したものが使い回されており、更に同じレモンがtrainとtestに跨って使用されており過度に精度が出る要因となった。また配布データ名も乱数化されておらず日時データのままだったため、ファイル名を降順に並べることでtestにおけるレモンのラベルをtrainデータから容易に類推することができた。(更に撮影時間でラベル情報を区切っていたため、レモンを見ずにファイル名から完璧にラベルを推定できることが参加者から報告された)

一方でこのようなリークは失敗事例であると同時にビジネス界では共有されない貴重なノウハウであると思います。ここまで詳しく書いているのもホストを叩く意味ではなく、事例から学ぶためです。

一度でもスタッフ側でベースラインを作っていたら予防できた事態なのではないか、と傍から見ていて思いました。また農作物といったデータは集めるのが大変なので少数データ収集→データ分析上問題ないかDSサイドでベースラインを作りリーク、タスク難易度確認→本格的にデータ収集といくつかのフェーズに分け収集側とDS側でコミュニケーションを取りつつプロジェクトを進めないと後々大変な事態になるな、とも感じました。

trainデータをtestに含めては行けないという原理原則、そしてデータセットの作成には気をつけないと大変なことになる等様々な酸っぱい教訓をレモンコンペは俺達に教えてくれました。

その後

結局trainデータはそのままに、testデータはリークをなくしたものを再収集しそちらで評価するという手はずになった。運営の対応は(初動はアレにせよ)誠実で他2つと比べ参加者とのコミュニケーションは取れていました。しかし等級分類よりもtrainに存在するリークを如何にして無くすかというのが高得点を取る主眼となってしまい、参加者が本質のタスクに集中できなかったため(また開催前に初歩的なリークを見破れなかった残念さもあり)KCYに入れました。

(追記:アップデートされたTestデータの色味が大幅に違ったようです。こちらのブログに詳しくまとまっております。)