Kaggle Master になるまでにやったこと

きやうぷろあゝもすなる〇〇になるまでにやったことといふものを、かぐらもしてみむとてするなり

Kaggle以前

授業

自分の通う大学には各学部が開講する科目とは別にグローバルエデュケーションセンター(GEC)という謎の部門(文科省が好きそうな名前だなあ)が開講する科目がある
その中に『学習者言語の分析』という自然言語処理をする授業があって、一昨年(2017年)何故かそれを取っていた
(この時点では機械学習って言葉を知っていたか怪しい)

この授業は理系向けというわけでもなかったので理論はそこそこに実際にPythonとsklearnでいろいろ書いていく感じだった
この授業で初めてPythonをさわった
この授業で

  • 線形回帰、kNN、決定木、ナイーブベイズ、ランダムフォレスト、SVM
  • n-gram、TF-IDF
  • 入力の正規化
  • PCA
  • 交叉検証
  • データの可視化

あたりを勉強した

大学の授業は玉石混交だけどこの授業はかなり良かったし確実にKaggleにも役立った
近藤先生ありがとうございました

AtCoder

去年(2018年)の5月くらいにAtCoderPythonで始めたら面白かったのでいっぱい問題を解いた

Kaggle以降

夏休み前くらいに学科の友人に言われてKaggleを始めた

Titanic: Machine Learning from Disaster

Titanic: Machine Learning from Disaster | Kaggle

Kaggleチュートリアルの定番であるところのTitanicをやった(8/17)
Kernelsを見ながら色々弄ってみてKaggleが何をする場所なのか把握した
去年取った授業でやったのは機械学習だったんだなあって初めて気付いた

多分初めてGBDTをさわった

解法が知れ渡っているものを実装したり(GBDTほど)精度が出ない学習器を実装したりするのは絶望的に面白くなかった記憶がある

Digit Recognizer

Digit Recognizer | Kaggle

画像もやってみたいなと思ったのでやはり定番のMNISTをやった(8/18)
Kernels のこれ Introduction to CNN Keras - 0.997 (top 6%) | Kaggle を見ながらほぼそのまま手元で動かしてみた

Augmentationの章に入るところで飽きたので提出データを作るところまで行かなかった

NNを触ったのはこれが初めてだったと思う

Home Credit Default Risk

1423位/7198

Home Credit Default Risk | Kaggle

1週間チャレンジだった(8月下旬くらい)
AUCという評価指標に初めて出会う人になった
特徴量エンジニアリングについてめっちゃいろいろググりながらやったけど何もわからなくて公開Kernelを超えるものを作れなかった
LightGBMの他にxgboostとCatBoostも試してみたりしてLightGBMの強さを実感した
hyperoptも触ってみたりした

shakedownしたので"trust your CV"を実感した

Google Analytics Customer Revenue Prediction

29位/1089

Google Analytics Customer Revenue Prediction | Kaggle

通称: Rコンペ、GAコンペ、GACRP
通称を知っておくとTwitterググるときに役立つ

学科の友人と後輩と4人で週3で集まって取り組んだ(10月・11月)

ひどいリーク(Google Analyticsのデモアカウントに答えがある)が発覚して途中でリスタートして未来を予測するコンペになった
これのせいでKernelsが死んだ(リスタート前のいっぱいupvoteされてるKernelがずっと跋扈していた)ので色々と自力でやることになった(これのおかげで良い順位が取りやすくなってたのかもしれない)

このコンペで一番悩んだのが交叉検証だった
時系列データに対して交叉検証をどう行えば良いのかググってもよくわからなかった
結局次のようにした:

  1. 2017/05/01~2017/11/15のデータで2017/12/01~2018/01/31のトランザクションを予測
  2. 1.を全部62日ずつずらしたものを計9個作る

