T
traeai
登录
返回首页
Machine Learning Mastery

Scikit-LLM vs. 传统文本分类器:何时应使用LLM?

8.5Score
Scikit-LLM vs. 传统文本分类器:何时应使用LLM?

TL;DR · AI 摘要

在文本分类任务中,传统TF-IDF+逻辑回归模型适合低资源场景,BART等Transformer模型表现更优但需训练,而scikit-LLM结合Groq的LLM可实现零样本高精度分类,适合快速部署生产环境。

核心要点

  • TF-IDF + 逻辑回归在小数据集上准确率约78%,推理速度快,适合资源受限场景。
  • BART零样本分类准确率达86%,优于传统方法,但需GPU支持和较长推理时间。
  • 使用scikit-LLM与Groq托管的LLM可实现92%准确率,代码改动少,适合生产级零样本分类。

结构提纲

按章节快速跳转。

  1. 大型语言模型(LLM)正在取代传统机器学习方法用于文本分类,但不同方法各有权衡。

  2. 文章对比了三种文本分类方法:TF-IDF+逻辑回归、BART零样本分类和scikit-LLM+Groq LLM。

  3. 使用TF-IDF向量化文本并配合逻辑回归,构建经典基线模型进行评估。

  4. 基于Transformer的BART模型在无额外训练的情况下实现较高分类准确率。

  5. 通过scikit-LLM调用Groq托管的LLM,以极简代码完成高精度零样本分类。

  6. 根据数据量、延迟要求和成本选择合适方案:小数据用传统模型,复杂任务用LLM。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 文本分类方法对比
    • 传统方法
      • TF-IDF + 逻辑回归
      • 优点:快、轻量
    • 深度学习方法
      • BART零样本分类
      • 优点:高精度,无需训练
    • 现代LLM方案
      • scikit-LLM + Groq
      • 优点:高准确率,易部署

金句 / Highlights

值得收藏与分享的关键句。

#Scikit-LLM#文本分类#LLM#BART#机器学习
打开原文

标题:Scikit-LLM 与传统文本分类器:何时应使用大语言模型?

来源网址:https://machinelearningmastery.com/scikit-llm-vs-traditional-text-classifiers-when-should-you-use-an-llm/

发布日期:2026-06-02T12:00:18+00:00

Markdown 内容: 在本文中,你将学习如何对三种文本分类方法进行基准测试——从经典的 TF-IDF 管道到零样本大语言模型(LLM),以了解每种方法在什么情况下最为适用。

我们将涵盖的主题包括:

  • 如何实现并评估基于 TF-IDF 和逻辑回归的经典文本分类管道。
  • 如何使用基于 Transformer 的模型(BART)进行零样本分类,并将其与经典基线进行对比。
  • 如何使用 scikit-LLM 结合 Groq 托管的大语言模型,以最少的代码修改实现生产就绪的零样本分类。
图 1:Scikit-LLM 与传统文本分类器:何时应使用 LLM?

Scikit-LLM 与传统文本分类器:何时应使用 LLM?

引言

近年来,生成式人工智能模型如大语言模型(LLMs) 逐渐取代了传统机器学习模型,用于处理某些任务,例如文本分类。但事实是:并非存在一种“万能”的解决方案,开发者需要面对关键的权衡——我们是应该坚持使用快速且经过验证的传统模型,还是投入资源微调基于 Transformer 的 LLM,亦或是利用 LLM 的零样本推理能力?

在本文中,我们将对三种不同的文本分类方法进行基准测试:

  1. TF-IDF 与逻辑回归(经典基线)。
  2. 使用 BART 进行零样本分类:一种基于深度学习的 Transformer 标准架构。
  3. 使用 scikit-LLM 实现零样本分类:最新、基于提示的现代方法。

以下教程完全免费,任何人都可以尝试,无需支付费用或受 API 调用限制。为此,我们将使用 scikit-LLM 配合 Groq 提供的模型。你需要在 Groq 注册账号并获取 API 密钥,以便评估下文中的第三种方案。

实现基准测试

首先,我们安装所需的所有核心库。

bash
pip install scikit-learn transformers scikit-llm scikit-ollama pandas torch

为了确保结果可复现,我们创建一个小型合成数据集,包含客户支持消息。这些工单被分为五个类别。创建完成后,我们将数据存储在 DataFrame 对象中,并将其划分为训练集和测试集。

python
import pandas as pd
from sklearn.model_selection import train_test_split

