たかいとの備忘録

自然言語処理や機械学習のことについて学んだことを忘れないように書いていけたらと思います.

データ解析コンペ初心者のatamCup#5参加レポート

はじめに

2020年5月29日(金)〜6月6日(土)に開催されたatmaCup#5に参加してました.

学びが多かったので,データ解析コンペ初心者の目線で,感想書いておこうと思います.(次のコンペに参加するモチベにしたい)

データ解析のいろはを1から学べるアルバイトとかインターンに参加したい_:(´ཀ`」 ∠):

参加のきっかけ

今年はデータ解析コンペに参加しようと思って,Twitterで何人かデータサイエンスやっている人をフォローし始めてたこともあり,参加申し込みのtweetが流れてきて存在を知りました.

これまでに参加したデータ解析のコンペは2つで,一つはツイートを2値分類するコンペ( 【学生限定オンラインコンペ】「緊急つぶやき」を探し出す。災害関連ツイートの推定コンペティション | 学生のためのハッカソン、インターンシッププラットフォーム)に参加し,もう一つは株主価値予測のコンペ( Nishika)に参加していました.

atmaCupは事前に,どのような課題に取り組むのかわからない仕様のため,参加するかどうか数分悩みましたが,u++さんの「 Kaggleに登録したら次にやること ~ これだけやれば十分闘える!Titanicの先へ行く入門 10 Kernel ~ - Qiita」を読んで以降,勝手に尊敬しているu++さんが参加登録していたので思い切って参加登録してみました.

正直,テキストデータの分類問題ですら,全然結果出せなかったのでこの時点では不安しかありませんでした.

開会式

開会式は5月29日の夕方でした.勝手に土曜日と勘違いしてて焦りました.

開会式はYoutubeLiveで行われ,ルールなどの説明の後に,どのような課題に取り組むのか発表されました.

細かいことは,実は今でもよくわかってないのですが(泣),この時点でとりあえずわかったことは

  • 2値分類タスクであること
  • テキストデータではないこと
  • あとは何もわからないこと

の三点でした.

序盤

とりあえず何もわからないので,何も考えず与えられたデータをlightGBMにぶち込んてみました. これまで,参加してきたコンペや解説記事を読んだ経験から,

  • 初手はlightGBM
  • submitすることが大事

の二点を意識しました.

土日は仕事があり,平日は論文原稿書いたり,来週の人工知能学会の発表スライド作ったり,共同研究案件進めたりと忙しいため,初日にけっこう頑張りました. 結果はあまりいいスコア出ず,0.6245でした.

チュートリアル1

このコンペでは,初心者も参加しやすいように,開会式の次の日と中盤の水曜日にチュートリアルLiveがありました.

土曜日のチュートリアルでは,「課題の整理と使えるデータの確認」がYoutubeLiveで行われました.

個人的には,このあたりの能力が皆無なので,すごい勉強になりました.(あまりにも知らな過ぎて,勉強にはなったが,未だにできるようにはなっていないので精進したい)

データを可視化したり,波形データに対して,t-SNEなどを用いて二次元にデータを射影し,パラメータの値で色を変えて可視化したりと,学びが多かったです.

このあたりの可視化を参考に,作成した深層学習モデルのhidden stateをPCA使って二次元に射影し,データがいい感じに分離できているかの確認や,test dataと分布の乖離が起こっていないかの確認に取り入れてみました.

今回,終始何もわからない割にスコアが伸ばせたのは,このあたりの影響が大きい気がします.

ありがたいことこの上なしでした.

中盤

波形データ扱った経験など,もちろんないため,何もわからずとりあえずBiLSTMモデル実装したものの,ゴミみたいな結果しか得られず…

なんとなく上位のチーム名に書いてあったconv1dを何も理解しないまま(畳み込みに関する知識はミジンコ並),とりあえずpytorchで実装.

そしたらびっくり,何も理解しないままスコアが改善されました(何もわかってないがとりあえず嬉しかった).

いろいろ試し,中間層で得られるベクトルをPCA使って可視化しながらノリでよさげなモデルを選び,lightGBMの特徴量に追加して良き良きなスコアが得られ始めました.

f:id:takaito0423:20200607004323p:plain train dataの射影結果です.正例:赤,負例:緑で,雰囲気分けられているように見えますが,ここにtest dataを畳み込みニューラルネットワークで分類した結果をさらにプロットし,比較していきました. f:id:takaito0423:20200607005222p:plain test dataの予測結果が正例:ピンク,負例:水色で追加することで,y軸が2~4あたりのテストデータの分類がほとんど全て負例になっており,train dataと分布を比較すると分類しきれてない可能性が高いことを見ることができました.

(流石に中間層で得られるベクトルを二次元に射影したものから,元データはまったくわからないから大丈夫と考え,画像載せてますが,もし問題がある場合は連絡ください.一応,nyker_gotoさんに確認していただき,OKはもらいました.)

チュートリアル2

水曜日はチュートリアルの二回目で,「submissionをつくる」がYoutubeLiveで行われました.

このあたり,いまだに勉強不足な面が多く,わからないことも多々ありましたが,何となく意識することなどを知ることができて勉強になりました.

今回のコンペでは結局,whole scoreの出し方よくわからなかったり,どの特徴量が分類に寄与したかなどを見ることができないままコンペを終えてしまったので,このあたり次回までに復習して挑みたいです.

波形データはピーク付近に関して着目する方がいいかもみたいなことを聞き,なるほどなるほどと思い,その後ピーク付近をサイズ変えながら切り取ってみたものから特徴量作ってみたものの,何の成果も得られませんでした(泣)

手法が悪いのか,すでに畳み込みで,十分な情報が得られていたのかは謎のままです.

終盤

スコアが0.8852あたりから,伸び悩みました. 過学習だけは,避けるように工夫していたこともあり,最後の方はほとんどpublicスコアの改善は見られませんでした. 途中,偶然にも「0.9無理そう」チームと「0.9いける気がしてきた」チームの間になったのは笑ってしまいました. そんな自分は0.9無理そうと思ってました.

f:id:takaito0423:20200606234134p:plain

そのまま,publicスコア0.8881から改善することなく,最後はどんどん抜かれてしまい,最終的にpublicスコアの順位は,67位でした.

結果発表・閉会式

6/6 18:00でコンペが終了し,YoutubeLiveで結果発表が始まりました. 結果発表後は,上位者もzoomに参加し,手法の簡単な紹介や,工夫などの紹介がありました. 難しいことはあまりよくわかってないのですが,同じデータを使って,ここまで差がつくからこそ,データサイエンティストって仕事があるんだなぁと思いました.

その後は,そのままゆったりとしたお疲れさま会が始まりました. いろいろ,聞いてみたいこととかもありましたが,人見知りなので参加はできませんでしたが,いつか上位入賞したときには,いろいろお話してみたいなと思いました.

最終的な自分の結果

f:id:takaito0423:20200607001655p:plain privateスコアでの最終的な全体順位は43位で,チームコストが6以下の敢闘賞順位は25位でした.

public順位からprivate順位が24も上がると思っていなかったので,嬉しかったです.

個人的に,チームコスト0(kaggle登録してさえいない)の中での順位一位をとりあえずの目標にしていましたが,何とか達成できました.

しかし,よくよく調べると,チームコスト1はkaggleに登録しているなので,チームコスト0と1の中で1位を目指すべきでした.

まだまだ,始めたばかりで伸びしろがあると信じて,精進したいと思います.

手法としては,テーブルデータはDiscussionを参考にしながら取捨選択し,波形データを畳み込みニューラルネットワークに入力したときに得られる中間層のベクトルを特徴量に追加し,lightGBMで2値分類しました. ハイパーパラメータとか,どういう風に効いてくるか,あまりわからないので,とにかくCNN,LSTM,CNNとLSTMの複合モデルなどを試し,中間層の可視化をして,気合でよさげな特徴量を探したのが,順位に現れているのであれば,平日の深夜に頑張った努力が報われるので,そうあってほしいです.

感想

SummaryのLeader Board Chart Raceを見て,privateのスコアでは,6/4~6/6あたりに30位以内にいれたことは嬉しかったです. 6/6の午後から,ラストスパートでpublic,privateともに抜かれてますが,その時間自分は仕事入っていたのでしょうがない(;´・ω・) こういうの後から見れるのも面白いなーと思いました.

そして,とにかく学びが多かったです. Discussionに活気があり,何となく他の参加者がどういうことを考えながら取り組んでいるのか知ることができたのは大きな収穫です. まだまだ,勉強不足で用語わからず苦戦して,読めていないものもあるので,時間ができたときに読みたいと思います. Discussionに活気があると,読んでても楽しいなと思いました.

そして,何よりゴミみたいな読みにくいコード量産してしまっていたり,初期段階のデータ分析する能力がまったくないことに気がつくことができました.

自分の課題を再認識することができたので,あとはそこを鍛えていくだけだと思っていますが,なかなかリアルコミュニティに,こういうことに関心がある人いないので,もっと外に出ていきたいなと思っています.(早くコロナ収まらないかなー)

人見知りなので,オンライン開催は個人的に少し参加ハードル下がるのでよかったですが,いつかはオフラインにも参加してみたいと思っています.

また,できれば社会人になる前にインターンやアルバイトなどで,つよつよな人の下で学べたらと思っているので,誰か拾ってください_:(´ཀ`」 ∠):

おわりに

今回のコンペに参加したことで,本当に学ぶことが多かったのは,運営の方々と,コンペ参加者が自分のやったことを大会中にもDiscussionに積極的に挙げていただいたおかげだと思いました.

チームを組んで,いろいろ相談しながらできる知り合いもまだいないため,Discussionがなければスコアも出なかっただろうし,時間もあまりなかったため,早々に切り上げていた気がします.

自分はまだまだすべてにおいて駆け出しで,誰かの学びになるようなことはあまりできていませんが,いつかは自分も誰かの学びになるような記事書いたり,Discussionしたり,そういう場を作れるような人に成長できたらいいなと思っています(はたしてなれるのだろうか).

学びの場を提供していただき,ありがとうございました.

次のコンペも楽しみにしてます.