Python文本分类准确率等指标测量不一致问题求助
NLTK电影评论语料库分类指标异常问题解决
问题原因与对应解决办法
1. shuffle后指标每次结果不同
- 原因:
random.shuffle会随机打乱数据集顺序,默认每次运行的随机序列不固定,导致训练/测试集的样本组成每次都有差异,模型指标自然波动。 - 解决:在shuffle前设置固定随机种子,强制每次打乱结果一致,代码示例:
也可多次运行程序取指标平均值,评估模型稳定性能。random.seed(42) # 42为常用固定种子值,可替换为任意整数 random.shuffle(documents)
2. 删除shuffle后精确率0.0、召回率None
- 原因:原始
documents构造逻辑是先遍历所有**neg(负面)评论,再遍历所有pos(正面)**评论,未shuffle时前1000条全是neg,后1000条全是pos。你的代码测试集取featuresets[:300],即全是neg样本:- 测试集无pos样本,
refsets['pos']为空集合;模型在全neg测试集上不会预测pos,testsets['pos']也为空。 - nltk的
precision计算时分母(预测为pos的样本数)为0,返回0.0;recall计算时分子(正确预测的pos样本数)和分母(真实pos样本数)均为0,返回None。
- 测试集无pos样本,
- 解决:必须保留shuffle,确保训练/测试集均包含正负样本,避免单一类别样本情况。
3. 调整训练/测试集范围后指标正常但测试集包含训练集
- 原因:训练集设为
[500:1500]、测试集设为[:1500],等于测试集包含了训练集的全部样本,属于数据泄露——模型训练时已见过测试集部分数据,指标无法反映真实泛化能力,毫无参考价值。 - 解决:严格划分无重叠的训练/测试集,比如保留原本的划分逻辑但保留shuffle:
shuffle后该划分会包含随机分布的正负样本,既避免类别单一,也不会出现数据泄露。train_set, test_set = featuresets[300:], featuresets[:300]
额外验证建议
可添加代码查看测试集类别分布,确保正负样本均存在:
print(collections.Counter(label for _, label in test_set))
输出类似Counter({'neg': 152, 'pos': 148})即说明分布正常,可正常计算精确率、召回率等指标。
内容的提问来源于stack exchange,提问作者Iwakura Lain
相关产品推荐
相关产品推荐

