朴素贝叶斯概率总是1

Avi*_*viM 6 python scikit-learn text-classification

我开始使用sklearn.naive_bayes.GaussianNB进行文本分类,并且获得了很好的初始结果.我想使用分类器返回的概率作为置信度的度量,但predict_proba()方法总是为所选类返回"1.0",而其余所有类都返回"0.0".

我知道(从这里开始)"......来自predict_proba的概率输出不应该过于严肃",但到了那个程度?!分类器可能会误认为金融投资或和弦字符串,但predict_proba()输出没有显示出犹豫的迹象......

一些关于上下文:
-我一直在使用sklearn.feature_extraction.text.TfidfVectorizer进行特征提取,没有为开始,限制的词汇STOP_WORDS,或者分/ max_df - >我已经越来越非常大的载体.
- 我一直在分层类别树上训练分类器(浅层:深度不超过3层),每个类别有7个文本(手动分类).目前,flat培训是:我不考虑层次结构.

得到的GaussianNB对象非常大(~300MB),预测相当慢:一个文本大约1秒.
这有关系吗?这一切的根源是巨大的载体吗?
我如何获得有意义的预测?我需要使用不同的分类器吗?

这是我正在使用的代码:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import GaussianNB
import numpy as np
from sklearn.externals import joblib

Vectorizer = TfidfVectorizer(input = 'content')
vecs = Vectorizer.fit_transform(TextsList) # ~2000 strings
joblib.dump(Vectorizer, 'Vectorizer.pkl') 
gnb = GaussianNB()
Y = np.array(TargetList) # ~2000 categories 
gnb.fit(vecs.toarray(), Y)
joblib.dump(gnb, 'Classifier.pkl') 
...

#In a different function:
Vectorizer = joblib.load('Vectorizer.pkl')
Classifier = joblib.load('Classifier.pkl')
InputList = [Text] # One string
Vec = Vectorizer.transform(InputList)
Probs = Classifier.predict_proba([Vec.toarray()[0]])[0]
MaxProb = max(Probs)
MaxProbIndex = np.where(Probs==MaxProb)[0][0]
Category = Classifier.classes_[MaxProbIndex]
result = (Category, MaxProb)  
Run Code Online (Sandbox Code Playgroud)

更新:
按照以下建议,我尝试了MultinomialNB和LogisticRegression.它们都返回不同的概率,并且在任何方面都更好地完成我的任务:分类更准确,内存中的对象更小,速度更快(MultinomialNB闪电般快!).

我现在有一个新问题:返回的概率非常小 - 通常在0.004-0.012范围内.这是针对预测/获胜类别(并且分类是准确的).

Fre*_*Foo 13

"......来自predict_proba的概率输出不应过于严肃"

我写的是那个人.关键在于朴素的贝叶斯倾向于预测几乎总是非常接近于零或非常接近于1的概率; 正是你观察到的行为.逻辑回归(sklearn.linear_model.LogisticRegression或sklearn.linear_model.SGDClassifier(loss="log"))产生更实际的概率.

得到的GaussianNB对象非常大(~300MB),预测相当慢:一个文本大约1秒.

那是因为它GaussianNB是一个非线性模型,不支持稀疏矩阵(你已经发现了,因为你正在使用它toarray).使用MultinomialNB,BernoulliNB或逻辑回归,这是在预测的时间,也更小更快.他们的假设是.对于术语特征,输入也更加真实.GaussianNB对于文本分类来说,确实不是一个好的估算器.