Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以在scikit学习中显示多个模型的标签概率?_Python_Machine Learning_Scikit Learn_Nltk - Fatal编程技术网

Python 是否可以在scikit学习中显示多个模型的标签概率?

Python 是否可以在scikit学习中显示多个模型的标签概率?,python,machine-learning,scikit-learn,nltk,Python,Machine Learning,Scikit Learn,Nltk,我有一个VoteClassifier模型,包括以下算法: 贝叶斯分类器 SVC 线性VC NuSVC 跨国银行 伯努林 逻辑回归 我已经训练了一些数据来获得所有可能标签的概率和概率,例如,如果我有两个标签:x和y,并且特征集的概率方法结果是x,那么我想知道这是x和y标签的结果概率。根据这一点,我使用nltk.clssify模块的classifiri方法中的prob\u classify(文档)函数来实现这一点,其思想是在计算结束时,获得所有概率的平均值,以显示两个标签的最终概率,但它并不适用

我有一个VoteClassifier模型,包括以下算法:

  • 贝叶斯分类器
  • SVC
  • 线性VC
  • NuSVC
  • 跨国银行
  • 伯努林
  • 逻辑回归
我已经训练了一些数据来获得所有可能标签的概率和概率,例如,如果我有两个标签:x和y,并且特征集的概率方法结果是x,那么我想知道这是x和y标签的结果概率。根据这一点,我使用
nltk.clssify
模块的
classifiri
方法中的
prob\u 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
我也尝试使用SGDClassizer,但我得到了一个不同的错误:

SGDClassifier_classifier = SklearnClassifier(SGDClassifier())
SGDClassifier_classifier.train(train_data)
SGDClassifier_classifier.prob_classify((dict(a=0,b=1,c=1)))
所以我的问题是: 我认为并非所有sklearn模型都支持
prob\u 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\u classify()
函数作为一个可能的选项,与
sgdclassizer\u分类器
一样,所以我缺少什么?有没有可能?请解释一下原因


目前,我可以得到最终结果,但只能使用贝叶斯、MNB、贝努林和逻辑回归算法。任何帮助都将不胜感激。

这些型号实现了
predic\u proba
功能,但并不适用于这些型号的所有可能配置

例如,如果您查看支持向量机的数学定义,则默认情况下支持向量机不会预测概率。它们只是找到最好的分离超平面,告诉你点在哪一边(正/负)

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


当您使用默认的铰链损耗时,
sgdclassizer
不支持
predict_proba

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

例如,如果您查看支持向量机的数学定义,则默认情况下支持向量机不会预测概率。它们只是找到最好的分离超平面,告诉你点在哪一边(正/负)

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


使用默认铰链损失时,
sgdclassizer
也不支持
predict_proba

它与
SVC
NuSVC
配合使用效果很好,我得到了相同的结果,所以我支持我得到的结果,因为正如你所说的,它们都使用逻辑回归的相同过程,所以我考虑只使用其中的一个(最好是按照<代码>分类())/代码>函数>我的<代码> VoTeCLSIVER < /代码>模型。谢谢你的解释。它在代码> SVC 和<代码> NuSVC < /代码>中得到了很好的效果,我得到了同样的结果,所以我认为我得到了这个结果,因为正如你所说的,他们都使用了与逻辑回归相同的过程,所以我考虑只使用其中一个(最好是按照<代码>分类())<代码>函数。对于我的
VoteClassifier
型号。谢谢你的解释。
>>> 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']
clf = SVC(probability=True)