Pergunta

estou a usar Pyml Para construir uma máquina vetorial de suporte linear multiclasse (SVM). Depois de treinar o SVM, gostaria de salvar o classificador, para que, nas execuções subsequentes, eu possa usar o classificador imediatamente sem reciclagem. Infelizmente, a função .Save () não é implementada para esse classificador, e a tentativa de detê -la (tanto com pickle e cpickle padrão) produz a seguinte mensagem de erro:

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

Alguém conhece uma maneira de contornar esta ou de uma biblioteca alternativa sem esse problema? Obrigado.

Editar/atualizar
Agora estou treinando e tentando salvar o classificador com o seguinte código:

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);

Observe que agora estou economizando com o mecanismo de salvamento pyml, e não com o decapagem, e que passei "Savespace = false" para a função de treinamento. No entanto, ainda estou recebendo um erro:

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

No entanto, estou passando pelo Savespace = Falso ... Então, como salvo o (s) classificador (s)?

Ps
O projeto em que estou usando isso é Pyimgattr, caso você queira um exemplo testável completo ... o programa é executado com "./pyimgattr.py Train" ... que lhe dará esse erro. Além disso, uma nota sobre informações da versão:

[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
Foi útil?

Solução 2

Obtenha uma versão mais recente do Pyml. Desde a versão 0.7.4, é possível salvar o classificador OneAGainsTrest (com .Save () e .load ()); Antes dessa versão, salvar/carregar o classificador é não trivial e propenso a erros.

Outras dicas

No Multi.Py na linha 96 "Self.classifiers [i] .Train (Datai)" é chamado sem passar "** args", de modo que, se você chamar "Mc.Train (Data, Savespace = False)", este Savespace -O argumento se perde. É por isso que você recebe uma mensagem de erro se tentar salvar os classificadores no seu classificador multiclasse individualmente. Mas se você alterar essa linha para passar em todos os argumentos, poderá salvar cada classificador individualmente:

#!/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)]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top