MultinomialNB用验证集遇ValueError,train_test_split却正常的解决方案
问题原因及解决方法
核心问题
你犯了文本预处理的典型错误:验证集单独调用了CountVectorizer的fit_transform。fit操作会让CountVectorizer从当前数据中学习词汇表,训练集和验证集的词汇表不一致,导致生成的特征矩阵维度完全不匹配——模型基于训练集的10052个特征训练,自然无法识别验证集的3427个特征。
正确解决方案
文本预处理的核心原则:所有特征提取器(比如CountVectorizer)仅在训练集上执行fit,验证集和测试集只做transform,复用训练集学习到的词汇表,保证特征维度一致。
修改后的代码如下:
# 初始化CountVectorizer cv = CountVectorizer(stop_words='english') # 仅在训练集上执行fit_transform,同时学习词汇表并转换文本 train_ppd_df = cv.fit_transform(train_df["lemmatized"]) train_labels = np.array(train_df['label']) # 验证集直接用transform,复用训练集的词汇表生成特征 val_ppd_df = cv.transform(val_df["lemmatized"]) val_labels = np.array(val_df['label']) # 训练模型并预测 mnb = MultinomialNB() mnb.fit(train_ppd_df, train_labels) predictions_NB = mnb.predict(val_ppd_df)
额外注意事项
- 后续处理独立测试集时,必须用同一个
cv对象的transform方法,绝对不能再调用fit或fit_transform,否则会再次出现特征维度不匹配的问题 - 你已经保证了分词、词干提取、词形还原的逻辑一致性,这部分没问题,继续保持即可
内容的提问来源于stack exchange,提问作者dense8
相关产品推荐
相关产品推荐

