Pregunta

estoy usando PYML para construir un multiclase lineal máquina de vectores de soporte (SVM). Después de la formación de la SVM, me gustaría ser capaz de salvar el clasificador, por lo que en posteriores ejecuciones puedo usar el clasificador de inmediato sin el reciclaje. Desafortunadamente, la función .save () no está implementado para que clasificador, y tratando de conservar en vinagre que (ambos con salmuera estándar y cPickle) producir el mensaje de error:

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

¿Alguien sabe de alguna forma de evitar esto o de una biblioteca alternativa sin este problema? Gracias.

Editar / Actualizar
Ahora estoy entrenando y tratando de salvar el clasificador con el siguiente 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);

Tenga en cuenta que ahora estoy ahorrando con el PyML mecanismo de ahorro en lugar de con el decapado, y que me han pasado "saveSpace = False" a la función de formación. Sin embargo, todavía estoy gettting un error:

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

Sin embargo, estoy pasando saveSpace = False ... así que, ¿Cómo se guarda el clasificador (s)?

P.S.
El proyecto que estoy usando esto en es pyimgattr , en caso de que quiera un ejemplo comprobable completa ... el programa se ejecuta con el "tren ./pyimgattr.py" ... que le dará este error. Además, una nota sobre la información de la versión:

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

Solución 2

Obtener una versión más reciente de PyML. Desde la versión 0.7.4, es posible ahorrar el clasificador OneAgainstRest (con .save () y .load ()); antes de que la versión, guardar / cargar el clasificador no es trivial y propenso a errores.

Otros consejos

En multi.py en la línea 96 "self.classifiers [i] .train (datai)" se denomina sin pasar "** args", por lo que si usted llama "mc.train (datos, saveSpace = false)" , este saveSpace-argumento se pierde. Es por esto que se obtiene un mensaje de error si intenta guardar los clasificadores en su multiclase-clasificador individual. Pero si cambia esta línea para pasar todos los argumentos, puede guardar cada clasificador individual:

#!/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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top