2021.12.17

Kaggle人生を振り返って

Kaggle Masterによるこれまでに参加したデータ分析コンペの振り返り

Kaggle Masterによるこれまでに参加したデータ分析コンペの振り返り_サムネイル

こんにちは、AITC 製品開発グループ 阿田木です。

私は現在、業務でAI製品の開発に携わっております。さらに、趣味としてもKaggle等のデータサイエンスのコンペに参加して日々技術を磨いております。

今年の6月でKaggleに出会ってから約1年が経過し、目標であったKaggle Masterになることができました。この節目に、Kaggle Masterになるまでの道のりを振り返っておこうと思います。

本記事では技術的な内容にはあまりふれておりません。ポエムみたいな感じの自分語りとなっている点ご留意お願いいたします。

以下のような構成となっておりますので、気になったところだけでも、ご覧いただければ幸いです。

  • Kaggleとは?
  • Kaggleとの出会い
  • 参加コンペ①: メラノーマコンペ SIIM-ISIC Melanoma Classification
    皮膚の画像からメラノーマ(悪性黒色腫)である確率を予測するコンペ
  • 参加コンペ②: 鳥の鳴き声分類コンペ Cornell Birdcall Identification
    音声データにどの鳥の鳴き声が含まれているかを分類するコンペ
  • 参加コンペ③: 作用機序コンペ Mechanisms of Action (MoA) Prediction
    作用機序(薬の働き)を予測するコンペ
  • 参加コンペ④: RANCRコンペ RANZCR CLiP - Catheter and Line Position Challenge
    胸部X線写真を用いて、ラインやチューブが最適な位置にあるかどうかを検出するモデルを作成することを目的としたコンペ
  • 参加コンペ⑤: HPAコンペ Human Protein Atlas - Single Cell Classification
    顕微鏡画像内の各細胞のタンパク質オルガネラ局在化ラベルを予測するコンペ
  • まとめ

Kaggleとは?

Kaggleとは、世界中のデータサイエンティストが腕を競い合うプラットフォームです。

Kaggleの参加者にはTiersと呼ばれるランクが設けられており、コンペなどでメダルを獲得していくことで昇格することができます。ランクは下から、Novice、Contributor、Expert、Master、Grandmasterですが、その中で自分はMasterの称号を得ることができました。

Kaggle Masterは、世界で約1600人/770万人中、日本には200人程 (2021年9月現在)おります。

昇格条件としては、コンペでの成績によって授与されるモデルを、Goldメダル× 1、Silverメダル×2以上取得する必要性があります。Goldメダルが上位10人前後しかもらえず中々獲得できないため、Kaggle Masterになることは簡単なことではないといわれております。

kaggleのTiers

各メダル取得条件

kaggleの昇格条件

そんな中、幸いにも、戦略がうまくはまり、2回目で参加したコンペでGoldメダルを獲得することができました。そのあとも、スコア(精度)が上がるとともに順位が上がっていく感覚に脳内麻薬がドバドバでて、やめられない身体になってしまいした(※スコアが改善しない間は相当に精神が参る)。

この一年、色々なコンペに参加してきましたがどれも思い出深いものとなっております。そこで、参加した中で特に思い入れのあるコンペ5選とKaggleとの出会いについて簡単に振り返っていこうと思います。

Kaggle との出会い

実のところKaggleとの出会いはあまり覚えていません。気づいたら始めていました。早く手を動かして「動くものを作りたい」という意識から始めたとやんわり記憶しております。

そもそも私自身は機械学習なるものを学んだのが社会人になってからでした。社会人になってから、毎日、日経新聞を読む中で、至るところでAI活用があげられており、これからはそういう時代なんだという焦燥感はありました。

また、前職で医療機器メーカーの工場の生産技術を担当していたこともあり、現場を改革していくために、AIやデータ分析が活用できないかとういことは常々考えておりました(AIの勉強を始めてから、どういうデータが足りないかやどれくらいの力量で作業すればうまくいきそうかを考えられるようになったと思います)。

もともとAIには大学時代から興味があったこともあり、大学院時代の奨学金を資金に、AI技術に関する著名な書籍をまとめ買いして読み漁ったり、AIモデル学習に十分なスペックのPCを購入して自力で環境構築したりしていました。

初めは書籍等で勉強しておりましたが、やっている感があまりなく、実際に自分の手を動かして作成したモデルで課題解決できる環境としてKaggleを知ったという経緯があります。

参加コンペ①:メラノーマコンペ SIIM-ISIC Melanoma Classification

皮膚の画像からメラノーマ(悪性黒色腫)である確率を 0.0から1.0の間で予測するコンペです。本コンペは戦略がうまくはまりGoldメダルをとることができました。

