プログラミング初心者がKaggle Expertになるまでの１０ヵ月間を振り返る

Kaggle Expertになったので、イキってポエムを書こうと思いました。
**AIに興味あるけどプログラミングすらできないんだよね**という人向けの参考になれば幸いです。
#1. 初期スペック (2019年2月)
* 機械工学系修士卒。よくいるメカニカルエンジニア
* 線形代数も統計も正直そんなに好きじゃない。力学の方が得意。
* AI？あれでしょ。将棋超強いやつでしょ？
* パイソン？スト２のボクサーみたいなやつ？

#2. 現在のスペック (2019年12月)
* Kaggle Expert (微妙?)
* 機械学習コンペでそれなりの成績 (Kaggle Kuzushiji Recognition 7th,Signate tellus 3rd 5th)
* 機械学習：なんとなくコーディングできる。
* 深層学習：なんとなくコーディングできる。
* 関連論文読める。簡単なものは実装できる。
* 業務適用も見えてきた

#3. 機械学習を学んだきっかけ
私自身「何の成果も！得られませんでした！！」という１年があり、新しいことをやろうと一念発起しました。
実際、ちょっと**世界が広がる**。毎日同じことをしていたり、**上司のコピーになりつつあるエンジニアには機械学習の習得はお勧め**です。

#4. 学習の流れ
先に全体の流れを図に示しておきます。
最初の１か月と終盤を除くと、コンペの実践しかしていません。
<img width="500" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/f3427d5e-ec0d-c535-3a80-928fdb04f8a6.png">


##4.1 入門 (最初の１か月)
####Coursera Machine Learning
ご存知Andrew Ng先生の機械学習講座。基礎はほとんど学べる。どこぞの有料講座を受講するぐらいならこっちをやった方が絶対に良い。おすすめです。

* 説明が丁寧でわかりやすい。めちゃくちゃほめてくれる。
* プログラミング課題は程よく悩めるので、ほどよく身につく 
* どこでもできる。電車でも動画が見れる。
* なのに無料！

なんかもう**終盤になると先生の顔を見るだけで安心感がわいてくる**ようになります:relaxed:

