NLP テキスト分類コンペ実践
TF-IDF ベースラインから BERT ファインチューニング、アンサンブルまで NLP コンペの流れを学びます。
概要#
テキスト分類コンペでは、軽い古典手法で強いベースラインを作ってから、 Transformer/BERT のファインチューニングへ進むのが定石です。L7(NLP)の実践編です。
1. EDA とベースライン(TF-IDF + 線形)#
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
df = pd.read_csv("/kaggle/input/<competition>/train.csv") # text, label
tfidf = TfidfVectorizer(max_features=50000, ngram_range=(1, 2))
X = tfidf.fit_transform(df["text"]) # 訓練だけで fit
model = LogisticRegression(max_iter=1000).fit(X, df["label"])まず TF-IDF + ロジスティック回帰で速い基準を作り、交差検証で評価します。
注意
TfidfVectorizer の fit は訓練データだけに行い、検証/テストへは transform。 全体で fit
すると語彙・IDF に検証側が混ざりデータリークになります。
2. BERT のファインチューニング(Hugging Face)#
from transformers import AutoTokenizer, AutoModelForSequenceClassification
name = "bert-base-uncased"
tok = AutoTokenizer.from_pretrained(name)
model = AutoModelForSequenceClassification.from_pretrained(name, num_labels=n_classes)
enc = tok(texts, padding=True, truncation=True, max_length=256, return_tensors="pt")
# 小さい学習率(例 2e-5)・短いエポック・検証で早期終了事前学習済み BERT を各タスクに転移学習します(L7-07)。GPU メモリに応じて
max_length とバッチサイズを調整します。
3. アンサンブル#
# 誤りの相関が低い TF-IDF線形 と BERT を加重平均
pred = 0.3 * pred_tfidf + 0.7 * pred_bert性質の異なる古典手法と BERT を ブレンディング すると、多様性が出て安定します(L6)。
メモ
事前学習モデル・外部データにはライセンスとコンペ規約があります。利用可否を必ず確認しましょう (L6 / L8 の倫理・規約も参照)。