本コンペは、Code competition(推論をKaggle内で行って結果を提出する形式)ではなく、推論はローカルで行って推論結果をまとめたSubmissionファイルだけを提出するものでした。

そのため、テストデータは確認できる状態で、偽陰性の疑いがあるか否かを画像レベルで確認することができました。複数のモデルの予測結果を比較して、公開されているLBスコア(テストデータの何割かの結果に対してLeaderBoardに表示されるスコア ※コンペ終了時には残りテストデータに対してもスコアが反映される)の結果が良くないモデルでも、陽性と思われる画像もきちんと陽性と予測しているモデルをアンサンブルする戦略をとった結果、コンペ終了前後でのスコアの揺れを抑えることができ、上位に生き残ることができました。


学んだこと・感じたこと:

前職の医療機器メーカーで働く中で、医療分野の感度(正しく陽性と判定できる割合)の大切さを聞いていたこともあり、病気であるのに病気でないと診断してしまうような偽陰性を示すことはあってはならないという信念がありました。

その信念の下、モデル間で偽陰性の疑いがないかを比較して重点的に確認できたことで、オーバーフィッティングの危険性に気付くことができました。

最近のコンペでは、テストデータがどういうものか確認することができなくなっているものが多いため、今回のような対応は難しくなってきました(OOF:Cross VaridationのOut Of Fold (Prediction)である程度は判定できる)。それでももし、テストしたいデータが確認できる状態である場合は、どういったものかを確認しておくことは大事な習慣であると感じました。

参加コンペ②:鳥の鳴き声分類コンペ Cornell Birdcall Identification

音声データにどの鳥(264種類)の鳴き声が含まれているかを推定するマルチラベル分類のタスクです。

Code competitionであるので、推論はKaggleのカーネル上で行う必要がありました。大筋の解法としては、音声データをLogmel変換したメルスペクトログラムを画像としてとらえ、特徴抽出に2D CNNベースのモデルを使用し、CNNの特徴マップで分類するというものでした。

ただ、検証データに対する結果とテストデータに対する結果が全く連動しておらず、色々と辛いコンペだったのを覚えております。終始、メダル圏付近だったこともあり、メダルはとってやろうの精神で最後まで走り切れました。(コンペ終了時には残りテストデータに対してもスコアが反映される)の結果が良くないモデルでも、陽性と思われる画像もきちんと陽性と予測しているモデルをアンサンブルする戦略をとった結果、コンペ終了前後でのスコアの揺れを抑えることができ、上位に生き残ることができました。

メルスペクトログラム

[引用] メルスペクトログラムの画像
https://qiita.com/shinmura0/items/6befb83f7cde7b091905


学んだこと・感じたこと:

このコンペを通して音声認識の手法に触れることができました。さらに、Kaggleに取り組む上で最も重要といわれる忍耐力を鍛えることもできました。

参加コンペ③:作用機序コンペ Mechanisms of Action (MoA) Prediction

Mechanisms of Action (MoA) = 「薬の働き」を予測します。MoAとは薬物の作用機序のことであり、薬が治療効果を及ぼす仕組みのことです。

本コンペは、MoA予測アルゴリズムの改善を通じて医薬品開発を前進させることを目的としています。

タスクは、マルチラベル分類です。データ1サンプルに対して1つのラベルが与えられているマルチクラス分類と異なり、マルチラベル分類ではデータ1サンプルに対して複数のラベルを予測します。

マルチラベル分類ということで、GBDT系の勾配ブースティングは使用しませんでした。代わりにNN系のモデルを複数採用しました。理由としては、GBDTは各サンプルに対して1つのラベルを予測することに特化したモデルだからです。

今回、NN系モデルを複数作成することに注力した結果Silverメダルを獲得できるスコアを出すことができました。マルチラベル分類タスクを解くに際してはNN系のモデルを採用するのが良いと思います。

本コンペの結果で、Kaggle Masterまで王手となりました。


学んだこと・感じたこと:

MoAのような連続値のテーブルデータでマルチラベル分類を行う場合はTabNetやMLPが役立つことです。TabNetについては以下で詳しく説明されています。

TabNetとは一体何者なのか?https://zenn.dev/sinchir0/articles/9228eccebfbf579bfdf4

この辺から、テーブルデータでもGPUを使うことが多くなってきたため、GPUを搭載した高性能なPCが必要と感じるようになりました。

参加コンペ④:RANCRコンペ RANZCR CLiP - Catheter and Line Position Challenge

本コンペは、胸部X線写真を用いて、ラインやチューブが最適な位置にあるかどうかを検出するモデルを作成することを目的としていました。まずやったことは、より高性能なPC(VRAM:24GB) の購入です。すごく高い買い物でしたが、学習を気軽に高速に回すことができ大変満足しております。

