我正在使用Python的sklearn对文本进行分类。

我调用函数predict_proba,它看起来像这样:

[[  6.74918834e-53   1.59981248e-51   2.74934762e-26   1.24948745e-43
    2.93801753e-48   3.43788315e-18   1.00000000e+00   2.96818867e-20]]


即使我尝试输入歧义数据,它看起来也总是这样。
对我而言,分类学家似乎永远不会百分百确定,那么那又是什么问题呢?

目前,我正在使用MultinomialNB分类器,它与文本分类有关。我正在使用体育,经济等类的新闻报纸文章来训练我的模型。训练示例的大小为175,分布如下:

    {'business': 27,
     'economy': 20,
     'lifestyle': 22,
     'opinion': 11,
     'politics': 30,
     'science': 21,
     'sport': 21,
     'tech': 23}


我的管道看起来像这样,我的功能主要是单词袋和一些语言关键指标,例如文本长度。

cv = CountVectorizer(min_df=1, ngram_range=(1,1), max_features=1000)
tt = TfidfTransformer()
lv = LinguisticVectorizer() # custom class
clf = MultinomialNB()

pipeline = Pipeline([
('features', FeatureUnion([
  ('ngram_tf_idf', Pipeline([
    ('counts', cv),
    ('tf_idf', tt),
  ])),
('linguistic', lv),
])),
 ('scaler', StandardScaler(with_mean=False)),
 ('classifier', clf)
])


如果您想看一下我的培训示例,我已将其上传到这里:wetransfer.com

更新:也许值得一提的是,当前设置在测试样本上的得分为0.67。但是在使用StandardScaler之前,概率的分布更为实际(即并非始终为100%),但得分仅为0.2。

更新:在管道中添加MaxAbsScaler后,它似乎可以正常工作。有人可以解释这种奇怪的行为吗?

最佳答案

这意味着,尤其是考虑到至少有一个是朴素贝叶斯:


您的数据处理例程中有一个错误,也许您将整个文档转换为一个单词,而不是将其实际分成多个部分?检查每个步骤,以确保您的文档实际上是按单词级别编码的。
您的数据被“损坏”(有唯一的单词唯一地标识您的班级),例如新闻组数据集最初由标题信息组成,字面量是在字面上指定的(因此,有关运动的每个文档都有“ group:sport @ ...” “等)
您的班级比例巨大,而您的模型只是一直在预测多数班级。

关于python - 始终百分百概率:predict_proba,sklearn,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40747857/

10-10 09:25
查看更多