PyML:绘制决策表面图

时间:2013-02-26 07:47:01

标签: python data-visualization svm pyml

PyML具有绘制决策曲面图形的功能。

首先,您需要告诉PyML使用哪些数据。在这里,我使用sparsevectordata和我的特征向量。这是我用来训练SVM的那个。

demo2d.setData(training_vector)

然后你需要告诉它你想要使用哪个分类器。我给它一个训练有素的SVM。

demo2d.decisionSurface(best_svm, fileName = "dec.pdf")

但是,我收到此错误消息:

Traceback (most recent call last):
**deleted by The Unfun Cat**
    demo2d.decisionSurface(best_svm, fileName = "dec.pdf")
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyML/demo/demo2d.py", line 140, in decisionSurface
    results = classifier.test(gridData)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyML/evaluators/assess.py", line 45, in test
    classifier.verifyData(data)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyML/classifiers/baseClassifiers.py", line 55, in verifyData
    if len(misc.intersect(self.featureID, data.featureID)) != len(self.featureID) :
AttributeError: 'SVM' object has no attribute 'featureID'

1 个答案:

答案 0 :(得分:3)

我要潜入源头,因为我从未使用过PyML。试图在线查找,但我无法追踪PyML 0.7.2在线的verifyData方法,因此我不得不搜索已下载的来源。

分类器的featureID仅在baseClassifier类的train方法中设置(第77-78行):

if data.__class__.__name__ == 'VectorDataSet' :
        self.featureID = data.featureID[:]

在您的代码中,data.__class__.__name__正在评估"SparseDataSet"(或者您正在使用的其他类),表达式的计算结果为False(从不设置featureID)。

然后在demo2d.decisionSurface

gridData = VectorDataSet(gridX)
gridData.attachKernel(data.kernel)
results = classifier.test(gridData)

尝试使用VectorDataSet测试您的分类器。在这种情况下,classifier.test相当于对assess.test方法的调用,该方法尝试使用baseClassifier.verifyData验证数据是否具有与培训数据相同的功能:

def verifyData(self, data) :
  if data.__class__.__name__ != 'VectorDataSet' :
      return
  if len(misc.intersect(self.featureID, data.featureID)) != len(self.featureID) :
       raise ValueError, 'missing features in test data'

然后测试传递的数据的类,现在是"VectorDataSet",然后继续尝试访问从未创建的featureID属性。

基本上,它是 bug 或隐藏功能。

简而言之,您必须将数据转换为VectorDataSet,因为否则不会设置SVM.featureID

此外,您不需要传递经过训练的数据集,该功能会为您训练分类器。

修改

我还想提请注意setData方法:

def setData(data_) :
    global data
    data = data_

根本没有类型检查 。因此,某人可能会将data设置为任何,例如整数,字符串等,这将导致decisionSurface中的错误。

如果您要使用setData,则必须小心使用(仅限VectorDataSet),因为代码不像您希望的那样灵活。