医療系画像では、その複雑さから画像サイズが大きいほど精度がよくなるという傾向もあり、このコンペでは、手に入れたPCがフル稼働しておりました。その甲斐もあり、公開されているLBの順位は常にSilver圏以上を確保できておりました。

しかし最終結果は、シェイクアップ(公開されていない未知のデータに対しての順位と公開されている順位との乖離)してしまい、Bronzeメダル圏でした。あと、15位上ならKaggle Master昇格だったので非常に悔しい思いをしました。


学んだこと・感じたこと:

本コンペは比較的シェイクアップが小さいコンペでしたが、Gold圏を狙ってより尖ったモデル(バリアンスが高い)を提出してしまい見事に散ってしまいました。(公開されているLBの順位では20位前後でかなり上の方だったので、外れてもそこまでシェイクアップしないだろうと思っていた・・・)。

このことから、やはり検証データに対するスコアと公開されているLB スコアが相関のあるモデルを信じておくことは大事であると実感しました。人間欲を張ったらいいことありませんよという教訓です。

参加したコンペ⑤:HPAコンペ Human Protein Atlas - Single Cell Classification

本コンペでは、顕微鏡画像内の各細胞のタンパク質オルガネラ局在化ラベルを予測します。正直、RANZCRコンペでKaggle Masterに昇格することを確信していたので、かなり悲壮感をもって参加したのを覚えております。

本コンペのタスクは、マルチラベル分類です。ただし、予測を行うテストデータには単一セルの変動が高い画像が意図的に選択されていました。そのため、Train用の画像内に存在する複数の細胞に対し、単体の細胞のラベルを予測する必要がありました。単体の細胞に着目した場合必然的に、正しくないラベルも含まれてしまうため、このような問題は弱教師あり学習として扱う必要がありました。

ラベル数の不均衡問題は外部データを使用することで補強することができました(各ラベル10000枚くらいになるようにダウンサンプリングを実施)。

本コンペで最も効いたのが、コンペ内で「木を見て森を見ず」として指摘されていたように画像全体レベルでの一般的なマルチラベル分類を行ったモデルを単一セルモデル(セルごとにクリップした画像分類)とアンサンブルすることでした。これにより、LBスコアは+0.06~0.07されました。

HPAコンペ Human Protein Atlas - Single Cell Classification

また、本コンペは比較的参加者の少ないコンペでした。理由としては、データ量が大きいこともありますが、Test画像をSegmentationしてから単一セルに切り分ける処理において、Timeout(推論時間を超えてしまうエラー)やOOM(Kaggle内で使用できるメモリ容量を超えてしまうエラー)が多発していたことが考えられます 。エラーを起こさずに実行することがなかなか難しいコンペでした。

Timeoutは小さなモデルを使用することで解決できますが、OOMの問題はSegmentationとクリッピングされた単一セルを batch処理することで解決しました。1batchの中で推論まで行い、終了後に生成した単一セルを削除するというものです。この辺りは、Kaggleに参加してから実装力がついてきたなと実感しました。

本コンペは良コンペでほとんどシェイクアップしなかったため、無事にSilverメダルを獲得することができ、Kaggle Masterに昇格することができました!


学んだこと・感じたこと:

  • ラベル数が不均衡なデータに対しては、ダウンサンプリング等で各ラベル数を均一化することが重要である
  • 単一セルレベルと画像レベルそれぞれのモデルのアンサンブルが精度向上に効くことがある
  • 複雑な処理をする場合、実装面も考慮しておく必要がある

まとめ

約1年間、CTやX線画像、テーブルデータ等たくさんのデータに触れることができました。また、技術的な面では、画像分類や物体検出、音声認識など触れることができ1つ1つが貴重な経験でした。

1年前は、Pythonも機械学習もほとんど分からず、モデルのトレーニングもろくにできませんでしたが、貪欲にメダル獲得を目指すことで、できなかったことが段々とできるようになってきたと感じます。さらに、シェイクアップやシェイクダウンをたくさん経験したことで、精神的にもだいぶ鍛えられたと思います(笑)。

Kaggleは噂通り、最高のデータサイエンス系学習プラットフォーム(というより修行場)だと思います。 CNNベースのモデルを使用し、CNNの特徴マップで分類するというものでした。

今までは、精進のためにソロ参加に拘っていましたが、今後はチームも組ませていただき、貪欲にGoldメダルを狙って、いつかはKaggle Grand Masterになりたいなと思います。

※コンペ終了時には残りテストデータに対してもスコアが反映される)の結果が良くないモデルでも、陽性と思われる画像もきちんと陽性と予測しているモデルをアンサンブルする戦略をとった結果、コンペ終了前後でのスコアの揺れを抑えることができ、上位に生き残ることができました。

執筆
AITC 製品開発グループ
阿田木