朴素贝叶斯,predict_proba 输出矩阵中的所有元素都小于 0.5

数据挖掘 机器学习 scikit-学习 nlp 多类分类 朴素贝叶斯分类器
2022-03-17 01:15:06

我创建了一个MultinomialNB分类器模型,我试图通过它来标记一些测试文本:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn import preprocessing
from sklearn.naive_bayes import MultinomialNB

tfv = TfidfVectorizer(strip_accents='unicode', analyzer='word',token_pattern=r'\w{1,}',
                      use_idf=1,smooth_idf=1,sublinear_tf=1)

# df['text'] is a long string text of words
tfv.fit(df['text'])

lbl_enc = preprocessing.LabelEncoder()

# df['which_subject'] is one of the following 7 subjects: ['Educational', 'Political', 'Sports', 'Tech', 'Social', 'Religions', 'Economics']
y = lbl_enc.fit_transform(df['which_subject'])

xtrain_tfv = tfv.transform(df['text'])

# xtest_tfv has 7 samples
xtest_tfv = tfv.transform(test_df['text'])

clf = MultinomialNB()
clf.fit(xtrain_tfv, y)

y_test_preds = clf.predict_proba(xtest_tfv)

现在y_test_preds如下:

在此处输入图像描述

0.255328    0.118111    0.129958    0.123368    0.119301    0.131098    0.122836
0.122814    0.265444    0.117637    0.13531     0.116697    0.122812    0.119286
0.131485    0.114459    0.258224    0.122414    0.118132    0.134005    0.12128
0.125075    0.131948    0.122668    0.258655    0.116518    0.119995    0.12514
0.124356    0.116987    0.121706    0.119796    0.266172    0.127231    0.123751
0.132295    0.1192      0.13366     0.119445    0.123186    0.257318    0.114895
0.126779    0.118406    0.123723    0.127393    0.122539    0.117509    0.263652

如您所见,所有元素都小于 0.5。这张表有什么显示吗?我可以得出分类器无法标记测试文本的结论吗?

1个回答

不,您的分类器可以标记文本。它做得不好,但它仍然比随机好近 2 倍(对于 7 个类,随机会得到大约 0.15 的准确度)。

只看测试集是不够的。您需要为您的训练集创建相同的混淆矩阵。

如果您为测试集获得的结果在量级上相似,那么您的模型可能对任务来说太简单了,或者您训练它的时间不够长。

如果测试集的结果很好,那么你可能会遇到泛化问题(过度拟合),这意味着你需要在训练期间增加正则化。这也可能意味着您的训练集来自与测试集不同的分布。