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'

最佳答案

我将直接研究源代码,因为我从未使用过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属性。

基本上,它要么是错误,要么是隐藏功能。

长话短说,您必须将数据转换为VectorDataSet,因为否则未设置SVM.featureID

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

编辑:

我还想提一下setData方法:

def setData(data_) :
    global data
    data = data_


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

如果要使用setData,则必须谨慎使用(仅用于VectorDataSet),因为代码不如您所希望的灵活。

关于python - PyML:绘制决策图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15083931/

10-11 10:34