可以在scikit学习中显示几个模型的标签概率



我有一个由以下算法组成的VoteClassifier模型:

  • 贝叶斯分类器
  • SVC
  • 线性SVC
  • NuSVC
  • MNB
  • 伯努利NB
  • 后勤回归

我已经训练了一些数据来获得所有可能标签的概率和概率,例如,如果我有两个标签:x和y,并且特征集的概率方法在x中产生,那么我想知道这是x和y标签的结果概率。根据这个答案,我使用nltk.clssify模块的ClassifierI方法中的prob_classify(此处为文档(函数来实现这一点,其想法是在计算结束时,获得所有概率的平均值,以显示两个标签的最终概率,但它并不适用于所有模型,特别是支持向量机模型。我在下面用一个类似的可复制代码解释这个场景:

from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.svm import SVC, LinearSVC, NuSVC
from nltk import classify, NaiveBayesClassifier
from sklearn.naive_bayes import MultinomialNB,BernoulliNB
from sklearn.linear_model import LogisticRegression,SGDClassifier
import random
dataset = [
(dict(a=1,b=1,c=1), 'y'),
(dict(a=1,b=1,c=1), 'x'),
(dict(a=1,b=1,c=0), 'y'),
(dict(a=0,b=1,c=1), 'x'),
(dict(a=0,b=1,c=1), 'y'),
(dict(a=0,b=0,c=1), 'y'),
(dict(a=0,b=1,c=0), 'x'),
(dict(a=0,b=0,c=0), 'x'),
(dict(a=0,b=1,c=1), 'y'),
]
random.shuffle(dataset)
slice_size = round(len(dataset)*70/100)
train_data, test_data = dataset[:slice_size], dataset[slice_size:]
#------ This works fine --------------
Bayesian_classifier = NaiveBayesClassifier.train(train_data)
dist = Bayesian_classifier.prob_classify((dict(a=0,b=1,c=1)))
print ("x:"+str(dist.prob('x')),"y:"+str(dist.prob('y')))
MultinomialNB_classifier = SklearnClassifier(MultinomialNB())
MultinomialNB_classifier.train(train_data)
dist = MultinomialNB_classifier.prob_classify((dict(a=0,b=1,c=1)))
print ("x:"+str(dist.prob('x')),"y:"+str(dist.prob('y')))
BernoulliNB_classifier = SklearnClassifier(BernoulliNB())
BernoulliNB_classifier.train(train_data)
dist = BernoulliNB_classifier.prob_classify((dict(a=0,b=1,c=1)))
print ("x:"+str(dist.prob('x')),"y:"+str(dist.prob('y')))
LogisticRegression_classifier = SklearnClassifier(LogisticRegression())
LogisticRegression_classifier.train(train_data)
dist = LogisticRegression_classifier.prob_classify((dict(a=0,b=1,c=1)))
print ("x:"+str(dist.prob('x')),"y:"+str(dist.prob('y')))
#------ But this doesn't work --------------
SVC_classifier = SklearnClassifier(SVC())
SVC_classifier.train(train_data)
SVC_classifier.prob_classify((dict(a=0,b=1,c=1)))
LinearSVC_classifier = SklearnClassifier(LinearSVC())
LinearSVC_classifier.train(train_data)
LinearSVC_classifier.prob_classify((dict(a=0,b=1,c=1)))
NuSVC_classifier = SklearnClassifier(NuSVC())
NuSVC_classifier.train(train_data)
NuSVC_classifier.prob_classify((dict(a=0,b=1,c=1)))

我在最后三个SVC模型中出现了以下错误:

raise AttributeError("predict_proba is not available when "
AttributeError: predict_proba is not available when  probability=False

我也尝试了SGD分类器,但我得到了一个不同的错误:

SGDClassifier_classifier = SklearnClassifier(SGDClassifier())
SGDClassifier_classifier.train(train_data)
SGDClassifier_classifier.prob_classify((dict(a=0,b=1,c=1)))
line 984, in _check_proba
" loss=%r" % self.loss)
AttributeError: probability estimates are not available for loss='hinge'

所以我的问题是:我认为不是所有的sklearn模型都支持prob_classify()功能,但如果我支持,例如:

>>> dir(SVC_classifier)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_clf', '_encoder', '_make_probdist', '_vectorizer', 'classify', 'classify_many', 'labels', 'prob_classify', 'prob_classify_many', 'train', 'unicode_repr']

我得到了prob_classify()函数作为一个可能的选项,与SGDClassifier_classifier相同,所以我缺少什么?有没有可能?请解释一下原因。

目前,我只能通过贝叶斯、MNB、BernoulliNB和LogisticRegression算法得到最终结果。任何帮助都将不胜感激。

这些模型实现predic_proba功能,但它不适用于这些模型的所有可能配置。

例如,如果你仔细研究它们的数学定义,SVM默认不会预测概率。它们只是找到最佳分离超平面,并告诉你点在哪一边(正/负(。

为了允许sklearn中的SVM输出概率,在实例化SVC类时,需要将设置probability更改为True(在内部,这将通过逻辑回归运行SVC的输出以获得概率(。

clf = SVC(probability=True)

SGDClassifier也是如此,当您使用默认铰链损失时,它不支持predict_proba

最新更新