AI News HubLIVE
サイト内リライト2 分で読了

Scikit-LLMを使ったマルチラベルテキスト分類

本記事では、Scikit-LLMと大規模言語モデルを活用し、ラベル付き学習データなしでマルチラベルテキスト分類を実行する方法を紹介します。Groqが提供する無料のオープンソースLLMをゼロショット推論に使用し、scikit-learnライクなワークフローを実現します。セットアップ、分類器の初期化、go_emotionsデータセットの読み込み、複数の感情ラベルをテキストに割り当てる予測手順を解説します。

ソースMachine Learning Mastery著者: Iván Palomares Carrascosa

Scikit-LLMを使ったマルチラベルテキスト分類

テキスト分類は通常、製品レビューが「ポジティブ」か「ネガティブ」か、あるいは顧客の問い合わせがどのカテゴリかに分類されるシナリオに帰着します。しかし、人間の感情は複雑で、一文に喜びと怒りが混在することもあります。例えば、「バッテリーの延命はとても気に入っているが、新しいデザインはひどく悪い」といった文です。マルチラベル分類は、テキストに複数のカテゴリを同時に割り当てる「アップグレード」された分類タスクです。

従来、マルチラベル分類器の構築には大量のラベル付き学習データと複雑なニューラルネットワークが必要でした。しかし現在は、大規模言語モデル(LLM)のゼロショット推論能力を活用する方法があります。Scikit-LLMのようなライブラリにより、scikit-learnの伝統的な機械学習ワークフローと同じ感覚でLLMを使用できます。本記事では、実世界のオープンソースデータセットを用いてマルチラベル感情分類問題に取り組む方法を示します。

環境セットアップ

まず、必要なライブラリをインストールします。

pip install scikit-llm datasets

Groqが提供する無料のLLMを使用します。Groqのウェブサイトで登録し、APIキーを取得してください。キーは一度しかコピーできないので注意して保存します。

分類器の読み込みと設定

以下のコードでScikit-LLMを設定し、Groqモデルを使用します。

from skllm.config import SKLLMConfig
from skllm.models.gpt.classification.zero_shot import MultiLabelZeroShotGPTClassifier

# APIキーの設定(ローカル環境では任意の文字列でも可)
SKLLMConfig.set_openai_key("YOUR_FREE_API_KEY")
# カスタムエンドポイントURLの設定
SKLLMConfig.set_gpt_url("https://api.groq.com/openai/v1/")
# 分類器の初期化。モデルを指定し、最大ラベル数を設定
clf = MultiLabelZeroShotGPTClassifier(model="custom_url::llama-3.3-70b-versatile", max_labels=3)

データセットの読み込み

Hugging Faceのgo_emotionsデータセット(最初の100コメント)を使用します。

from datasets import load_dataset
import pandas as pd

dataset = load_dataset("google-research-datasets/go_emotions", split="train[:100]")
df = dataset.to_pandas()
texts = df['text'].tolist()
print(f"{len(texts)} 件のコメントを読み込みました。")

サンプル出力:

100 件のコメントを読み込みました。
サンプル: 'My favourite food is anything I didn't have to cook myself.'

ゼロショットでの適合と予測

候補ラベルを定義し、モデルを「適合」させます(実際にはラベルセットを渡すだけで、学習は行いません)。

candidate_labels = [
    "admiration", "amusement", "anger", "annoyance",
    "approval", "curiosity", "disappointment", "joy",
    "sadness", "surprise"
]
clf.fit(None, [candidate_labels])

最初の5件のコメントを予測します。

predictions = clf.predict(texts)
for i in range(5):
    print(f"コメント: {texts[i]}")
    print(f"予測された感情: {predictions[i]}")

出力例:

コメント: My favourite food is anything I didn't have to cook myself.
予測された感情: ['amusement' 'joy' '']
--------------------------------------------------
コメント: Now if he does off himself, everyone will think he's having a laugh screwing with people instead of actually dead
予測された感情: ['anger' 'annoyance' 'surprise']

1つのテキストに複数のラベルが割り当てられていることに注目してください。LLMのローカル推論は計算負荷が高いため、予測に時間がかかる場合がありますが、これは正常です。

まとめ

本記事では、Scikit-LLMと事前学習済みLLMを使用して、ラベル付きデータなしでマルチラベルテキスト分類をscikit-learnスタイルで実行する方法を示しました。次のステップとして、候補ラベルセットを拡張したり、異なるGroqホストモデルを試したり、少数のラベル付き例を与える少ショット学習で予測精度を向上させることも可能です。本番環境では、ラベル単位の適合率と再現率を測定する評価ループを構築することをお勧めします。