Kaggle Tutorial

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 + ロジスティック回帰で速い基準を作り、交差検証で評価します。

注意

TfidfVectorizerfit訓練データだけに行い、検証/テストへは 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 の倫理・規約も参照)。

関連トラック#