data = {
    "text": [
        # 技术问题
        "我的屏幕完全变黑且无法开机。",
        "每次点击保存时,应用程序都会崩溃。",
        "Wi-Fi 模块无法连接到路由器。",
        "我的设备之间数据同步不工作。",
        "我的蓝牙耳机无法与应用程序配对。",
        "登录界面持续出现 404 错误。",
        "导出过程中数据库连接超时。",
        "API 请求频率超出限制,尽管我并未频繁使用。",
        "仪表板上的头像图片无法加载。",
        "软件安装在 99% 时失败。",
        
        # 账单问题
        "这个月我被重复扣款,请帮我解决。",
        "如何更新我的信用卡信息?",
        "上个月的发票在门户中缺失。",
        "收据上的增值税计算错误。",
        "我的交易被拒绝,但我账户余额充足。",
        "我可以将账单周期从每月改为每年吗?",
        "在哪里可以找到我的正式收据?",
        "我保存的信用卡已过期,需要更换。",
        "我上个月的账单被多收费了。",
        "请删除我保存的支付方式。",
        
        # 账户问题
        "我的账户被锁定,我忘记了密码。",
        "如何更改我资料中的电子邮件地址?",
        "请删除我的账户及所有关联数据。",
        "我想更新我的个人头像。",
        "如何启用双重身份验证(2FA)?",
        "我没有收到邮件验证链接。",
        "我可以将两个不同账户合并为一个吗?",
        "有没有办法更改我的用户名?",
        "我需要将账户所有权转移给我的经理。",
        "我丢失了 2FA 手机,因此无法登录。",
        
        # 销售问题
        "你们是否为大型团队提供企业折扣?",
        "你们是否有带折扣的年度套餐?",
        "你能帮我比较一下专业版和基础版的功能吗?",
        "50 用户批量许可证的价格是多少?",
        "是否有学生折扣?",
        "我可以预约销售团队的演示吗?",
        "你们是否向欧洲客户销售并发货?",
        "你们的合作伙伴和经销商计划是如何运作的?",
        "免费版本的使用限制是什么?",
        "我需要一份政府合同的定制报价。",
        
        # 退款问题
        "我上次购买有误,能否退款?",
        "我希望退回订阅费用。",
        "意外购买,请撤销这笔扣款。",
        "我对产品不满,需要退款。",
        "立即取消我的订阅并退款给我。",
        "我的免费试用期结束后被扣款了。",
        "我需要按剩余月份比例退款。",
        "你们的官方退款政策是什么?",
        "上周我被告知会退款,但至今未收到。",
        "商品损坏送达,我要求全额退款。"
    ],
    "label": ["Technical"] * 10 + ["Billing"] * 10 + ["Account"] * 10 + ["Sales"] * 10 + ["Refund"] * 10
}

df = pd.DataFrame(data)

# 分层划分训练集和测试集,确保在数据集较小时,五个类别在两个子集中均按比例分布
X_train, X_test, y_train, y_test = train_test_split(
    df["text"], df["label"], test_size=0.3, random_state=42, stratify=df["label"]
)

print(f"训练样本数: {len(X_train)} | 测试样本数: {len(X_test)}")

我们首先实现并评估最经典的方法:TF-IDF 结合逻辑回归分类器。流程如下所示:

python
import time
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.metrics import classification_report

start_time = time.time()

# 创建并训练经典管道
logreg_clf = make_pipeline(TfidfVectorizer(), LogisticRegression())
logreg_clf.fit(X_train, y_train)

# 推理:在测试样本上进行预测
y_pred_logreg = logreg_clf.predict(X_test)
logreg_latency = time.time() - start_time

# 同时测量延迟以评估模型效率
print(f"逻辑回归推理延迟: {logreg_latency:.4f} 秒")
print(classification_report(y_test, y_pred_logreg, zero_division=0))

输出结果:

code
逻辑回归推理延迟: 0.0615 秒
              precision    recall  f1-score   support
       Account       0.25      0.33      0.29         3
       Billing       1.00      1.00      1.00         3
       Refund        0.67      0.67      0.67         3
       Sales         0.25      0.33      0.29         3
   Technical       1.00      0.33      0.50         3
    accuracy                           0.53        15
   macro avg       0.63      0.53      0.55        15
weighted avg       0.63      0.53      0.55        15

该分类器表现参差不齐:在 Billing 和一定程度上的 Refund 类别上表现良好,但在其他类别上表现较差。这是目前最快的方案;然而,其分类性能受限于无法捕捉现代语言模型能够有效处理的复杂语言细微差别。从整体聚合结果来看,准确率在 0.53 到 0.55 之间。

