SIGNATE Student Cup 2020 参加記録
参加経緯
先日Kaggleの"SIIM-ISIC Melanoma Classification"に参加し銀メダルを獲得したが,
自分の力でどこまで行けるのかを測ってみたかった.
そんな中でSIGNATEで学生限定コンペが開催されているとの噂を聞き参加した次第.
コンペ概要
Trainデータ数 2931 Testデータ数 1743
英文からData Scientist, Machine Learning Engineer, Software Engineer, Consultantを推測するモデルの作成.
俗にいうNLP (Natural Language Processing)である. 評価は"macro-F1"であった.
解法
無論NLPに関しては何も知らなかった.
Kaggleのnotebookを読み漁り, n_gramやらtf-idf等の考え方があることを知った.
n-gram
n-gramはnに自然数が入る. 1, 2, 3はuni-gram, bi-gram, tri-gramと呼ばれる.
4以降はそのままfour-gram, five-gramとなる.
unigramは単一の単語, つまり英語であれば1単語ずつ,
bigramは2連続の単語, trigramは3連続の単語を示す.
これの何が良いかと言うと, 各文章中から特定の表現が頻出して現れる様であれば
それを特徴量として区別することが可能となるのである(そう理解している).
tf-idf
tf-idfは"Term Frequency"(TF)と"Inverse Document Frequency"(IDF)を組み合わせたものである.
TFに関しては読んで字のごとく, 特定の単語の文書内の出現頻度を数値化する.
IDFはある単語が出てくる文書の頻度の逆数である.
TFについては直感的に分かるが, IDFは微妙に何を言ってるのか分かりにくい.
簡単に言い換えると, 英語であれば冠詞を主として, 多くの文章中に登場する単語は特徴として不適であるということである.
つまり, 文章中のn-gramを調査し, tf-idfによって特徴量を生成するというのが基本の流れである.
nの選定に関してはtrigramまで調べたところ文章がそこまで長くないこともあり,
あまり有意な特徴がこれ以上でるとは考えられないため, trigramで止めた.
tf-idfはsklearnのものを使用した. とても分かりやすく使えるので楽であった.
提出したファイルのsolutionは次の通りである.
model 1
model 2
特徴量抽出は同じ
Random Forest: n_estimators=200, class_weight='balanced'
model 3
TfidfVectorizer: analyzer='word' max_features=20000
TfidfVectorizer: analyzer='char' ngram_range=(2,5) max_features=60000
Random Forest: n_estimators=200, class_weight='balanced'
この3つのモデルをvotingによってアンサンブルした.
ただ後半適当なメモ書きしか残してないため参考程度である.
もっと丁寧に記録をつけるべきだった……
成績
最終的にPublic LB: 46位(0.4729881), Private LB: 32位(0.4671081)となりギリギリ上位10%入れないくらいであった.
実はSVC, Logistic Regression, Random Forestでスタッキングしたモデルも試しており,
そちらはPublic: 0.4635398, Private: 0.4837021と16位程度の成績を残していた.
スタッキングを信じれば良かったが, 提出ファイルが1つとなるとそうも行かないのが現実であった.
とはいえ, 全く分からなかったNLPの分野でも比較的良い成績を残せたのは自信になった. 何より楽しかった.