
使用 LLM 嵌入进行特征工程:增强 Scikit-learn 模型
图片由 Editor | ChatGPT 提供
大型语言模型嵌入(LLM 嵌入)是一种强大的方法,可以捕获文本中语义丰富的信息,并利用这些信息来增强其他机器学习模型(如使用 Scikit-learn 训练的模型),以完成需要深度文本上下文理解的任务,例如意图识别或情感分析。
本文简要描述了 LLM 嵌入是什么,并展示了如何将它们用作 Scikit-learn 模型的工程特征。
什么是 LLM 嵌入?
LLM 嵌入是由 LLM 生成的整个文本序列的语义丰富的数值(向量)表示。这个概念起初可能会挑战一些关于文本嵌入和 LLM 一般用途的牢固的传统观念,所以让我们澄清几点以更好地理解 LLM 嵌入。
- 虽然“传统”的**嵌入**(如*Word2Vec、FastText*等)是无上下文的、用于下游模型输入特征的单个单词的固定向量表示,但**LLM 嵌入**通常是整个序列的表示,使得序列中单词的含义得以情境化。
- 尽管 LLM 通常生成文本序列作为输出,但像
all-miniLM
这样一些特定的模型被专门设计用于产生富含上下文的输出嵌入,即数值表示,而不是生成文本。如前所述,这些输出嵌入具有更丰富的语义信息级别,这使得它们成为下游模型的合适输入。

在特征工程中使用 LLM 嵌入
利用 LLM 嵌入进行特征工程任务的第一步是使用合适的 LLM,例如 Hugging Face 的 SentenceTransformers
库中提供的模型,例如 all-MiniLM-L6-v2
。
下面的代码片段安装并导入了该库,并使用它将数据集中包含的文本序列列表转换为嵌入表示。该数据集(可在此处获取)描述了客户支持工单——询问和投诉——属于几个类别,结合了文本以及一些结构化的(数值)客户行为特征。
让我们首先关注将原始文本特征转换为 LLM 嵌入
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from sentence_transformers import SentenceTransformer import pandas as pd url = "https://raw.githubusercontent.com/gakudo-ai/open-datasets/refs/heads/main/customer_support_dataset.csv" df = pd.read_csv(url) # 提取列 text_data = df["text"].tolist() structured_data = df[["prior_tickets", "account_age_days"]].values labels = df["label"].tolist() model = SentenceTransformer('all-MiniLM-L6-v2') X_embeddings = model.encode(text_data) |
现在我们已经处理了数据集中的 text
特征,接下来准备描述客户的两个数值特征:prior_tickets
和 account_age_days
。如果我们观察它们,可以看到它们分布在非常不同的值范围;因此,对这些属性进行缩放是个好主意。
在此之后,使用 Numpy 的 hstack()
函数,将缩放后的特征和 LLM 嵌入重新统一。
1 2 3 |
scaler = StandardScaler() structured_scaled = scaler.fit_transform(structured_data) X_combined = np.hstack([structured_scaled, X_embeddings]) |
现在特征工程过程已经完成,剩下要做的就是将包含 LLM 嵌入的工程数据集划分为训练集和测试集,然后训练一个 Scikit-learn 模型来进行客户工单分类——共五个类别——并对其进行评估。
1 2 3 4 5 6 7 8 9 10 |
# 分割 X_train, X_test, y_train, y_test = train_test_split(X_combined, labels, test_size=0.2, random_state=42, stratify=labels) # 训练 clf = RandomForestClassifier() clf.fit(X_train, y_train) # 评估 y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred)) |
以上代码中的事件顺序是:
- 将统一的客户特征和相关标签分割成训练示例(80%)和测试示例(20%)。在这里使用
stratify=labels
参数非常重要,因为我们处理的是一个非常小的数据集;否则,不能保证训练集和测试集中所有五个类别的表示。 - 初始化并训练一个随机森林分类器,采用默认设置:未指定集成或其底层树的超参数。
- 在测试集上评估训练好的分类器。
这是评估结果输出:
1 2 3 4 5 6 7 8 9 10 11 |
精确率 召回率 f1-得分 支持 billing 0.50 1.00 0.67 2 bug 1.00 1.00 1.00 2 delivery 1.00 0.50 0.67 2 login 1.00 1.00 1.00 2 refund 1.00 0.50 0.67 2 准确率 0.80 10 宏观 平均 0.90 0.80 0.80 10 加权 平均 0.90 0.80 0.80 10 |
根据分类报告,我们的方法似乎相当成功。在包含五个类别且数据集非常小的情况下,实现了 80% 的准确率和 0.80 的加权 F1 分数,这表明模型已经学习到了有意义的模式。这种成功在很大程度上归功于 LLM 嵌入,它将原始文本转换为了数值丰富的特征,捕捉了客户工单的语义意图。这使得随机森林分类器能够区分细微的需求,而这些需求对于更简单的文本表示方法来说是难以处理的。
为了真正量化增加的价值,一个关键的后续步骤是**建立一个基线**,将这些结果与使用 TF-IDF 等传统特征训练的模型进行比较。还可以通过**调整分类器的超参数**或将此技术应用于更大、更稳健的数据集来探索进一步的改进,以确认其有效性。尽管如此,这个实验仍然是一个有力的概念验证,清晰地展示了 LLM 嵌入如何能够无缝集成,以提高 Scikit-learn 模型在文本密集型任务上的性能。
总结
本文强调了 LLM 嵌入的重要性,即由专门的 LLM 为此目的生成的整个文本序列的向量表示,在存在可能包含文本的半结构化数据的情况下,训练下游机器学习模型(如分类任务)的重要性。通过简单的步骤,我们展示了如何对原始文本特征进行特征工程,以将它们的语义信息作为 LLM 嵌入纳入,用于训练 scikit-learning 模型。
暂无评论。