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'
答案 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
),因为代码不像您希望的那样灵活。