cha_kabuのNotebooks

個人的な機械学習関連勉強のアウトプット置き場です。素人の勉強録なので、こちらに辿り着いた稀有な方、情報はあまり信じない方が身のためです。

MOAとスパムメール判別とsolafuneとatmacup参戦記

はじめに

怒涛(甘い?)のコンペラッシュが終わりしばらく経ちました。あまりコミットできなかったコンペもありますがせっかくなのでざっくりと記録を残しておきます。細かいところはnotebookを見れば思い出せるはず…それぞれの結果は以下の通りでした。

MOA(kaggle) :755位 / 4,373 teams

スパムメール判別(Probspace) :20位 / 225 teams(うち投稿88)

空港利用者数予測(Solafune) :9位 / 118 teams(うち投稿63)

atmacup08(ぐるぐる) :8位 / 318 teams(うち投稿215)

MOA

Mechanisms of Action(MOA)、日本語で作用機序と呼ばれるすごく大雑把にいうと薬にどんな効果があるか予測するマルチラベルのコンペでした。自分の大好物なテーブルコンペということで飛びついたのですが、一番時間をかけたのはドメイン知識の習得かも知れません…コードより長い専用のnotebookを一つ作るくらい調べ続けてやっと何とかコンペの意味を理解することができました。

コンペ始まって1か月弱くらいしかコミットしておらず、ほぼ公開ノートの写経で10subだけして後半2か月は何もせずで終わりました。というのも、大好きなGBDTでも予測もできるのですが公開ノートのほとんどはDeepLearning手法で、後述する他のコンペでも「これはDeepLearningまじめに勉強せなあかん」となり、インプットに時間を割いていたらタイムオーバーとなった形です。。

ということでMOAで一番身についたのは「DNAとRNAの違い」とか「薬剤試験のやりかた」とか機械学習と何も関係ないところばかりが印象に残っているのですが、一応以下のことは写経しつつ学びましたのでメモ。分かってないやつは別途ちゃんと勉強したいです。

  • GBDTでマルチラベルを解こうとすると(DLほどでは無いにせよ)普通のテーブルデータに比べえぐい時間かかる
  • RankGauss
  • 特徴選択(Variance Threshould)
  • scheduler(ちゃんと分かってない)
  • DropOutやBatchNorm(ちゃんと分かってない)
  • SEEDたくさんで学習・予測してアンサンブルすると良いことがある(ほぼ分かってない)
  • Smoothing(ほぼ分かってない)
  • TabNet(ほぼ分かってない)

早々に試行錯誤を諦めインプットに移行したこと自体は後悔していないのですが、自分は「問題設定は難しいしラベルの意味も分からんし何して良いか分からん」状態だったのですが、後々公開された解法を見ていると皆さん問題理解もさることながら「データの分布や最低限の意味から何をすべきかを考え出す」能力が自分とは段違いで凹みました。。LateSubもまだ全然できていないのでこのGitHubとか見ながら知見を溜めていきたいと思います。

スパムメール判別コンペ

機械学習の分類の例で良く見る、メールがSpamかHamかを二値分類するコンペでした。参加時点では自然言語処理経験ゼロだったのですが、学びのつもりで参加しました。

こちらも最初の一週間くらいは怒涛のコミットをしたのですが、後半2か月はほぼ何もできずでした…初日に早々にBaselineを作成したり元論文の訳などをトピックにしたりしたところ結構な評価を頂けたのは唯一自慢できることです。1位の方も参考にしてくださった様で、しばらくは自己肯定感高く生きられそうです。

そんな状況ではあったのですが、自然言語処理のファーストステップはこのコンペに取り組んだおかげで身についたのでとてもよかったです!テキストのベクトル化、TF-IDF、stopwordなどの前処理、wordcoludの表示方法や他にもアンダーサンプリングなどなど…。

しかし、DeepLearning以外の分類器(ナイーブベイズ、ロジスティック分類、ランダムフォレスト、SVM)のアンサンブルでスコアを高めた後、「よーし、まだ全然分からないけどRNNとかその親戚っぽいやつもやってみるぞー」となってしまい、DeepLearning勉強沼に嵌りそのまま後述のsolafuneなどに参加しているうちに終ぞこのコンペに戻ってくる暇はなく、完全にお勉強のための参加になってしまいました…。

