Multi-Label Text Classification with Scikit-LLM
TL;DR · AI 摘要
scikit-LLM库使零样本多标签文本分类变得简单,无需训练数据或复杂模型。
核心要点
- scikit-LLM支持使用Groq的免费LLM进行零样本推理。
- 无需训练数据即可进行多标签文本分类。
- 使用类似scikit-learn的工作流程进行多标签情感预测。
结构提纲
按章节快速跳转。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- 多标签文本分类与scikit-LLM
- 多标签分类
- 定义与重要性
- 传统方法的挑战
- scikit-LLM
- 零样本推理
- Groq的免费LLM
- scikit-learn风格工作流程
金句 / Highlights
值得收藏与分享的关键句。
scikit-LLM使使用LLM进行多标签分类变得像使用scikit-learn一样简单。
Groq提供免费的LLM,支持零样本推理,无需训练数据。
使用scikit-LLM可以轻松加载和使用预训练LLM进行多标签分类。
使用 Scikit-LLM 进行多标签文本分类 - MachineLearningMastery.com
使用 Scikit-LLM 进行多标签文本分类
作者:
Iván Palomares Carrascosa
于:
2026年6月11日
在:
语言模型
0
分享
文章
在本文中,你将学习如何使用大型语言模型和 scikit-LLM 库进行多标签文本分类,无需标记的训练数据或复杂的模型训练。
我们将涵盖的主题包括:
- 多标签分类是什么,以及它在细致的文本分析中的重要性。
- 如何使用 Groq 提供的免费开源 LLM 配置 scikit-LLM,以进行零样本推理。
- 如何加载一个真实世界的数据集,并使用熟悉的 scikit-learn 风格工作流程进行多标签情感预测。
使用 Scikit-LLM 进行多标签文本分类
介绍
文本分类通常归结为一些场景,例如产品评论是“正面”还是“负面”,或者客户咨询属于某一类或另一类。然而,当涉及到人类情感时,分类很少是清晰明确的。即使是一句话有时也可能同时传达喜悦和愤怒——例如,“我非常喜爱增强的电池寿命,但新设计却糟糕透顶。” 这时,多标签分类就派上用场了:这是一种“升级版”的分类任务,能够同时为文本等数据对象分配多个类别。
通常,构建文本的多标签分类器需要大量标记的训练数据以及复杂的神经网络架构,但今天有一个绝妙的技巧:利用大型语言模型(LLMs)的推理能力——具体来说,是零样本推理。借助像 scikit-LLM 这样的新库,这可以像使用传统的 scikit-learn 机器学习工作流程一样进行。本文将通过使用一个真实世界、开源数据集解决多标签情感分类问题,向你展示如何实现这一点。
逐步操作指南
Scikit-LLM 之所以脱颖而出,是有充分理由的:它作为一个出色的包装器,使 scikit-learn 用户(以及对这两个库都不熟悉的用户)能够轻松使用现有的 LLM 进行推理,而无需进行密集的训练。锦上添花的是,它还允许使用免费、开源的 LLM,没有配额限制。这正是我们要做的:加载、调整并利用一个预训练的 LLM,用于多标签分类任务,其中一段文本可以被分配一个或多个类别。
首先,我们将导入必要的库:
pip install scikit-llm datasets
1
pip
install
scikit
-
llm
datasets
我们将使用 Groq 提供的一个免费 LLM,这是一个提供快速推理 LLM 的资源,因此请务必在其网站上注册并在此处获取 API 密钥。创建密钥后,需要将其复制(注意只能复制一次)并粘贴到下面的代码中:
from skllm.config import SKLLMConfig from skllm.models.gpt.classification.zero_shot import MultiLabelZeroShotGPTClassifier # 1. 设置你的 API 密钥(如果本地使用,可以使用 "any_string") SKLLMConfig.set_openai_key("YOUR_FREE_API_KEY") # 2. 设置自定义端点 URL SKLLMConfig.set_gpt_url("https://api.groq.com/openai/v1/") # 3. 初始化分类器。 # "custom_url::" 前缀用于告诉 GPT 模块将请求路由到上述指定的 URL。 clf = MultiLabelZeroShotGPTClassifier(model="custom_url::llama-3.3-70b-versatile", max_labels=3)
import
SKLLMConfig
models
gpt
classification
zero_shot
MultiLabelZeroShotGPTClassifier
1. 设置你的 API 密钥(如果本地使用,请使用 "any_string")
set_openai_key
(
"YOUR_FREE_API_KEY"
)
2. 设置自定义端点 URL
set_gpt_url
"https://api.groq.com/openai/v1/"
3. 初始化分类器。
"custom_url::" 前缀用于告诉 GPT 模块将请求路由到上面指定的 URL。
clf
=
model
"custom_url::llama-3.3-70b-versatile"
,
max_labels
请注意,我们特别实例化了一个 MultiLabelZeroShotGPTClassifier 类的对象,以托管我们从 Groq 获取的预训练 LLM。
接下来,我们导入一个数据集。Hugging Face 提供了一个优秀的数据集仓库,我们将特别使用它的 go_emotions 数据集,这非常适合我们的任务 —— 根据使用的运行环境,你可能需要一个 Hugging Face (HF) API 密钥,但获取它只需在 HF 网站上注册并创建即可。
from datasets import load_dataset import pandas as pd # 1. 新的显式命名空间/名称以符合 "datasets" 库中的新 HF URI 规则 dataset = load_dataset("google-research-datasets/go_emotions", split="train[:100]") df = dataset.to_pandas() # 提取原始文本评论 texts = df['text'].tolist() print(f"已加载 {len(texts)} 条评论。") print(f"示例: '{texts[0]}'")
load_dataset
pandas
as
pd
1. 新的显式命名空间/名称以符合 "datasets" 库中的新 HF URI 规则
dataset
"google-research-datasets/go_emotions"
split
"train[:100]"
df
to_pandas
提取原始文本评论
texts
[
'text'
]
tolist
f
"已加载 {len(texts)} 条评论。"
"示例: '{texts[0]}'"
你将看到类似以下的输出,显示从加载的数据集中提取的一个示例:
已加载 100 条评论。示例: '我最喜欢的食物是那些我不需要自己做的食物。'
Loaded
100
comments
Sample
:
'My favourite food is anything I didn'
t
have
to
cook
myself
'
要“训练”加载的 LLM,我们只需指定我们特定领域的标签集,模型将根据该标签集对实例进行分类。特别是,我们将使用以下标签集:
candidate_labels = [ "admiration", "amusement", "anger", "annoyance", "approval", "curiosity", "disappointment", "joy", "sadness", "surprise" ]
candidate_labels
"admiration"
"amusement"
"anger"
"annoyance"
"approval"
"curiosity"
"disappointment"
"joy"
"sadness"
"surprise"
我们实际上并不进行训练过程:我们只是将模型暴露于我们指定的标签集,以实例化问题场景。具体操作如下:
通过将 X 设为 None 来完全以零样本方式拟合模型,# 不进行实际训练,并将我们的标签作为嵌套列表提供 clf.fit(None, [candidate_labels])
通过将 X 设为 None 来完全以零样本方式拟合模型,
不进行实际训练,并将我们的标签作为嵌套列表提供
fit
None
一旦完成上述步骤,你几乎就可以对一些文本示例进行预测了。让我们对数据集中的五条文本进行预测并展示一些结果:
在我们的 Reddit 评论上运行预测 predictions = clf.predict(texts) # 显示结果 for i in range(5): print(f"评论: {texts[i]}") print(f"预测情感: {predictions[i]}") print("-" * 50)
在我们的 Reddit 评论上运行预测
predictions
predict
显示结果
for
i
range
"评论: {texts[i]}"
"预测情感: {predictions[i]}"
"-"
*
50
输出摘录 — 仅显示了五个预测中的两个:
100%|██████████| 100/100 [03:01<00:00, 1.82s/it]评论:我最喜欢的食物是那些不需要我自己做的食物。预测情感:['amusement' 'joy' ''] -------------------------------------------------- 评论:现在如果他自杀了,每个人都会认为他只是在开玩笑,而不是真的死了。预测情感:['anger' 'annoyance' 'surprise'] --------------------------------------------------
%
|
██████████
/
03
01
<
00
1.82s
it
Comment
My
favourite
food
is
anything
didn
't have to cook myself.
Predicted Sentiments: ['
amusement
' '
joy
']
Comment: Now if he does off himself, everyone will think he'
s
having
a
laugh
screwing
with
people
instead
of
actually
dead
Predicted
Sentiments
'anger'
'annoyance'
'surprise'
--
免责声明:文章作者和编辑不对所使用的第三方数据集中的实际内容负责,也不对其中一些样本所使用的语言负责。
请注意,多个标签可以分配给单个文本作为预测的一部分。
此外,如果你发现预测过程需要一些时间,也不要惊慌。这是正常的,因为在本地使用这些大型语言模型(LLMs)是一个计算密集型的过程。尽管听起来有些矛盾,但在上面的示例中,推理过程比模型拟合所花费的时间要长得多,因为我们没有进行任何实际的训练,也没有将任何训练集传递给 fit():我们只是将标签集传递给模型,以定义我们特定的场景。
总结
本文说明了如何使用 scikit-LLM(一个利用预训练大型语言模型能力的库,并使其可以像基于 scikit-learn 的传统机器学习模型一样使用)进行多标签文本分类过程。
下一步,你可以尝试扩展候选标签集,以更好地反映目标领域中的完整情感范围,或者替换为 Groq 托管的其他模型,以比较预测行为。如果你想更进一步,scikit-LLM 还支持其他零样本和少样本分类策略 —— 向分类器提供少量标记示例有时可以显著提高其预测的准确性,而无需完整的训练流程。最后,在生产使用场景中,值得构建一个适当的评估循环,以测量标签级别的精确度和召回率,与保留的注释样本进行比较,这样你就可以具体了解模型在哪些方面表现良好,以及在哪些方面存在困难。
更多相关内容
- 如何从电影评论中预测情感…
- 如何准备电影评论数据用于情感分析…
- 如何开发一个基于深度学习的词袋模型…
- 使用深度学习进行文本分类的最佳实践
- 用于情感分析的深度卷积神经网络…
- 如何开发一个用于文本的多通道 CNN 模型…