我在使用 PYML 建造一个多类支持向量线性机(SVM)。培训后的SVM,我希望能够保存的分类,以便在随后的运行,我可以使用的分类,无需再培训。不幸的是,中。save()功能没有实现为这类器,并试图坐它(两种标准的坐和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...因此,我要如何保存的分类(s)?

P.S.
该项目的我用这个在是 pyimgattr, 你就像一个完整的测试。该程序运行的"。/pyimgattr.py 火车"...这会让你这个错误。此外,一份关于版本信息:

[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

得到一个较新的版本PyML.由于版0.7.4,它能够节省OneAgainstRest分类(。save()and。load());在此之前的版本,节省/装载的分类是不平凡的和容易出错。

其他提示

在multi.py 在线96"的自我。分类[i]。火车(达泰)"被称为没有通过"**args",所以,如果你所说的"mc。火车(数据,saveSpace=False)",这saveSpace参丢失。这就是为什么你会得到一个错误信息,如果你试图保存的分类在多类别分类器。但是,如果你改变这个行通过的所有论点,可以节省的每一分类单独:

#!/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)]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top