たかいとの備忘録

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

SIGNATE Student Cup 2020 [予測部門] 参加レポート

はじめに

2020年8月5日(水)〜2020年8月26日(水)に開催されたSIGNATE Student Cup 2020の予測部門に,8月10日くらいから参加してました. スコアが良かったBERTをfine-tuningしたモデルに関しては,Qiitaの記事(【PyTorch】BERTのfine-tuningを試してみた(SIGNATE Student Cup 2020))にまとめたので,こっちでは他にどういったことを試したかや,学んだこと,感想などを書いておこうと思います.

参加のきっかけ

夏休み前に,Transformer, BERTを「つくりながら学ぶ!PyTorchによる発展ディープラーニング」を参考に,一から勉強し直したこともあって,実際にBERTを使ってみたいなと思っていたタイミングで,英語のテキストデータの分類予測コンペを見つけたので参加することにしました.

SIGNATE Student Cup 2020の概要

SIGNATEでは,様々なデータ解析のコンペがこれまでも開催されてきたようです.

SIGNATE Student Cup 2020の概要

SIGNATE Student Cupは、データサイエンススキルを持った学生の発掘、および企業と学生の交流を支援するために、SIGNATEが定期的に開催している学生限定のコンペティションです。

本年は新型コロナウイルスにより社会全体が大きな影響を受け、対面での人的交流が困難な状況ですが、そのような状況下でも「次世代を担う」学生が将来のキャリア形成に自身のスキルを生かし、企業とも活発に情報交換していく場が必要だと考えています。

そこで本年は、コンペティションおよびアフターイベント(表彰式&入賞者プレゼン&協賛企業との交流)を完全オンラインで実施いたします※。

参加条件はずばり「学生であること」1点のみ。理系も文系も関係なく、平等にスキルを競い合えるコンペティションですので、興味がある学生の方はこの機会に是非チャレンジして下さい!!

タスク説明

英語圏の求人情報に含まれるテキストデータ(職務内容に関する記述)をもとに,その職務内容が

 ①データサイエンティスト(DS)

 ②機械学習エンジニア(ML Engineer)

 ③ソフトウェアエンジニア(Software Engineer)

 ④コンサルタント(Consultant)

のどの職種に該当するものかを判別する.

ざっくりポイントをまとめると

  • 英語圏の求人情報であるため,テキストデータは英語.

  • テキストを用いた4値分類.

  • 学習データは2931あるが,テキストが短いものが多いと感じた.

  • また,学習データのラベルが不均衡.(1: 624, 2: 348, 3: 1376, 4: 583)

  • 評価はF1Score(Macro).

試した手法

参加のきっかけにも書いた通り,BERT使ってみたかったので,初日はBERTのモデルを実装しました. 詳しくは,Qiitaの記事(【PyTorch】BERTのfine-tuningを試してみた(SIGNATE Student Cup 2020))にまとめたのでそちらを参考にしてもらえたら幸いです.

工夫した点は,不均衡なデータだったので,学習データのラベルの出現頻度を使って,損失関数にweightを与えました.

後は特に工夫したりとかはしませんでしたが,それでもpublic score = 0.4617170, private score = 0.4617170と,ともに良好な結果でした.

f:id:takaito0423:20200828011037p:plain
BERTのscore

提出時のpublic LBでは,14位でした.

その後試したのは,学習データの単語をランダムに置換しながらBERTをfine-tuningさせてみたり,BERTの出力をBiLSTMに入力してみたりを試してみましたが,public score,private scoreともに042~0.46くらいで大差なかったです.どのモデルも,trainデータのlossは順調に落ちていきますが,validationデータのlossは途中から下がらなくなるので,過学習には注意が必要だなと思いました.

英語→他言語→英語の再翻訳を用いたdata augmentationは,時間なくて試せなったです.

このあたり,入賞者プレゼンテーション聞くのが楽しみです. 2020年9月4日(金)13:00~15:00にアフターイベントで,学んだことは,後で記事に追記できたらと思っています. また,コンペ参加者以外も参加できるようです.

BERT以外に試した手法は,

  • 文字列レベルのBiLSTM

  • tfidfを特徴量としたlightGBM

  • tfidfを主成分分析したものを特徴量としたlightGBM

  • tfidfをLatent Semantic Indexingしたものを特徴量としたSVC

どれもイマイチ良好な結果を得ることができませんでした. 後はこれらの手法の出力結果を単純にweight付けてマージしたり,lightGBMにBERTのhidden state vecとか混ぜ混ぜしたりと実装に時間がかからなそうなとこを毎日少し試してはいました.

単体のモデルではスコアの改善はできませんでしたが,なんだかんだ25日には,14位くらいに戻ってきてました.

今回のコンペでの失敗

16日ごろにフォーラムにあがっていた「スコアハックの方法」を見つけて,こうやってスコア伸ばすこともできるのかと,適当なtfidfを特徴量にしたモデルとかに適用してみたら,スコアがとても上がったので,みんなこうやってスコア伸ばしてるのかと思い,スコアハックをちょこちょこ使い始めました.

ただ,jobflagを全て同じflagにして提出し,未知のデータのflagの出現確率として利用するのは,コンペの趣旨的に大丈夫なのかなと思っていましたが,過去のコンペ解法勉強しているときに,public LB の情報を用いて優れたensembleの重みを近似計算する"Linear Quiz Blending"といった手法みたいなもの使ったものがあったことや,他のユーザや運営が特に何もコメントしてなかったので,特に質問することもなく最終日になりました.

