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

sklearn朴素贝叶斯文本情感分析模型仅输出单一预测值问题排查

问题根因

这不是模型最小化误差的什么特殊机制,纯是代码写出来的bug,三个致命错误直接把模型干成了只会猜最多数标签的“傻子”:

  • 训练逻辑完全倒置:你写的循环里每次都执行mnb.fit(x_testcv,y_test),等于从头到尾没拿训练集x_traincv训过模型,反而一直在拿测试集自己拟合自己,之前花功夫处理的训练集数据完全没用上。
  • TF-IDF特征转换逻辑错误:对测试集你单独调用了fit_transform,相当于在测试集上重新学了一套词表和权重规则,和训练集的特征空间根本不匹配。正确逻辑是:vectorizer只在训练集上做fit_transform学习规则,测试集只能用训练好的vectorizer调用transform做转换,绝对不能重新fit。
  • 任务和模型匹配问题:MultinomialNB本身是分类模型,你把0-10的愤怒评分当离散分类标签喂进去,模型在训练数据标签分布不均衡的时候,天然倾向于预测样本量最多的标签来降低错误率——原数据集0分样本最多就全预测0,删掉0分后10分是众数就全预测10,和你观察到的现象完全吻合。另外你代码里把x_traincv转成数组的变量a从头到尾没用到,属于冗余无效代码。
代码修正方案

不用急着换技术栈,先把现有逻辑的bug改完就能正常跑:

  1. 修正TF-IDF转换逻辑,保证训练测试特征空间一致:
tfidfvectorizer = TfidfVectorizer(analyzer='word', stop_words='en')
# 训练集:拟合词表+转换特征
x_traincv = tfidfvectorizer.fit_transform(x_train.astype('U'))
# 测试集:直接用训练好的规则转换,不许重新fit
x_testcv = tfidfvectorizer.transform(x_test.astype('U'))
  1. 把模型训练放到循环外,必须用训练集训练,且只需要训练一次:
mnb = MultinomialNB()
# 用训练集特征和标签训练,绝对不要拿测试集fit
mnb.fit(x_traincv, y_train)
  1. 删掉逐样本循环里重复fit的冗余逻辑,直接批量预测计算误差:
# 批量预测所有测试集样本
predictions = mnb.predict(x_testcv)
# 计算均方误差
mse = np.mean((predictions - y_test.values) ** 2)
print(f"测试集均方误差:{mse}")
后续方案选择建议
  • 如果你的0-10分是离散的愤怒等级(比如只有整数分,0代表完全无愤怒,10代表极度愤怒),修正代码后用MultinomialNB做11分类完全可行,不需要换模型。
  • 如果你需要输出连续的愤怒程度分值,可以把分类模型换成回归模型,比如线性回归、支持向量回归等,不要直接用分类版的朴素贝叶斯。
  • 你当前总样本量只有909条,属于小样本数据集,先把基础逻辑跑通再考虑调参或者换复杂模型,不要上来就堆复杂模型方案。

内容的提问来源于stack exchange,提问作者user19224573

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:15:43