Frage

Ich bin mit PYML einem mehrklassige linearen Support-Vektor-Maschine (SVM) zu konstruieren. Nach dem SVM Training, würde Ich mag die Klassifizierer in der Lage sein zu speichern, so dass bei nachfolgenden Läufen ich den Klassifikator sofort ohne Umschulung nutzen kann. Leider ist die .save () Funktion nicht für diesen Klassifikator implementiert, und den Versuch, sie (beide mit Standard-Beize und cPickle) ergibt die folgende Fehlermeldung beizen:

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

Kennt jemand eine Möglichkeit, um diese oder eine alternativen Bibliothek ohne dieses Problem? Danke.

Bearbeiten / Aktualisieren
Ich bin jetzt trainiert und versucht, den Klassifikator mit dem folgenden Code zu speichern:

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

Beachten Sie, dass ich jetzt mit dem PyML Sparmechanismus speicherte anstatt mit Beizen, und dass ich bestanden „saveSpace = False“, um die Trainingsfunktion. Aber ich bin immer noch einen Fehler gettting:

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

Allerdings bin ich vorbei saveSpace = False ... so, wie speichere ich den Sichter (n)?

P. S.
Das Projekt, das ich bin mit diesem in pyimgattr im Fall, dass Sie ein komplettes prüfbar Beispiel mögen ... wird das Programm mit „./pyimgattr.py Zug“ laufen ... dass Sie diesen Fehler erhalten. Auch ein Hinweis auf die Versionsinformationen:

[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
War es hilfreich?

Lösung 2

Hier finden Sie eine neuere Version von PyML. Seit Version 0.7.4 ist es möglich, die OneAgainstRest Sichter (mit .save () und .load ()) zu speichern; vor dieser Version, Speichern / Laden der Klassifikator ist nicht trivial und fehleranfällig ist.

Andere Tipps

In multi.py on line 96 "self.classifiers [i] .train (datai)" wird aufgerufen, ohne den Weg "** args", so dass, wenn Sie rufen "mc.train (Daten, saveSpace = False)" dieses saveSpace-Argument geht verloren. Aus diesem Grunde ist eine Fehlermeldung erhalten, wenn Sie versuchen, individuell die Klassifizierer in Ihrem Multiclass-Klassifikator zu speichern. Aber wenn Sie diese Zeile ändern, um alle Argumente zu übergeben, können Sie jeden Klassifikator speichern einzeln:

#!/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)]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top