最終日,これまでの傾向として,必ずではないもののスコアハックがpublic scoreの結果を良くしていたので,これまで作成したモデルの出力を混ぜて,hackしたものを最終サブに選んでいました. しかし,コンペが終わるに近づき,何もしてないのにpublic scoreの自分の順位が上がっていきました.(確認した感じ最終的に12位くらいまで上がってた) なんでだろうと思っていたら,フォーラムにあがっていた「スコアハックの方法」に,「この方法はpublic lbが存在しない未知データに対しては適用不可能なので、コンペのレギュレーションを満たしていないです」との投稿者からのコメントがあり,そういうことかと思いました. 何人かの方がスコアハックした提出以外を選び変えたことに気づき,自分も慌ててスコアハックしてない提出に選択し直しましたが,時間も数分しかなかったのとコメントあまり残してなかったこともあり,CVのスコアとか見直す時間なく,しょうもないスコアのものを選択してしまい最終順位102位でした(´;ω;`)

感想

今回のコンペで,学んだことは気になったことは質問するべきだなと思いました.

「聞くは一時の恥,聞かぬは一生の恥」

まだまだ,学生で学んでいる段階なので,臆せずにわからないこと,疑問に思ったことは質問していくべきだなと思いました.4月からは社会人になるので,そのときに生かしていければいいなと思っています.

ただ,正直な感想としては,できれば運営の方から,コメントとかあったら良かったのかなと思います.最終的には,スコアハックは「本コンペのルール違反にまでは当たらない」とのことで,使用は問題がない?ようです.

いつかそんなの関係なく,つよつよなスコア出せるようになりたいので,わからないことはしっかり質問しながら,他のコンペでも少しずつ学んでいけたらと思います.

最後に,言語情報研究室に所属しているせいで,NLP関係のコンペは何とか結果を残さないとまずいなとプレッシャーを感じてましたが,結果として全然勝てないので,割り切っていろいろな手法を学んで行こうと改めて思いました.NLP初めてって人に,負け続けて気負いがなくなりました.(優秀な人は何をやっても優秀)

いくつかのコンペに参加して,分野に関係なくコンペにおいて自分に足りてないスキルがわかってきたので,少しずつ勉強していけたらと思います.

とりあえず,入賞者プレゼンテーション楽しみです.

明日からは切り替えて,論文の回答書作成に集中します.

最後まで読んでいただきありがとうございました.

データ解析コンペ初心者の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したり,そういう場を作れるような人に成長できたらいいなと思っています(はたしてなれるのだろうか).

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

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

4月のまとめと5月の目標

はじめに

Qiitaとはてなブログの使い分けに関する記事を読んだところ,はてなブログは自分の思いや考え方みたいなものを書くようにする人が多いようなので,月末にその月にあったことと,翌月の目標を掲げていけたらと思いました.

4月前半

コロナの影響で学内に入ることができなくなり,食料の買い物以外は家からでなくなりました. 楽しみが毎日の食事くらいになってしまったので,自炊に力を入れるようになりました. パスタマシーンを購入し,麺から作ったりと料理にかける時間が増やして,少しでも美味しいものを作るようにしました. ただ,流石にラーメンが恋しいです.

f:id:takaito0423:20200430181618p:plain
パスタ

家から出ることができないため,自宅での筋トレの時間を多くとるようにしました. コロナが収束し,大学に行けるようになったら,学部時代のときみたいに大学のトレーニングルームで身体鍛えたいですね. 部活にも顔出したい.

そういえば,せっかく家にいる時間が多くなったので,ベースギターやピアノの練習もし始めました. ベースのせいでスマホ指紋認証の調子が悪いです.

勉強面では,OMC(Online Math Contest)の存在を知り,参加してみたり,去年の秋ごろから始めた競プロも参加しました. あとNishikaのコンペを自然言語処理のオンライン勉強会かなんかで存在をしり,参加してました. まだコンペの締め切りまで時間があったと思うので,余裕ができれば,モデルの見直しとかしたいですね.

残りの時間はずっと原稿を書いてました. 4/30,5/15,5/20と原稿提出の締切がだいぶ詰まっているので,実装したモデルの評価をリモートでしたり,原稿書いたりとけっこう大変でした.

4月後半

後半は,原稿締切が間近で,原稿かいたりランダムにテストデータ作ったりしてました.やっぱり研究でモデル実装したり,改良したり,考察したりはまだ楽しめるけど,それをまとめる作業はなかなか苦手だなと感じます.もう少し,テキストにまとめる能力身に着けたいなと思い,技術記事書いたり,競プロに参加し思ったことや知ったことを記事にまとめるようにしようと思いQiitaで記事を書き始めました. qiita.com 自分自身も,これまで多くの記事を参考にして,問題を解決してきたので,自分も少しずつ,記事を読む側から書く側になれたらいいなと思い,頑張って続けたいと思います.

あとは,誕生日だったので,人生初のラザニアを生地から作りました. 家にいるとホントに料理くらいしか楽しいことなくて困る.

f:id:takaito0423:20200430181216p:plain
ラザニア

5月の目標

実は4/30締切が本日5/29に伸びたので,もう少し原稿の文章を見直したりとかできたらと思ってます. また,5/15,5/20締切の原稿もまだ完成には程遠いので,何とか提出間に合うように仕上げたいと思います. 目指せ卒業までに査読付き論文5本以上!

あとは,データ解析コンペが,コロナの中でも開催してくれそうなので,Quevico AI Competitionsとか参加していったり,kaggleとかにも挑戦していきたいと思ってます. 競プロや数学のコンテストなどにも引き続き参加しつつ,技術記事も引き続き書き続けていけたらと思っています.

あとは,3月4月と株で負けまくったので,そろそろ取り返したいていきたいですね.

おわりに

とりあえず,コロナ収まるまでは,全力で走り続ける!

4月後半から,自宅近くが工事し始めて昼間の作業効率最悪なのだけはほんとに解せない.