上位の方々は全員BERTなどDeepLearning手法なのかなぁと思っていたのですが、勝敗を分けたのはpseudo-labeling(trainのSpam割合は約2%に対し、testでは約70%と公開されていた。確度高くSpamと予測したtestデータをtrainに加えることが効いた)だったようで、自分の知識でも工夫次第で上位を狙えたかもなぁというのが少し心残りです。

ゼロから作るDeepLearningを読んで記事化していたのですが、このコンペラッシュで自然言語周りだけまとめられていない&コンペに適用できておらず身に付きがだいぶ甘いのでちゃんとアウトプットして身に着けたいと思います…!

Solafune

日本国内の空港の衛星画像からその空港の年間利用者数を予測するという、画像+回帰のコンペでした。

MOAとスパムメール判別コンペからDeepLeaningの勉強に取り組みつつ、「CNN使ってみたいけど画像コンペはどれもデータが大量で気軽に参加できないな~」と思っていたのですが、このコンペは学習&検証&予測用の画像合わせて150枚以下しかない、とても参加しやすいコンペでした。以下のツイートの様な事をチャレンジしていました。

基本中の基本みたいなことやっただけですが、カスタムデータセットの作り方など地味だけど必須な部分は中々理論を学んでいるだけでは身につかず、その辺も写経ではなく挑戦できたのは大きかったです。

ただ、このコンペを通して「やっぱりゴリゴリGPU使うコンペはGoogleColabじゃキツそう(言わずもがな、8年前に買った我が家のPCも)」とも感じました。このデータが少ないコンペでも頻繁に「CuDAメモリ限界です」とか「君GPU使い過ぎだからいったん使用禁止な」のエラーが出たので、他のコンペは相当キツそうです。。画像コンペなりの面白さは感じとれたのですが自分はテーブルコンペがやっぱり一番好きというのも再認識できたので、課金するのも中々踏み出せず、けど忘れない程度に使わないと忘れてしまうしなー、と程よいコンペを模索中です。

atmacup08

ゲームのタイトルやプラットフォーム、発売年、評価スコアなどの情報から全世界での売上を予測する回帰のコンペでした。どのコンペも面白いのですがこのコンペは今まで参加した中で正直一番好きです。

  1. テーブルコンペ!
  2. タイトルに合ったとおり初心者向けで分かりやすい
  3. かといってやることは色々ある
  4. ディスカッションが盛ん(参加数考えたらkaggle以上?)

特に2についてはTwitterでも同じことを言っている方がいらっしゃいましたが、次世代(?)Titanicとしてとても良いと思います。

このコンペでの最大の反省はディスカッションに投稿した通り戦術を絞り過ぎた(「ほぼランダムに思えるヒット作をどうすれば予測できるか」ばかり考えていた)ことなのですが、最大の学びは運営の方含めて皆様積極的にコードを公開してくださるおかげで「つよつよの方との実装の違いを知れた」ことです。

今まで自分は自作関数やクラスはほぼ使わない&実験管理も1コンペあたり精々3ノートに分けるくらい(自分の中で「大幅にスコア上がったな」と思えたときだけコピーを作成。根拠はなし。)、何でどんな変化が起きたかはスプレッドシートにまとめておく…という感じだったのですが、皆様とても綺麗に管理されていました。。

クラスや関数の使い方はLatesubで一通りパクらせて頂き、実験管理、Docker、GitHubあたりもUdemy等で学び中なので、次に参加するコンペではその辺整備して挑みたいと思います。特に自作クラスはまとめておくと「効くか分からないけどとりあえず適用してみるか」が気軽にできて試行の幅が広がるので積極的に増やしていきたい所存です。

終わりに

アウトプットが止まってしまっていたのでやっと書けて満足なのですが、なぜわざわざクリスマスイブの夜に書いてるんですかね…あと次のコンペ何にしようか迷い中。。