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), потому что код не так гибок, как хотелось бы.

Другие вопросы по тегам