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 ответ
Я собираюсь погрузиться прямо в источник, потому что я никогда не использовал PyML. Пытался найти его в Интернете, но я не мог отследить verifyData
метод в PyML 0.7.2, который был в сети, поэтому мне пришлось искать через загруженный источник.
Классификатор 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
), потому что код не так гибок, как хотелось бы.