####ディープラーニング × Pythonの実装本
Pythonの知識が皆無だったことと、Courseraの無料講座に深層学習が含まれていなかったことがあり、適当に本を一冊流しました。
Python(特にnumpy)の行列計算や、簡単な図の作り方、ディープラーニングの超基礎を学べました。個人的にはやはり手を動かす系がおすすめです。
なお、私は「[はじめてのディープラーニング -Pythonで学ぶニューラルネットワークとバックプロパゲーション-](https://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%A8%E3%83%90%E3%83%83%E3%82%AF%E3%83%97%E3%83%AD%E3%83%91%E3%82%B2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-Machine-Learning-%E6%88%91%E5%A6%BB/dp/4797396814)」でした。

##4.2 Kaggleデビュー(1~2か月目)
Kaggleというデータサイエンスのコンペがあることを知り、「勉強と実益(賞金)を兼ねられるなんて最高じゃないか！」と思ってすぐに登録。

解法がシェアされている超ありがたい事実に衝撃をうけました。
しかし、ただでさえわけわからない機械学習＆プログラムが英語で書かれると、素人は少し涙が出そうになります:fearful:

そんなときQiitaはじめ、様々な日本人が助け舟を出しているコンペがありました。そう、Titanicです

####Titanic コンペ
Kaggle内で常時開催されているコンペです。タイタニック号に乗船する人々(年齢や性別、ステータスの異なる様々な人)の中から、だれが生き残るかを予測するコンペです。

あらゆることがはじめてなので、表データの操作をするだけでもひたすら苦痛でした。もちろんpandasなんで初めてです。ですが、**データクレンジングや特徴量の分析、モデル構築、バリデーション、推論といった、一通りの体験ができます。**
ネット上に情報が豊富にあるのでいろいろ学べました。決定木やランダムフォレストなども初めて実装しました。やっておいて損はなかったと思っています。

「なるほど、機械学習は理解した」と、調子にのった私は、すぐに賞金付きコンペに飛びつきました。

####Kaggle 電線コンペ
メカ屋さんの私にとって、故障分析系はとっかかりやすいお題でした。普段よく見る時系列データという意味でも興味のあるお題でした。

RNNやGBDTなどを初めて見た私にとっては、もはや神々の戦いでした。気分はヤムチャです。

迷わず公開解法(カーネル)をコピペしました。少しずついじりながらも提出していく内に、他人のものであったコードが、少しずつ馴染みのあるものになってきます。(ただし、加えるにつれて汚いコードになっていきますし、スコアもそれほど変わりません)
**最初はコピペしていじり倒すだけでいいんです**、きっと。

なお、結果はわかっていましたが超ザコでした。しかしカーネルのお陰で、pythonのコーディングから時系列データ解析までたくさん学べました。カーネルをあげた皆さん、ありがとうございました。

####Kaggle 地震コンペ
「時系列マスターした」と調子にのった私は、偶然直後に開催された、同系列のコンペに参加します。**今回は全く公開解法を見ずにサブミットまでこぎつけるようにしました。**

悩み、試行錯誤しながら、色々調べて自分で成し遂げる体験は非常に身に付きます。受け身の姿勢(本を読むだけ)では絶対に得られません。やはりコンペで学習というのは素晴らしく良いものだと感じました。
<img width="400" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/2a9b072f-ae7d-b64a-29b0-6ffcdbae8556.png">

その後、[電通国際情報サービス(ISID)さんが主催したメーカのための機械学習コンテスト](https://industrial-big-data.io/phmc2019-datachallenge/)に参加し、まぐれ優勝します。これも時系列データでした。
今年もあるかもしれないので、興味のある人は是非。

##4.3 そして深層学習へ (3か月~4か月)
深層学習、特に画像関係に興味がわいてきました。というのも、家で定期的に頼んでいた**弁当の盛り付けがひどくて、これぐらいAIでも見分けられるんじゃないか？と思った**のがきっかけです。

####弁当の盛り付け評価
弁当の写真をやたらめったら撮りました。
盛り付けをひたすら動かしては写真を撮る私を、嫁が不審そうな目で見ます。カラアゲがあっちにいったりこっちにいったりします。

CNN(畳み込みニューラルネット)を初めて真面目に扱いました。画像がそれほど多くなかったので、転移学習を学びました。もちろんGPUなんて持っていないので、**Google Colab(※)**を活用します。

少しは精度が出ましたが、あくまで私と同じ点数をつける謎の評価システムができただけでした。Google Driveの中が弁当画像だらけになったことに辟易として、やめることを決意しました。**失敗でした。**やはり**しっかりとした目標と目的が重要です。**

*※控えめに言って最高なGoogleの無料サービス。ブラウザで深層学習ができる*

####Signate タバココンペ　～初めての物体検出～
Signateと呼ばれる国内のコンペプラットフォームがあることを知り、見たところちょうど画像関係のコンペが開催されていたので参加しました。

**棚に陳列されているタバコの銘柄をあてるコンペ。**はじめての物体検出タスクです。もはや転移学習をマスターしたといっていい私にぴったりのタスクだと思いました。

でも物体検出ってどうやんの？YOLO?SSD?なにそれ状態です。ちょっと調べるとYOLOはv3まであることを知りました。それも結構いいらしい。幸い実装は転がっていたので簡単にコードを見ることができました。

ですが、内容はちんぷんかんぷんで、書いた人が神にしか思えません。しょうがないので、今回も、**最初はほぼ丸パクリ**です。ですが、いじっている内に少しずつ自分のコードになってきます。(そしてどんどん糞みたいな汚いコードになっていきます:poop:)
ここまでくると、少し論文も読めるようになります。幸いYOLOは充実していたので、色々読みました。

でもやっぱりザコだったので、入賞なんてできません。しかし、このころから物体検出の興味が出てきたので、継続して論文を読むようになりました。

**何事にも通じますが、「知らない」と「知っている」にはかなりの差があり、さらに「できる」との間には大きな乖離があると思います。適度な読書と実装が重要だと思います。**

なお、Signateは解法をシェアできないケースが多いので、個人的にはデビューはKaggleの方がおすすめです。
<img width="600" alt="3.png" src="https://static.signate.jp/competitions/159/RqTDfF6zzo4RSLfAXPjYADEDGd4RjZWsGATtR8eG.png">
https://signate.jp/competitions/159#abstract


##4.4 テーブルコンペ入門 (4~5か月目)
画像コンペでマシンスペックの重要性に気づき、学習イタレーションの悪さに疲れた私は、テーブルコンペにチャレンジしました。時系列コンペは少しかじったものの、普通のテーブルコンペは未経験でした。

ちょうどそのころ、Signateで面白そうなコンペが開催されます。

####飯田産業土地コンペ
埼玉の土地物件の価格を予測する非常にベーシックなコンペです。

経度や緯度などから時間距離を算出したり、部屋数から一部屋あたりの面積をつくったりと、**様々な特徴量をつくる楽しさを学ぶことができました。ふと閃いた特徴量が精度に効いたりすると、なかなか癖になります**。こういったところは、様々な考察や妄想が得意なアイデアマンが非常に向いていると思います。脳内物質が出ます。

バリデーションの重要性も今更ながら学ぶことができました。CourseraでAndrew先生に言われたときにはあまりわかっていませんでしたが、精度という形で評価されると、下手なバリデーションは矛盾を生みます。こういったところも、コンペで得られる大きな知識だと思います。

ついでに埼玉に(無駄に)詳しくなれるというオマケつきです。

なお、分子コンペにもこっそり参加しましたが、結局あまり時間が取れませんでした。GNNは楽しそうなので習得は今後の課題です。

##4.5 画像コンペ再燃 (6~9か月)
タバココンペ以来、検出タスクを勉強していたところ、ちょうどKaggleで日本主催のコンペが開催されました。
####Kaggle 崩し字コンペ
崩し字の文字検出と、分類をおこなうタスクでした。検出自体はそれほどハードなタスクではなかったので、できる限り自力実装を試みました。この頃には論文の実装も少しくらいはできるようになっていたので、積極的に新しいものにトライしていきました。

kaggleにお世話になったお礼も兼ねて、**[カーネルで解法共有もおこないました。](https://www.kaggle.com/kmat2019/centernet-keypoint-detector)**

これまでで一番まともに畳み込みニューラルネットと向き合いました。見せたいポイントを意識すると、ニューラルネットもちゃんと見てくれるようです。
コンテキストの影響についても、初めて真面目に考えさせられました。[The elephant in the room](https://arxiv.org/abs/1808.03305)を見て、CNNの面白さを感じました。面白いというのは大きな原動力になり、様々な試行錯誤をおこないました。

土地コンペで学んだバリデーションの重要性も少し活きました。同じ著者の文書が訓練とバリデーションに混在してしまうと、精度が実際より高く見積もられてしまいました。Group Splitが正解でした。

Kaggleのコンペでしたが、メダルのない小規模なコンペだったこともあり、**奇跡的に7位**になりました。
残念ながら賞金圏外ですが、表彰はしていただけたので、モチベアップに繋がりました。
<img width="400" alt="4.jpg" src="http://static.mxbi.net/umgy001-010-smallannomasked.jpg">
https://www.kaggle.com/c/kuzushiji-recognition

####Signate 海氷コンペ
**検出タスクができれば、セグメンテーションタスクもできます**。(モデリングは前者の方が面倒だと思う)
ちょうどいいところにSignateで開催されていた海氷コンペに参加しました。
衛星で取得した高解像度計測画像を見て、海氷エリアを判別するというものです。

**この頃にはある程度論文を読めるようになり、実装もできるようになっていた**ので、損失関数で遊んだり、EfficientNetなどの最新モデルを記述したりして遊びました。
6サブでしたが、一応5位には入りました。終盤流れ込んだロシア勢(?)にまくられたので、今回も賞金圏外です。なお、Signateの規定により、残念ながら解法はシェアできません:frowning2:
<img width="400" alt="5.png" src="https://static.signate.jp/competitions/183/6bMNDG6ORYikoZzrULKrpdj1ONglOWgWfLrLc6iF.png">
https://signate.jp/competitions/183

#5 まとめ
**ということで、機械学習楽しいので、みなさん一緒にやりましょう:relaxed:**

* ソフトウェアに無縁な人でも大丈夫！ (『なぜなぜ』等の考察できる脳が重要)
* ど素人でも１年やれば少しはマトモになれる！
* 実際のデータを扱い、実践を通じた学びが得られるコンペはおすすめ
* 順位や精度の上下に一喜一憂する楽しさが得られるコンペがおすすめ

#6 最後に
Kaggle Expertになったとか吹聴してたけど、よくみたらコンペのメダルはありませんでした。イキってごめんなさい。
<img width="600" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/0b3c56a6-d170-8e28-d42f-779346b42513.png">