scikit-learn中结合Sentence-Bert与其他特征训练模型的相关问题
首先纠正一个认知偏差:Sentence-BERT输出的是稠密浮点张量,并非稀疏矩阵,所有维度都有有效数值,可直接和其他数值特征结合使用。
是否可以用生成的张量替换原有文本列
完全可以,但注意不是把整个张量作为单列替换原文本列,而是要把张量的每个维度展开为独立的数值特征列,再删除原有文本列即可。你当前的向量化代码符合规范:仅加载预训练的LaBSE模型,分别对训练集、测试集做推理生成向量,没有用到测试集信息训练向量化模块,不存在数据泄露问题。
后续模型训练操作步骤
- 特征拼接处理
先把生成的张量转换为可拼接的数组格式,再和你现有的4个其他特征按样本维度对齐拼接,注意训练集、测试集分开操作,避免索引错位,参考代码如下:
import pandas as pd import numpy as np # 张量转DataFrame,每一行对应该样本的768维文本特征 train_text_feat = pd.DataFrame(sentence_embeddings.numpy(), columns=[f'text_feat_{i}' for i in range(768)]) test_text_feat = pd.DataFrame(sentence_embeddings1.numpy(), columns=[f'text_feat_{i}' for i in range(768)]) # 重置索引避免拼接错位,删除原文本列后和其他特征拼接 X_train_processed = pd.concat([X_train.drop('tweet', axis=1).reset_index(drop=True), train_text_feat.reset_index(drop=True)], axis=1) X_test_processed = pd.concat([X_test.drop('tweet', axis=1).reset_index(drop=True), test_text_feat.reset_index(drop=True)], axis=1)
如果你的4个非文本特征中包含类别型特征,需要先做完独热编码、标签编码等数值化处理后,再和文本特征拼接。
- 分类器训练
拼接完成后的训练集、测试集全部为数值特征,主流机器学习分类器都可以直接输入训练,简单示例如下:
from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report # 初始化模型,max_iter调整为1000保证收敛 clf = LogisticRegression(max_iter=1000) # 填入训练集标签训练 clf.fit(X_train_processed, y_train) # 测试集推理 y_pred = clf.predict(X_test_processed) # 输出效果评估报告 print(classification_report(y_test, y_pred))
- 效果优化建议
- 若使用逻辑回归、SVM等对特征尺度敏感的模型,建议先对所有特征做标准化/归一化处理再训练
- 可通过网格搜索、随机搜索做交叉验证调参,进一步提升模型效果
- 样本量充足的前提下,也可以把拼接后的特征输入全连接神经网络训练,通常能得到比传统机器学习模型更好的分类效果
内容的提问来源于stack exchange,提问作者Narges Se
相关产品推荐
相关产品推荐

