Building an End-to-End Sentiment Analysis Pipeline with Scikit-LLM
TL;DR · AI 摘要
Scikit-LLM 桥接传统机器学习与现代大语言模型 API,实现快速情感分析推理。
核心要点
- Scikit-LLM 支持使用 Groq API 调用开源大语言模型进行情感分析。
- 使用 IMDB 电影评论数据集进行推理,实现零样本分类。
- 通过 scikit-learn 兼容语法构建端到端情感分析流水线。
结构提纲
按章节快速跳转。
- §引言
传统机器学习依赖结构化特征,而大语言模型改变了这一规则。
Scikit-LLM 桥接传统机器学习与现代大语言模型 API。
需要安装 Scikit-LLM 并配置 Groq API 凭据。
使用 scikit-learn 兼容语法构建零样本分类流水线。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- Scikit-LLM 情感分析流水线
- 传统机器学习
- 特征提取(如 TF-IDF)
- 模型(如逻辑回归、SVM)
- 现代大语言模型
- 零样本/少样本推理
- Groq API 集成
- 实现步骤
- 安装 Scikit-LLM
- 配置 Groq API 凭据
- 构建流水线
金句 / Highlights
值得收藏与分享的关键句。
Scikit-LLM 是一个 Python 库,它弥合了传统机器学习和现代 LLM API 调用之间的差距。
使用 Groq 后端模型,可以实现合理快速的推理结果。
从预处理到推理,使用 IMDB 电影评论数据集,实现端到端流水线。
使用 Scikit-LLM 构建端到端情感分析流水线 - MachineLearningMastery.com
使用 Scikit-LLM 构建端到端情感分析流水线
作者:
Iván Palomares Carrascosa
于
2026 年 6 月 16 日
在
语言模型
0
分享
文章
在本文中,你将学习如何使用 Scikit-LLM 和通过 Groq API 提供的开源大型语言模型构建端到端情感分析流水线。
我们将涵盖的主题包括:
- Scikit-LLM 如何将传统的 scikit-learn 流水线与现代大型语言模型 API 调用相结合。
- 如何使用 Groq 后端设置 Scikit-LLM 并准备 IMDB 电影评论数据集进行推理。
- 如何使用与 scikit-learn 兼容的语法构建、运行和评估零样本情感分类流水线。
使用 Scikit-LLM 构建端到端情感分析流水线
介绍
传统机器学习流水线用于预测任务,如文本分类,通常依赖于从原始文本中提取结构化、数值特征 —— 例如 TF-IDF 频率或词嵌入 —— 以输入到经典模型中,如逻辑回归、集成模型或支持向量机。
随着大型语言模型(LLMs)的兴起,游戏规则有所改变:现在可以利用零样本或少样本推理,使用现有的预训练模型来执行语言任务,作为机器学习框架的一部分。Scikit-LLM 是一个 Python 库,它解决了这个问题:它弥合了传统机器学习和现代 LLM API 调用之间的差距。在本文中,我们将使用 Scikit-LLM 和 Groq 后端模型构建一个端到端的情感分析流水线(一种特定领域的文本分类形式),使用开源模型实现合理快速的推理结果。从预处理到推理,我们将使用一个大型、现实规模的数据集 —— IMDB 电影评论数据集。
先决条件、设置和获取数据集
要使本教程中显示的代码正常工作,你需要安装 Scikit-LLM 库:
pip install scikit-llm
1
pip
install
scikit
-
llm
安装完成后,第一步是设置并配置 API 凭据。换句话说,我们需要将 Scikit-LLM “连接”到一个端点 —— 也就是一个 LLM API 存储库,如 Groq。请确保你在 Groq 注册并在此处生成 API 密钥:你需要将其复制并粘贴到下面的代码中:
from skllm.config import SKLLMConfig # 1. 指向一个兼容 Groq 的端点 SKLLMConfig.set_gpt_url("https://api.groq.com/openai/v1") # 2. 设置你的免费 Groq API 密钥 # 在 https://console.groq.com/keys 获取你的密钥 SKLLMConfig.set_openai_key("YOUR-API-KEY-GOES-HERE")
2
3
4
5
6
7
8
from
skllm
.
config
import
SKLLMConfig
1. 指向一个兼容 Groq 的端点
set_gpt_url
(
"https://api.groq.com/openai/v1"
)
2. 设置你的免费 Groq API 密钥
在 https://console.groq.com/keys 获取你的密钥
set_openai_key
"YOUR-API-KEY-GOES-HERE"
Scikit-LLM 使用一个端点函数 set_gpt_url,默认与 OpenAI 兼容;我们将其路由到一个自定义的 Groq URL:https://api.groq.com/openai/v1。
接下来的步骤是导入 IMDB 电影评论数据集 —— 该数据集包含约 50K 条实例 —— 并为我们将要构建的情感分析流程做准备。每个实例由一条带有情感标签的文本评论组成,情感可以是正面或负面(这是一个二分类问题,可以用逻辑回归等模型解决)。
为了方便起见,我们从一个公开的 GitHub 仓库中以 CSV 格式读取数据集:
import pandas as pd
from sklearn.model_selection import train_test_split
# 获取一个大型、真实规模的数据集(IMDB 电影评论 - 50,000 行)
# 为了方便,我们将从一个公开的原始 CSV 文件中读取数据
url = "https://raw.githubusercontent.com/Ankit152/IMDB-sentiment-analysis/master/IMDB-Dataset.csv"
print("正在下载数据集...")
df = pd.read_csv(url)
print(f"数据集总大小: {df.shape[0]} 行")
# 在使用免费 API 的现实 LLM 流程中,发送 50,000 次请求
# 很可能会触发配额限制。因此,我们将使用 500 行来演示我们的流程执行。
# 如果你有付费 API 访问权限,可以随意使用更多数据。
df_sampled = df.sample(n=500, random_state=42)
# IMDB 数据集包含 HTML 标签和格式噪声:这正好适合测试我们的清理器
X = df_sampled["review"]
y = df_sampled["sentiment"] # 标签是 'positive' 或 'negative'
# 分割为训练(用于初始化零样本标签)和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)请注意,我们只获取了 500 行用于演示目的,否则在没有足够计算资源的情况下,推理过程可能会很耗时。你可以自由更改这个样本大小,n=500,以适应你自己的需求。
构建情感分析流程
现在是整个过程中最有趣的部分!数据科学流程归结为一系列预处理、清理和数据准备步骤,随后是模型设置或训练、推理和评估。对于像我们这样的预测性、基于文本的场景,预处理通常包括清理和规范化文本。Scikit-learn 提供了一个优雅的类,FunctionTransformer,可以根据自定义函数定义和封装预处理步骤:
from sklearn.preprocessing import FunctionTransformer def clean_text_data(texts): """Cleans raw text inputs by removing HTML tags and stripping whitespace.""" series = pd.Series(texts).astype(str) # Remove HTML tags like <br /> cleaned = series.str.replace(r'<[^>]+>', ' ', regex=True) # Remove extra spaces cleaned = cleaned.str.strip().str.replace(r'\s+', ' ', regex=True) return cleaned.tolist() # Wrapping the cleaning function to enable its use inside a Pipeline object text_cleaner = FunctionTransformer(clean_text_data)
预处理
FunctionTransformer
def
clean_text_data
texts
:
""
"Cleans raw text inputs by removing HTML tags and stripping whitespace."
series
astype
str
Remove HTML tags like <br />
cleaned
replace
r
'<[^>]+>'
' '
regex
True
Remove extra spaces
strip
'\s+'
return
tolist
Wrapping the cleaning function to enable its use inside a Pipeline object
text_cleaner
现在我们将这个预处理对象与模型实例组合在一起,创建一个Pipeline。一旦定义,这个Pipeline将协调整个数据准备过程,并在训练和推理阶段将数据传递给模型——尽管我们使用了“训练”这个词,但实际上不会发生基于权重的训练,因为我们使用的是Groq提供的预训练模型进行零样本分类。拟合模型仅涉及将分类标签传递给模型。
from sklearn.pipeline import Pipeline from skllm.models.gpt.classification.zero_shot import ZeroShotGPTClassifier # Define the end-to-end pipeline sentiment_pipeline = Pipeline([ ("cleaner", text_cleaner), # Updated to use Groq's active Llama 3.1 8B model ("llm_classifier", ZeroShotGPTClassifier(model="custom_url::llama-3.1-8b-instant")) ]) # Fit the pipeline # Note: For Zero-Shot classification, fit() doesn't train the LLM. # It simply registers the unique labels present in 'y_train' (positive, negative). print("Fitting the pipeline...") sentiment_pipeline.fit(X_train, y_train)
pipeline
models
gpt
classification
zero_shot
ZeroShotGPTClassifier
Define the end-to-end pipeline
sentiment_pipeline
"cleaner"
Updated to use Groq's active Llama 3.1 8B model
"llm_classifier"
model
"custom_url::llama-3.1-8b-instant"
Fit the pipeline
Note: For Zero-Shot classification, fit() doesn't train the LLM.
It simply registers the unique labels present in 'y_train' (positive, negative).
"Fitting the pipeline..."
fit
一旦我们运行Pipeline来“拟合”模型,我们再次使用它进行推理。这两个步骤都使用熟悉的scikit-learn语法。除了评估模型Pipeline的性能外,我们还显示一些示例预测:
from sklearn.metrics import classification_report print(f"Running predictions on {len(X_test)} test samples...") # Run predictions through the pipeline predictions = sentiment_pipeline.predict(X_test) # Evaluate the pipeline's performance on the realistic data print("\n--- Classification Report ---") print(classification_report(y_test, predictions)) # Display a few side-by-side examples print("\n--- Sample Predictions ---") for review, actual, predicted in zip(X_test[:3], y_test[:3], predictions[:3]): # Truncate review for display purposes short_review = review[:100] + "..." print(f"Review: {short_review}") print(f"Actual: {actual} | Predicted: {predicted}\n")
metrics
classification_report
"Running predictions on {len(X_test)} test samples..."
Run predictions through the pipeline
predictions
predict
在真实数据上评估管道的性能
"\n--- 分类报告 ---"
并排显示几个示例
"\n--- 示例预测 ---"
for
review
actual
predicted
zip
截断评论以用于显示
short_review
100
+
"..."
"评论: {short_review}"
"实际: {actual} | 预测: {predicted}\n"
以下是详细输出 —— 执行上述代码可能需要几分钟时间才能完成:
--- 分类报告 --- 精确率 召回率 F1 分数 支持数 negative 0.95 0.97 0.96 60 positive 0.95 0.93 0.94 40 准确率 0.95 100 macro avg 0.95 0.95 0.95 100 weighted avg 0.95 0.95 0.95 100 --- 示例预测 --- 评论: 我看到妈妈...好吧,她并没有确切地亲吻圣诞老人;他的手放在她的大腿上,还有邪恶... 实际: negative | 预测: negative 评论: 这条条目对系列粉丝(比如我自己)来说肯定很有趣,但它基本上难以理解... 实际: negative | 预测: negative 评论: 英格丽德·伯格曼(Cleo Dulaine)从未如此美丽。加里·库珀作为“Cleent”被完美地选中... 实际: positive | 预测: positive
--
报告
精确率
召回率
F1
得分
支持数
negative
0.95
0.97
0.96
60
positive
0.93
0.94
40
准确率
macro
平均
加权平均
我
看到
妈妈
好吧
她
没有
确切地
亲吻
圣诞老人
;
他
有
他的
手
她的
大腿
和
邪恶
|
这条
条目
对
系列
粉丝
比如
我自己
但
又
它
大部分
难以理解
英格丽德
伯格曼
Cleo
Dulaine
从未
如此
美丽
加里
库珀
"Cleent"
完美地
选中
我们的管道在对评论进行情感分类方面做得很好。做得不错!
总结
本文引导你通过使用 Scikit-LLM 和来自 Groq 等 API 端点的免费可用预训练 LLM,定义了一个端到端的情感分类管道。这是一种在新颖的、由 LLM 驱动的机器学习应用中使用经典 scikit-learn 语法的灵活方法。
更多相关内容
- 如何准备电影评论数据用于情感分析…
- 如何开发一个深度学习词袋模型…
- 用于情感分析的深度卷积神经网络…
- 如何使用电影评论预测情感…
- 构建一个健壮的机器学习管道:最佳实践…
- 在 PyCaret 中构建自定义模型管道:从…开始