今年一年でやったコンペの反省

はじめに

昨年の Human Protein Atlas Image Classification | Kaggle からKaggleを初めて、 今年は、画像コンペを3つやりました。*1

やりっぱなしというのもあれなので、一応、どういうことをしたのかを残しておこうと思います。 感想文ですので、参考になることが書いてはないですが、折角ですので、アドベントカレンダーにも登録しておきます。

qiita.com

iMet Collection 2019 - FGVC6

コンペ概要

www.kaggle.com

メトロポリタン美術館に所蔵されている美術品の画像に対して、どの文化とかどういった美術品なのかという分類を推測する画像分類のコンペです。

やったこと

Model

InceptionResnetV2, Xception, InceptionV3

Data Augmentation

Affine(rotate=(-15,15)), Crop(px=(0, 16), Affine(shear=(-5, 5)), GaussianBlur(sigma=(0, 0.5)), Fliplr

Loss

focal loss

Optimization

Adam

その他

特にこれといった工夫はなく、上記のモデルの出力を平均しました。 最後に少しだけ、ラベルの少ないデータの水増しをしました。

結果

f:id:saihyou:20191208123711p:plain

Private Leader Board 68位で銅メダルでした。

反省点

よかった

このコンペの目標は銅メダルでしたので、目標を達成できました。 まずは単体のモデルでValidationデータセットで少しずつスコアを上げながら最後に複数のモデルの平均をとりました。 きちんと取り組めば、十分メダルに届くだけのことができるということがわかりました。

悪かった

ただ学習させただけで終わってしまったというのが残念でした。工夫ポイントは色々とあった気がするのですが、 それらに対して何かできるほど時間を費やすことができませんでした。 やっぱり、コンペをやるならなるべく上を目指したいなあと思いました。

APTOS 2019 Blindness Detection

コンペ概要

www.kaggle.com

網膜の眼底写真から糖尿病網膜症の重症度を判定するコンペです。 以下はいろいろな方々のまとめで、このコンペの詳細やアプローチがわかりやすくまとまっています。

Kaggle APTOS 2019 Blindness Detection まとめ - Sleep like a pillow

APTOS 2019 Blindness Detectionのまとめ - Speaker Deck

APTOS 2019 Blindness Detection 勉強会資料 - Speaker Deck

やったこと

Model

InceptionResnetV2, Xception, InceptionV3

Data Augmentation

iaa.Sequential([
    iaa.Fliplr(0.5), 
    iaa.Crop(percent=(0, 0.1)), 
    iaa.Sometimes(0.5,
                  iaa.OneOf([
                    iaa.GaussianBlur((0, 0.5)),
                    iaa.AverageBlur(k=(2, 4)),
                    iaa.MedianBlur(k=(3, 5)),
                ])
    ),
    iaa.ContrastNormalization((0.75, 1.5)),
    iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5),
    iaa.Multiply((0.8, 1.2), per_channel=0.2),
    iaa.Affine(
        scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
        translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},
        rotate=(-25, 25),
        shear=(-8, 8)
    )
], random_order=True)

loss

binary crossentropy

Optimization

Adam

その他

マルチラベルの分類っぽく、以下のようなラベル付けをしました。

def make_label(label):
    if label == 0:
        return np.array([0., 0., 0., 0.])
    elif label == 1:
        return np.array([1., 0., 0., 0.])
    elif label == 2:
        return np.array([1., 1., 0., 0.])
    elif label == 3:
        return np.array([1., 1., 1., 0.])
    return np.array([1., 1., 1., 1.])

一度上記のモデルで学習した結果をtestデータにラベル付けし、そのデータも使用して再度学習をした結果を採用しました。

そのほかには、EfficientNetも試してみたのですが、うまくいきませんでした。

結果

f:id:saihyou:20191214171500p:plain

Private Leader Board 309位のメダルなしでした。

反省点

よかった

コンペ終了一カ月前くらいまでは前回のコンペの学びを生かしたことができたと思います。 ただ、本当にこのコンペはダメだったことの方が多すぎました。

悪かった

