Python 决策树分类器 batch_prob_classify 函数

3
我正在尝试运行此nltk网站提供的决策树代码。 http://www.nltk.org/howto/classify.html
>>> train = [
...      (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'),
...      ]
>>>
>>>
>>> test = [
...      (dict(a=1,b=0,c=1)), # unseen
...      (dict(a=1,b=0,c=0)), # unseen
...      (dict(a=0,b=1,c=1)), # seen 3 times, labels=y,y,x
...      (dict(a=0,b=1,c=0)), # seen 1 time, label=x
...      ]
>>>
>>>
>>> import nltk
>>> classifier = nltk.classify.DecisionTreeClassifier.train(train, entropy_cutoff=0, support_cutoff=0)
>>> sorted(classifier.labels())
['x', 'y']
>>> print(classifier)
c=0? .................................................. x
  a=0? ................................................ x
  a=1? ................................................ y
c=1? .................................................. y

>>> classifier.batch_classify(test)
['y', 'y', 'y', 'x']
>>> for pdist in classifier.batch_prob_classify(test):
...      print('%.4f %.4f' % (pdist.prob('x'), pdist.prob('y')))
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "//anaconda/lib/python2.7/site-packages/nltk/classify/api.py", line 87, in batch_prob_classify
    return [self.prob_classify(fs) for fs in featuresets]
  File "//anaconda/lib/python2.7/site-packages/nltk/classify/api.py", line 67, in prob_classify
    raise NotImplementedError()
NotImplementedError
>>>

问题在于batch_prob_classify函数。请问有没有人能提供解决方法以及如何获取概率分布值。

1个回答

1
DecisionTreeClassifier 使用概率类 MLEProbDist,它没有任何 prob 方法。另一方面,NaiveBayesClassifier 使用概率类 ELEProbDist,它反过来继承自 LidstoneProbDist 概率类并提供了一个 prob 方法。

因此,除非你想创建 DecisionTreeClassifier 的子类并自己添加 prob 方法,否则你可能想使用 NaiveBayesClassifier 代替:

>>> classifier = nltk.classify.NaiveBayesClassifier.train(train)  # note the use of NaiveBayesClassifier here
>>> for pdist in classifier.batch_prob_classify(test):
      print('%.4f %.4f' % (pdist.prob('x'), pdist.prob('y')))


0.3104 0.6896
0.5746 0.4254
0.3685 0.6315
0.6365 0.3635

正如 @Mike 指出的那样,您已经得到了预期的结果。您可能会因为页面上之前非常相似的示例而感到困惑。

我怎样可以从DecisionTreeClassifier中添加prob方法?你能提供任何示例或教程吗? - user2326956
我需要将方法添加到Python包决策树模块中还是完全分开成一个独立的类?谢谢。 - user2326956
2
@Raid 那需要花费相当多的工作量,我现在没有时间写。你可能会像这样子类化DecisionTreeClassifier类:DecisionTreeClassifier2(nltk.classify.DecisionTreeClassifier): . . .。然后,您将使用典型的Python子类化策略添加feature_probdistlabel_probdist。您可能需要覆盖此处的train方法,并编写一个还包括此训练方法功能的方法。 - Justin O Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接