Python训练好的朴素贝叶斯模型预测新数据报维度不匹配如何解决
错误原因
你遇到的ValueError: dimension mismatch是因为预测阶段错误地重新拟合了文本向量化器:
- 训练阶段调用
vectorizer.fit_transform()时,CountVectorizer已经基于训练集生成了固定的词表,训练好的朴素贝叶斯模型只能接受和该词表维度一致的特征输入 - 预测阶段你重新实例化了
CountVectorizer,并对测试集单独做了fit_transform(),此时生成的特征矩阵维度完全由测试集的词汇决定,和训练集的特征维度不匹配,因此调用模型预测时报错。
正确修改方案
预测阶段不要重新实例化和拟合向量化器,直接使用训练阶段已经拟合好的vectorizer,对测试集文本仅调用transform()方法做转换即可,修正后的代码如下:
import re # 补充:你原代码中normalize_text用到了re模块,需要先导入,否则会运行报错 # 新数据读取和文本归一化逻辑保持不变 test = pd.read_csv('testset.csv') test['TEXT'] = [normalize_text(s) for s in test['respostas']] # 仅用训练好的vectorizer做转换,不要重新fit也不要新建CountVectorizer实例 classes = vectorizer.transform(test['TEXT']) classificacao = nb.predict(classes)
补充注意点
- 如果测试集出现训练集里没有的生词,
transform()方法会自动忽略这些词汇,不会影响特征维度的一致性 - 如果你需要保存模型和向量化器后续离线使用,可以用
joblib或pickle模块把训练好的nb和vectorizer一起序列化保存,加载后直接使用即可。
内容的提问来源于stack exchange,提问作者Tulio Franzini
相关产品推荐
相关产品推荐