コンペのラスト一カ月で何も有効なことができませんでした。 Validationは全くよくなっていないにも関わらず、Public Leader Boardだけを追求していたのがよくなかったです。

今になって思えば、もう少し、単体モデルでの精度向上に時間をかけたほうが良かったかなと思います。 コンペ終了の一ヶ月前で一旦アンサンブルまで含めた結果を作ってしまい、Publicでそれなりの順位になってしまうと、 どうしてもそこを意識してしまうので、コンペ全体でのペース配分をもう少し考えたほうがいいのかなとこれを書いていて思いました。

Understanding Clouds from Satellite Images

コンペ概要

www.kaggle.com

衛星画像から特定の雲のパターンの領域を見つけるコンペです。 以下は、いろいろな方々ののまとめです。細かいところまで丁寧に記載されており、大変勉強になりました。

Kaggle 雲コンペ 反省録 - 機械学習 Memo φ(・ω・ )

雲コンペ振り返り - Speaker Deck

やったこと

Model

UNet : EfficientNetB4, SeResNext50

Data Augumentation

albu.Compose([
            albu.Flip(p=0.5),
            albu.ShiftScaleRotate(rotate_limit=30, shift_limit=0.1),
            albu.GridDistortion(p=0.5),
            albu.OpticalDistortion(p=0.5, distort_limit=2, shift_limit=0.5),
            albu.Cutout(num_holes=1, max_h_size=128, max_w_size=128)
        ])

loss

bce_dice_loss

Optimization

RAdam

その他

セグメンテーションは初めてだったのですが、これにすごく助けられました。

github.com

セグメンテーション以外にも分類としても学習モデルを作成し、足切りとして使いました。

結果

f:id:saihyou:20191214201746p:plain

Private Leader Board 117位で銅メダルでした。

反省点

よかった

分類コンペでやったことがセグメンテーションでも生かすことができたのはよかったと思います。 APTOSとは違って、銅メダルは何とか確保できたというのは、まあ、よかったような。

悪かった

APTOSでの反省点が全く生かされず、Public Leader Boardを追求してしまったというのが最大の反省点でした。ひどい。全く成長していない。 目標が銀メダルなのに最後は全然届く気もしなかったというのが本当に残念でした。

このコンペはデータがそれほど多くなかったため、Validationを適当にしてしまったのが最悪でした。 本当に前回のコンペから成長していない。。。 データが少なかろうが、Validationは本当に大事なので、ここで手を抜いている限りはこれ以上の順位には行きそうにもないなと思いました。

全体を通して

振り返ってみると、APTOSの後半からは本当に思考停止でただ学習させていただけの状態だったような気がしてなりません。 コンペの中盤でそこそこ上位まで上げることはできていても、最後までキープできていないし、金圏内には一度も到達できていないので、 根本的にはインプットが足りていないということだと思います。 それに加えて、去年のはAWSに課金しまくってそれなりに実験していたので、もうちょっと最後までなりふり構わず突っ込んでいく気合が足りなかったなと思いました。

あとは、惰性でkerasを使ってしまっていたのですが、最近は本当にpytorchが人気なので来年こそはpytorchも使えるようになりたいなと思います。

コンペへの取り組み方

twitterを見ていると、いきなり金メダルをとったりあっという間にmasterになるような人がいたりと、世の中はすごいです。 周りを見るといろいろと比べてしまうのはどうしようもないですが、個人的な目標を達成することが一番大事だと自分に言い聞かせてやっていけたらなと思っています。

思考停止でただ学習させているだけでもちょっとは学びになるし、 特にインプットに集中するとかの目的がなければ、いい成績をとれなくてもコンペ出ることは大事だと思っています。 きちんとしたインプットをもって、コンペに取り組むことがもっと大事だというのはわかっているんですが、なかなか難しいです。

来年こそは、masterに少しでも近づけるようにできたらいいなあと思いました。 あと、画像コンペ以外もやっていきたいなあと思っています。

*1:Santander Customer Transaction Predictionもちょっとだけサブミットはしているのですが、実際にはほとんど何にもしていないので、これについてはなかったことに。