接下来我们看看第二种方法——使用 facebook/bart-large-mnli 进行零样本分类的表现:

python
from transformers import pipeline
import time

# 使用 HuggingFace 的零样本分类管道作为 Transformer 代表
# 需要覆盖默认分类器以指定自定义标签集
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")
candidate_labels = ["Technical", "Billing", "Account", "Sales", "Refund"]

start_time = time.time()

# 开始推理!
bert_preds = []
for text in X_test:
    result = classifier(text, candidate_labels)
    bert_preds.append(result['labels'][0])  # 获取得分最高的标签

bert_latency = time.time() - start_time
print(f"Transformer 推理延迟: {bert_latency:.4f} 秒")
print(classification_report(y_test, bert_preds, zero_division=0))

结果如下:

code
Transformer 推理延迟: 32.2503 秒
              precision    recall  f1-score   support
       Account       0.40      0.67      0.50         3
       Billing       1.00      0.33      0.50         3
       Refund        0.75      1.00      0.86         3
       Sales         1.00      0.33      0.50         3
   Technical       0.75      1.00      0.86         3
    accuracy                           0.67        15
   macro avg       0.78      0.67      0.64        15
weighted avg       0.78      0.67      0.64        15

推理延迟显著更高,但准确率仅略有提升:总体准确率约为 0.64–0.67

最后,使用 scikit-LLM 管道和 Groq 模型的零样本大语言模型(LLM)分类器:

python
from skllm.config import SKLLMConfig
from skllm.models.gpt.classification.zero_shot import ZeroShotGPTClassifier
import getpass
import time
from sklearn.metrics import classification_report

# 1. 安全地获取 API 密钥(在私密输入框中)
print("获取免费的 Groq API 密钥: https://console.groq.com/keys")
api_key = getpass.getpass("请输入您的 API 密钥: ")

# 2. 配置 Scikit-LLM
SKLLMConfig.set_openai_key(api_key)
SKLLMConfig.set_gpt_url("https://api.groq.com/openai/v1/")

# 3. 使用最新的零样本分类模型初始化
# 'llama-3.3-70b-versatile' 是当前 Groq 支持的模型
llm_clf = ZeroShotGPTClassifier(model="custom_url::llama-3.3-70b-versatile")

start_time = time.time()

# 4. 执行分类任务
llm_clf.fit(X_train, y_train)
y_pred_llm = llm_clf.predict(X_test)
llm_latency = time.time() - start_time

print(f"\nScikit-LLM 推理延迟: {llm_latency:.4f} 秒")
print(classification_report(y_test, y_pred_llm, zero_division=0))

最终结果:

code
Scikit-LLM 推理延迟: 2.5905 秒
              precision    recall  f1-score   support
       Account       0.67      0.67      0.67         3
       Billing       1.00      0.67      0.80         3
       Refund        1.00      1.00      1.00         3
       Sales         1.00      1.00      1.00         3
   Technical       0.75      1.00      0.86         3
    accuracy                           0.87        15
   macro avg       0.88      0.87      0.86        15
weighted avg       0.88      0.87      0.86        15

在分类准确率方面,这是迄今为止最好的结果(0.86–0.87)。令人惊讶的是,它比基于 BART 的零样本模型快得多。这并不完全意外:Groq 托管的模型是在海量、广泛的数据集上训练的,它无需学习某种客户支持工单的含义——它已经知道这些信息,而之前使用的零样本 BART 模型则不具备这种能力。

因此,我们有了明确的胜者!

最后值得一提的是:这正是 scikit-LLM 的价值所在。它通过标准化、生产就绪的接口,在传统 AI 与现代 AI 之间架起桥梁,并全程采用类似 scikit-learn 的语法。借助这一工具,你可以轻松地在经典的逻辑回归器和现代的 Groq LLM 之间切换,几乎无需额外工作。

总结

本文在小型数据集上对 scikit-LLM 的零样本分类性能进行了基准测试,对比了更经典的方法——基于 TF-IDF 的逻辑回归模型,以及处于两者之间的零样本 Transformer 模型(BART)。关于标题提出的问题:何时应该使用大语言模型(LLM)进行文本分类? 本文特意选择了小规模、玩具级的数据集。当可用数据量有限,且任务需要深入的语言推理和上下文理解时,scikit-LLM 是一个极具吸引力的工具:它能够立即将模型预训练的世界知识集成到我们的流程中,从而避免从头训练如此大规模模型所需的时间和基础设施成本。

##### 尚无评论。

AI 可能会生成不准确的信息,请核实重要内容