2

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'
4

1 回答 1

3

我将直接深入研究源代码,因为我从未使用过 PyML。试图在网上找到它,但我无法在网上找到PyML 0.7.2verifyData中的方法,所以我不得不搜索下载的源代码。

分类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'

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

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

长话短说,您必须将数据转换为 aVectorDataSet因为SVM.featureID未设置其他方式。

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

编辑:

我还想提请注意该setData方法:

def setData(data_) :
    global data
    data = data_

根本没有类型检查。所以有人可能会设置data任何东西,例如整数、字符串等,这将导致decisionSurface.

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

于 2013-03-05T20:20:43.290 回答