【Kaggle】Osic肺線維症コンペ振り返り

5 min読了の目安(約5100字IDEAアイデア記事

Osic肺線維症コンペとは?

Kaggleで2020年10月06日に終了した、肺線維症 (Pulmonary Fibrosis)の患者さんの肺機能の予測するコンペです。最終的には2,097チームが参加する大きなコンペでしたが、最終日がコロナコンペと完全に一致しており、そちらはTop Kagglerたちによる白熱した戦いが日々繰り広げられていたこともあり、肺線維症コンペの方はあまり話題には上がりませんでした。

あまり話題に上がらなかったのには肺線維症コンペ自体の以下の性質も影響していたように思います。

  • CV-LBが相関しない
  • Privateで絶対にShakeすることがわかっている
  • そもそもやってることが無理ゲー

これらについては後述します。まずは基本的な情報のまとめです。

肺線維症とは?

肺胞壁に炎症や損傷が起こり、壁が繊維化(厚く、硬くなること)することで、本来の機能である酸素を赤血球に与え、二酸化炭素を取り出すガス交換が上手くできなくなる希少疾患です。


(引用)難病情報センター

残念ながら原因、治療法ともに不明であり、日本では指定難病になっています。症状を抑える薬はありますが治療法がないため、患者さんの予後は基本的には悪いです。ただ、患者さんによって予後には大きなばらつきがあり、急激に悪化する人もいれば、比較的安定した予後の人もいて、その予測は困難です。

患者さんの予後が予測できれば、患者さんの人生設計であったり、薬の投与計画などの見通しが立てやすくなりますので、今回Kaggle上でコンペが開催された、ということになります。

データ

Trainには176人の患者さんがいました。CodeコンペなのでTestに何人患者さんがいらっしゃるか不明でしたが、200人くらいという情報は与えられていました。

Table

それぞれ通院したタイミング(Weeks)でのFVC(肺活量)がターゲットとして与えられていました。患者さんのメタデータ(年齢、性別、喫煙状態)も与えられていました。また、PercentというFVCと完全に相関している値(患者さんの肺活量と、同様のプロファイルを持つ一般的な人の肺活量との割合)も与えられていました。

CT Image

患者さんはWeek=0時点で、CTスキャンによる肺画像が撮影されており、それが与えられていました。

評価指標

予測するターゲットは、任意の通院のタイミング(Weeks)でのFVCですが、予後を知りたいという性質上、患者さんごとに最後の3通院での予測FVCのみで評価されるというコンペになっていました。

Test dataのpublic : private = 15: 85でした。

評価指標はLaplace Log Likelihoodをいじったものであり、要はFVCをどれだけ正確に予測できるかだけでなく、予測の不確実性も考慮に入れますよ、という区間推定の質を定量する指標でした。

いいコンペか?

いいコンペの定義は人によると思いますが、↑のデータの説明を読んだ時点で、肺線維症コンペがかなり厳しいものになることは予想がつきます。

データ少なすぎる

希少疾患なので仕方ないところではありますが、176人の訓練データで、Overlapしない200人程度のテストデータに予測を汎化させることはむつかしそうです。

そもそも訓練データの176人の患者さんと、テストの200人弱の患者さん、同じような分布なんでしょうか?

そもそも肺線維症の予後は個人差が大きいのに、200人弱の訓練データで予後をちゃんと予測できるような汎化能力のあるいいモデルができるでしょうか?

しかも評価は患者さんごとの最後の3回の通院時のFVCによる、となっていますが、患者さんの通院タイミングはばらばら(CTスキャンしてから1年以上経ってたりもする)なのに...?

PublicのLBが15%(30人弱)の結果に基づいているので、LBが機能しておらず、PublicにOverfitするSubで溢れていました。

おそらくこういった事情で、まともなKagglerはコロナコンペなどに移行していった様子でした。

じゃあなぜ参加したのか?

肺線維症については聞いたことがあり、Kaggle関係なく興味を持っていました。

「肺コンペやってて…」と周りのKagglerに漏らすと「時間の無駄じゃん」と言われていましたが、題材に興味があったのが一番大きいです。どんなにがんばってもコンペの性質上努力が無に帰する可能性が高いため、チームマージはせずソロで進めていました。

結果的には、予想通り笑っちゃうくらいShakeしたコンペでした。自分は崖っぷちのソロ銅。金圏サブありましたが選べませんでした(そういう人いっぱいいた。理由は後述)。

上位解法

区間推定のタスクなので、

  • Quantile regressionで一度にFVCとConfidenceを予測する
  • FVCをまず予測し、その予測値の元で評価指標が最適になるConfidenceを計算し、それを予測する

という2通りの解法がありました。運ゲーだったためどちらの方法でもゴールド圏内に入れたようです。

大事なのはモデルがどうとかいうより、Validation Strategyがリークがない形でできているかどうかで、具体的には、

  • (FVCと完全に相関している) Percentは使わない(Trainは全Weeksに対してPercentが与えられているが、Testでは初期値しか与えられないので、初期値のみ使う)
  • 患者さんベースのGroupKFold(あるいはそれに準ずるもの)を使う

ことでした。

画像とメタデータを両方使ってPublicにOverfitしたNotebookが公開されており、上記のValidation Strategyを実装し、モデルがOverfitしないようなハイパラを選ぶことができればよかったようです(1位など)。CT画像の質に患者間で差があり、適切な肺のSegmentationは難しかったようですが、Segmentationが上手くできたチームはスコアの向上につながったようです(4位)。

また、過去コンペであるTReNDS Neuroimagingでは脳画像が与えられており、3DCNNを使用したチームが上位に来ていましたが、今回の肺画像では、

  • CTスキャンによってspacingが異なり、3次元復元が上手くいかず3DCNNの精度に悪影響を与える
  • 3DCNNが機能するくらいのデータ量ではなかった

ということで、3DCNNはうまくいかなかったようでした。CT画像を2次元のまま、うまく2DCNNを使って肺機能を予測する特徴量が抽出できてるなぁと思った例は9位で、肺をマスクした画像でまず訓練し、オリジナルの画像でFinetuneするということをしていました。

今回の評価指標は改変されたLaplace Log Likelihoodですが、NNならCustom Lossを書くことで直接最適化が一応可能です。ただそのままやると上手くConversionしないため、MAEのWeightを強めるなど、収束しやすいLossに書き換えた(5位、9位)チームもありました。

TawaraさんもLGBでCustom Lossを利用したNotebook: OSIC Baseline: LGBM with Custom Metric
を公開されており、これを出すと銅メダルが取れたようです。

公開カーネルで言うと、特にNakamaさんがコンペ開始後すぐに出された以下は秀逸で、

特に後者、線形モデルを使用している方はそのまま出せば銅メダル取れたようです。Nakamaさんはご自身で書かれたこのNotebookを元に、画像データを取り入れモデルを増やし(Lasso, SVMなど)てアンサンブルすることで、6位ソロゴールドを獲得されました(おめでとうございます!)。

私自身の解法も基本的には↑と同様でした(嬉しい)。ただ、CVを改善しようとするあまり多層Stackingを試み、176人しかいない訓練データに過剰にOverfitしてしまったのがダメでした。線形Stackingのサブは金圏でしたが、CVは多層Stackingより悪かったので出せませんでした。

これまで紹介してきた解法は何らかの形でCT画像を使っていましたが、そもそも画像データを一切使わない解法もありました(5位、10位など)。やはりというか、ある任意の時点の画像情報によって患者の予後を予測することの難しさがうかがえました。画像を使わずとも、リークしないようなValidation Strategyを樹立(10位は、患者ごと最後の3つのFVCによってさらにグループを作っていた)し、Noiseを加えたりOverfitを避ける工夫(5位)があれば、画像なしでもチャンスがあったようです。

終わりに

医療上意義のあるコンペだったとは思いますが、DSコンペとしては...?という感じでした。初心者だと、
「Master以上の強い人がなんか知らんけど参加してないし、自分でもワンチャンあるのでは...?」
「公開カーネルいじって出したらすごく(Publicの)順位上がったぞ!これはイケる...!?」

と思ってしまうかもしれないですが、Master以上がいないのは、いないなりの理由があっていないので、DSコンペで再現性のある結果を出すには、心折れそうでも、公開カーネルやDiscussionで学びつつ、GMやMasterなどの魑魅魍魎が跋扈するコンペに挑み続けなければいけないんだ...という慎ましい気持ちになりました👼

ここまで読んでいただいた方、ありがとうございました!