我正在使用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]]
,即使我尝试放置歧义数据,也看起来总是这样。对我来说,classfier总是百分百确定的似乎并不可能,所以那里有什么问题?
目前我正在使用多元素分类器,这大约是文本分类。我正在使用新闻纸文章与 Sports ,经济等课程进行培训。训练示例的大小为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
后,它似乎可以正常工作。有人可以解释这种怪异的行为吗?
这意味着,尤其是考虑到至少有一个天真的贝叶斯:
- 您的数据处理程序中有一个错误,也许您将整个文档转换为一个单词,而不是将其分为部分?检查每个步骤以确保您的文档实际上是在单词级别上编码的。
- 您的数据是"损坏的"(有独特的单词可以唯一地识别您的课程),例如,新闻组的数据集最初由标题信息组成,其中class name均已指定(因此每个文档有关体育有"小组:sport@..."等)
- 您有巨大的类不成比例,您的模型只是一直在预测多数类。