Сохранить объект PyML.classifiers.multi.OneAgainstRest (SVM ())? - PullRequest
0 голосов
/ 20 апреля 2010

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

pickle.PicklingError: Can't pickle : it's not found as __builtin__.PySwigObject

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

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

mc = multi.OneAgainstRest(SVM());
mc.train(dataset_pyml,saveSpace=False);
    for i, classifier in enumerate(mc.classifiers):
        filename=os.path.join(prefix,labels[i]+".svm");
        classifier.save(filename);

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

ValueError: in order to save a dataset you need to train as: s.train(data, saveSpace = False)

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

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

[michaelsafyan@codemage /Volumes/Storage/classes/cse559/pyimgattr]$ python
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import PyML
>>> print PyML.__version__
0.7.0

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010

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

#!/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)]
0 голосов
/ 20 июня 2010

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

...