将TF-IDF向量与数值特征传入模型fit()时出错的原因及解决方法
问题解决方法
错误原因
你在fit()中传入了包含三个异构特征对象的列表,sklearn分类器要求输入是单一、形状统一的特征矩阵,这种异构输入会触发形状不匹配的报错。
具体修正步骤
1. 修复TF-IDF使用逻辑
不能对question1和question2分别调用fit_transform,这会导致两个特征使用不同词汇表,需先拟合所有文本数据,再分别转换:
# 合并所有问题文本,拟合TF-IDF词汇表 all_questions = pd.concat([X_train['question1'], X_train['question2'], X_test['question1'], X_test['question2']]) tfidf.fit(all_questions) # 分别转换训练集的两个问题 train_q1 = tfidf.transform(X_train['question1']) train_q2 = tfidf.transform(X_train['question2'])
2. 合并单样本的文本特征
每个样本包含question1和question2的特征,需将二者横向拼接(按列合并):
from scipy.sparse import hstack # 拼接训练集的q1、q2文本特征 train_text_features = hstack([train_q1, train_q2])
也可根据任务需求,额外计算两个文本特征的差值、余弦相似度等作为补充特征,再合并。
3. 合并文本与数值特征
文本特征是稀疏矩阵,数值特征是稠密数组,需统一格式后合并:
from scipy.sparse import csr_matrix # 将数值特征转为稀疏矩阵(避免稠密化占用过多内存) X_num_train_sparse = csr_matrix(X_num_train) # 合并文本特征与数值特征 X_train_combined = hstack([train_text_features, X_num_train_sparse])
4. 训练模型
用合并后的统一特征矩阵训练分类器:
log_clf.fit(X_train_combined, y_train)
额外修正:代码语法错误
原代码中TfidfVectorizer定义末尾缺少右括号,需补上:
tfidf = TfidfVectorizer(strip_accents=None, lowercase=True, preprocessor=None, # applied in Data Cleaning use_idf=True, norm='l2', smooth_idf=True) # 补充右括号
内容的提问来源于stack exchange,提问作者maksuda bilkis
相关产品推荐
相关产品推荐

