You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:30:28