我正在使用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/