Сохранить объект PyML.classifiers.multi.OneAgainstRest(SVM())?

Я использую PYML построить MultiClass линейных опорных векторов (SVM). После обучения SVM я хотел бы иметь возможность сохранить классификатор, чтобы при последующих запусках я мог использовать классификатор сразу, без переобучения. К сожалению, функция.save() для этого классификатора не реализована, и попытка ее перехвата (как с помощью стандартного метода pickle, так и cPickle) выдает следующее сообщение об ошибке:

pickle.PicklingError: Невозможно засолить: он не найден как __builtin__.PySwigObject

Кто-нибудь знает способ обойти это или альтернативной библиотеки без этой проблемы? Благодарю.

Редактировать /Update
Сейчас я тренируюсь и пытаюсь сохранить классификатор с помощью следующего кода:

mc = multi.OneAgainstRest (SVM ());
mc.train (dataset_pyml, saveSpace = False);
    для i, классификатор в перечислении (mc.classifiers):
        имя файла =os.path.join(префикс, этикетки [I]+"SVM.");
        classifier.save(имя файла);

Обратите внимание, что теперь я сохраняю с помощью механизма сохранения PyML, а не с использованием метода консервирования, и что я передал "saveSpace=False" функции обучения. Тем не менее, я все еще получаю ошибку:

ValueError: чтобы сохранить набор данных, вы должны тренироваться как: s.train(data, saveSpace = False)

Тем не менее, я передаю saveSpace=False... так, как мне сохранить классификатор (ы)?

PS
Я использую этот проект - pyimgattr, на случай, если вам нужен полный тестируемый пример... программа запускается с "./pyimgattr.py train"... которая выдаст вам эту ошибку. Также обратите внимание на информацию о версии:

[michaelsafyan @ codemage / Тома / Хранилище /classes/cse559/pyimgattr]$ python
Python 2.6.1 (r261:67515, 11 февраля 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc., сборка 5646)] на Дарвине
Введите "помощь", "авторское право", "кредиты" или "лицензия" для получения дополнительной информации.
>>> импортировать PyML
>>> распечатать PyML.__ версия__
0.7.0

2 ответа

Решение

Получите более новую версию PyML. Начиная с версии 0.7.4, можно сохранить классификатор OneAgainstRest (с.save() и.load()); до этой версии сохранение / загрузка классификатора нетривиальна и подвержена ошибкам.

В multi.py в строке 96 "self.classifiers[i].train(datai)" вызывается без передачи "**args", так что если вы вызываете "mc.train(data, saveSpace=False)", это saveSpace Аргумент теряется. Вот почему вы получаете сообщение об ошибке, если пытаетесь сохранить классификаторы в мультиклассовом классификаторе по отдельности. Но если вы измените эту строку для передачи всех аргументов, вы можете сохранить каждый классификатор отдельно:

#!/usr/bin/python

import numpy

from PyML.utils import misc
from PyML.evaluators import assess
from PyML.classifiers.svm import SVM, loadSVM
from PyML.containers.labels import oneAgainstRest
from PyML.classifiers.baseClassifiers import Classifier
from PyML.containers.vectorDatasets import SparseDataSet
from PyML.classifiers.composite import CompositeClassifier

class OneAgainstRestFixed(CompositeClassifier) :

    '''A one-against-the-rest multi-class classifier'''

    def train(self, data, **args) :
        '''train k classifiers'''

        Classifier.train(self, data, **args)

        numClasses = self.labels.numClasses
        if numClasses <= 2:
            raise ValueError, 'Not a multi class problem'

        self.classifiers = [self.classifier.__class__(self.classifier)
                            for i in range(numClasses)]

        for i in range(numClasses) :
            # make a copy of the data; this is done in case the classifier modifies the data
            datai = data.__class__(data, deepcopy = self.classifier.deepcopy)
            datai =  oneAgainstRest(datai, data.labels.classLabels[i])

            self.classifiers[i].train(datai, **args)

        self.log.trainingTime = self.getTrainingTime()

    def classify(self, data, i):

        r = numpy.zeros(self.labels.numClasses, numpy.float_)
        for j in range(self.labels.numClasses) :
            r[j] = self.classifiers[j].decisionFunc(data, i)

        return numpy.argmax(r), numpy.max(r)

    def preproject(self, data) :

        for i in range(self.labels.numClasses) :
            self.classifiers[i].preproject(data)

    test = assess.test

train_data = """
0 1:1.0 2:0.0 3:0.0 4:0.0
0 1:0.9 2:0.0 3:0.0 4:0.0
1 1:0.0 2:1.0 3:0.0 4:0.0
1 1:0.0 2:0.8 3:0.0 4:0.0
2 1:0.0 2:0.0 3:1.0 4:0.0
2 1:0.0 2:0.0 3:0.9 4:0.0
3 1:0.0 2:0.0 3:0.0 4:1.0
3 1:0.0 2:0.0 3:0.0 4:0.9
"""
file("foo_train.data", "w").write(train_data.lstrip())

test_data = """
0 1:1.1 2:0.0 3:0.0 4:0.0
1 1:0.0 2:1.2 3:0.0 4:0.0
2 1:0.0 2:0.0 3:0.6 4:0.0
3 1:0.0 2:0.0 3:0.0 4:1.4
"""
file("foo_test.data", "w").write(test_data.lstrip())

train = SparseDataSet("foo_train.data")
mc = OneAgainstRestFixed(SVM())
mc.train(train, saveSpace=False)

test = SparseDataSet("foo_test.data")
print [mc.classify(test, i) for i in range(4)]

for i, classifier in enumerate(mc.classifiers):
    classifier.save("foo.model.%d" % i)

classifiers = []
for i in range(4):
    classifiers.append(loadSVM("foo.model.%d" % i))

mcnew = OneAgainstRestFixed(SVM())
mcnew.labels = misc.Container()
mcnew.labels.addAttributes(test.labels, ['numClasses', 'classLabels'])
mcnew.classifiers = classifiers
print [mcnew.classify(test, i) for i in range(4)]
Другие вопросы по тегам