Signate Student Cupに参加した

Signateで開催されていたStudent Cupに参加しました。結果はPublic 17位(?)・Private27位でした。

f:id:nori0724:20200827225859p:plain

signate.jp

 コンペの概要

昨年までの学生コンペはテーブルデータを扱うものでしたが、今年はNLPのマルチクラス分類でした。具体的には、求人情報に含まれるテキストデータから職務内容が

①データサイエンティスト(DS)
機械学習エンジニア(ML Engineer)
③ソフトウェアエンジニア(Software Engineer)
コンサルタント(Consultant) 

のどの職種に該当するかを分類するものでした。 

取り組み

nlpコンペが初めてであったためフォーラムの@yCarbonさんのNLPベースラインをもとに進めていきました。

signate.jp

特徴量

textへの前処理はなにもしていません。作成した特徴量といえば翻訳を利用した augmentationでドイツ語・フランス語・スペイン語を採用しました(英語->ドイツ語>-英語と翻訳をかけてデータを水増しする手法)。

アイディアは以下のサイトを参考にしました。

copypaste-ds.hatenablog.com

モデル

勾配ブースティング単体は全くだめでした。RoBERTaを試したりPseudo Labeling、XGboostとのアンサンブルをしましたがPublic LBはよくならなかったので最終サブはベースラインのBERTそのままで提出しました。

cv戦略

第5回atma Cupでcamaroさんがディスカッションに公開されていたstratified group k foldを使用しました。不均衡なターゲットの分布に対応しつつ、英語から翻訳で水増しされたデータを同じgroupとしバリデーションデータに含まないようするのが目的でした。

www.guruguru.ml

その他処理

データ内の同一テキストについてもフォーラムが上がってましたが、これに対しては前処理と後処理で対応しました。

【前処理】

  • trainデータに文書&ラベルが同一なものが複数あるもの

    →片方をtrainデータから削除
  • trainデータに同一文書が2つあるが、それぞれラベルが違うもの

    →両方をtrainデータから削除
  • trainデータに同一文書が3つあるが、それぞれラベルが違うもの

    →多数決をとり多い方を採用

【後処理】

  • trainデータとtestデータに同一文書があるもの
    →trainデータのラベルをtestデータに補間

signate.jp

またフォーラムにリーダーボードをhackしてスコアをあげるという方法を@ボーダーコリーさんが公開されていたので適用させました。

signate.jp

最後に

初めてNLPのコンペに出ましたが理論はよくわからないまま数行で実装できるBERTに頼むだけのコンペになってしまいました。しかし、Deepのフレームワークを勉強しNLPの論文を追っかけ将来もそのようなキャリアを築いていきたいかと言われると僕はそうではないので(もちろん最低限はBERTの理論はやる)、データサイエンスの中でも分野を絞って理解を深めていきたいと思えた良いきっかけとなりました。今後は数理統計や数学因果推論あたりをやっていき、Kaggleのテーブルデータが始まったらコンペも再開したいと思います。