Question

J'utilise PYML pour construire un support linéaire multiclasses machine de vecteur (SVM). Après la formation du SVM, je voudrais être en mesure de sauver le classificateur, de sorte que sur les exécutions suivantes je peux utiliser le classificateur tout de suite sans recyclage. Malheureusement, la fonction .save () ne sont pas mis en œuvre pour ce classificateur, et en essayant de décaper il (aussi bien avec cornichon standard et cPickle) donnent le message d'erreur suivant:

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

Quelqu'un sait-il d'une façon de contourner cela ou d'une autre bibliothèque sans ce problème? Merci.

Modifier / Mettre à jour
Je suis maintenant la formation et de tenter de sauver le classificateur avec le code suivant:

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

Notez que je suis maintenant avec le gardais mécanisme PyML économie plutôt que par le décapage, et que j'ai passé « saveSpace = False » à la fonction de formation. Cependant, je suis gettting encore une erreur:

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

Cependant, je passe saveSpace = Faux ... Alors, comment puis-je enregistrer le classificateur (s)?

P.S.
Le projet dont je me sers de ce en est- pyimgattr , au cas où vous souhaitez un exemple complet testable ... le programme est exécuté avec « le train ./pyimgattr.py » ... que vous obtiendrez cette erreur. En outre, une note sur les informations de version:

[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
Était-ce utile?

La solution 2

Obtenir une version plus récente de PyML. Depuis la version 0.7.4, il est possible d'enregistrer le classificateur OneAgainstRest (avec .save () et .load ()); avant cette version, l'enregistrement / chargement du classificateur est non trivial et sujette à erreur.

Autres conseils

Dans multi.py sur la ligne 96 "self.classifiers [i] .train (datai)" est appelée sans passer "** args", de sorte que si vous appelez "mc.train (données, saveSpace = False)" , ce saveSpace-argument se perd. C'est pourquoi vous obtenez un message d'erreur si vous essayez d'enregistrer les classificateurs dans votre multiclassent-classificateur individuellement. Mais si vous changez cette ligne pour passer tous les arguments, vous pouvez enregistrer chaque classificateur individuellement:

#!/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)]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top