特徴はよく覚えてないけど確認したらこんな感じだった
(集約の方法が<lambda>になってるのはlambda x: sum(map(bool, x))f:id:nagiss:20190418154014p:plain

あと全部Kaggle Kernelで作業してたのでデータをメモリに乗せるのに苦労した
メモリ管理が大変でhitsの情報を使い切れなかったのは少し勿体なかった

未来を予測するコンペだったので結果が出たのは2月下旬、メダル付与されたのは3月になってからだった
結果公開されてから確認したらちゃんと特徴加えてCV良くなるごとにLBも良くなってたので普通に意味のあるコンペだったと思う

PLAsTiCC Astronomical Classification

161位/1094

PLAsTiCC Astronomical Classification | Kaggle

通称: plasticc

2週間チャレンジだった気がする(12月前半)
Discussionでガウス過程が話題になってたけどなんだそれと思って流していたら何も出来なかった

Kaggleは定跡とか考えてるだけじゃだめで、よく言われるように"do everything"が大事なんだなって思った
競プロ(のマラソンマッチじゃないやつ)とかだと正しいものをじっくり考えて実装するのが大事だけど
Kaggleはとにかく思いついたものを全部やってみるのがいいっぽくて、その違いをここで理解した

Traveling Santa 2018 - Prime Paths

78位/1874

Traveling Santa 2018 - Prime Paths | Kaggle

通称: サンタコンペ、kaggleサンタ

機械学習コンペじゃなくていわゆる競プロのマラソンマッチ
メダルを1個も獲れてないのがつらかったのでとにかくこのコンペで初メダルを獲ろうと思っていた(12月後半~1月上旬)

このコンペでは参加してから終わりまで大体銀圏に居ることができた
コンペ中にしても結果にしてもメダル圏に入れたのは初めてだったので、
このコンペで初めて各メダルのレベル感を理解できた

それと公開Kernelのレベルは(コンペの規模とかにもよるんだろうけど)そんなに高くないのかもしれないなって認識を得た
(巡回セールスマン問題の計算量は動的計画法を使えば都市数nに対してO(n2 2n)で済むのはググればすぐわかるけど終盤までO(n*n!)のKernelしかなかった)(でも終盤に公開されたKernel群はつよつよだったね…)

Quora Insincere Questions Classification

Quora Insincere Questions Classification | Kaggle

Rコンペのときの人たちとチームを組んだけど自分は全然協力できなかった…(1月)

NTT corevoチャレンジ: 話者の性別・年代識別 (SIGNATE)

6位/190

Competition Detail/Nippon Telegraph and Telephone Corporation | SIGNATE - Data Science Competition

通称: 音声コンペ

音声には多少ドメイン知識があったので春休みの前半を使ってこっそり参加していた(2月)
NN系のコンペにちゃんと取り組むのは初だった

最終的に特徴抽出はWORLD(f0とスペクトル包絡)、モデルはDenseNet121(転移学習)を使った
前後の無音が長いデータも多かったので似非RMS値が一番大きくなる3秒くらいを抜き出してモデルの入力に使った
入力の正規化のやり方が悪くて10回目くらいに出したスコアを50回目くらいまでずっと超えられなくて地獄だった

敗因はAugmentationをほとんどしなかったことだったと思う
自分がやったのはtrain dataに対してローパスフィルタをかけたりかけなかったりすることだけだった
なんで普通に伸縮とかピッチシフトとかしなかったのか、今思うと本当にわからない

このコンペではずっとGoogle Colaboratoryを使って実験して最後seed averageするときにKaggle Kernelも使ったりした
無課金でも割といけるなと思った

このコンペが終わったころにRコンペのメダルが付与されてKaggle Expertになった

Santander Customer Transaction Prediction

9位/8800

Santander Customer Transaction Prediction | Kaggle

通称: Santander

春休みの後半もデータ分析に溶けた(3月)

解法とか大体のことはもう書いた気がする

9th place solution (nagiss part) | Kaggle
Santanderコンペ中に日記をつけようとしたけど途中で飽きたもの - 菜

日記のあとの部分のハイライトを今適当に書くと、

  1. 爆速で順位表を駆け上がるguchioさんとチームマージ、単純なrank meanでスコアが0.922から0.923になる
  2. mamasさんが奔走して順位の近いソロ勢2人(Graseck、Vicens)とチームマージ
  3. Vicensが色々stackingを試してくれる
  4. 色々やってスコアが上がらないと思ったらGraseckのアンサンブル用のsubmitデータがバグっていた
  5. みんなお互いの特徴使い合って伸ばしてるなとか、なんかチームメイト信用しすぎると良くないなとか思って勝手にNNを試したらバグって重みが共有されていい感じのスコアが出た
  6. 最終日にmamasさんの提案でNNの正規化を変えたものを試すことになった(もとはRankGaussだった) MinMaxScaler使ったら学習が上手く行き過ぎたせいで締切25分前まで学習が終わらなくててんてこまいになった 10fold分の学習結果を自分がまとめるときにミスってsubmitデータの予測値を倍にしてしまったけどVicensがrerankしてくれていたのでとても救われた 残り5分の攻防だった
  7. 最終日の日本勢skype彼女いない歴=年齢の自分が地蔵になる出来事が起こった

はい
(念のためですがGraseckもしっかり活躍しています)

チームを組むと天邪鬼な性格が良い結果を生むこともあるっぽい(多様性的な意味で)
あとチームメイトは適度に信用しつつ適度に信用しないのがいいっぽい(多様性的な意味とチームメイトのバグを見つける的な意味で) 自分が一番信用出来ないけど

(4/19 0:09追記) このコンペでGBDTに5倍くらい詳しくなった(mamasさんのおかげ)

(4/19 12:24追記) mamasさんの記事が上がりました。必読です
シナモンが金メダルを3つ取ってKaggle Masterになるまでにやったこと - mamastan’s blog

まとめ

Kaggle Masterになるためにはコンペに出る必要があるようです