LabelEncoder与TfidfVectorizer编码后hstack报行维度不兼容错误
维度不兼容报错的根因
LabelEncoder.transform()方法返回的是一维NumPy数组,形状为(样本总数,),在你的案例中是(145341,)scipy.sparse.hstack处理一维数组时,会默认将其识别为1行的行向量,即形状被解析为(1, 145341)- 所有通过
TfidfVectorizer生成的文本特征都是二维稀疏矩阵,形状为(样本总数, 提取的特征词数) - 两类块的行维度不一致(前者行维度=1,后者行维度=145341),因此触发维度校验报错,和日志中的报错提示完全对应。
代码修正步骤
- 调整LabelEncoder的输出格式,把一维的编码结果转成和其他特征对齐的二维列向量稀疏矩阵
找到原来写的LabelEncoder编码部分,替换成如下代码:
这里的from scipy.sparse import csr_matrix enc = LabelEncoder() enc.fit(x_train[' Round']) # 编码结果加维度转为(样本数, 1)的稀疏矩阵,避免维度不兼容 round_train_le = csr_matrix(enc.transform(x_train[' Round'])).reshape(-1, 1) round_test_le = csr_matrix(enc.transform(x_test[' Round'])).reshape(-1, 1).reshape(-1,1)作用是把一维向量转为列向量,保证行维度和样本总数完全一致;转成csr_matrix是为了和TfidfVectorizer输出的稀疏矩阵格式统一,拼接时不会产生不必要的类型转换开销。 - 维度对齐后,直接运行原来的hstack拼接代码即可:
from scipy.sparse import hstack x_tr = hstack((round_train_le, category_train_enc, question_train_enc, answer_train_enc)) x_te = hstack((round_test_le, category_test_enc, question_test_enc, answer_test_enc)) - 可选排查技巧:拼接前可以打印每个特征块的形状,提前确认行维度是否统一,避免同类报错:
正常打印出来的所有特征,第一维度的数值应该和print("训练集各特征维度:") print(f"Round特征: {round_train_le.shape}") print(f"Category特征: {category_train_enc.shape}") print(f"Question特征: {question_train_enc.shape}") print(f"Answer特征: {answer_train_enc.shape}")x_train.shape[0]完全一致。
内容的提问来源于stack exchange,提问作者Satyam Anand
相关产品推荐
相关产品推荐

