pyml.classifiers.multi.onegainstrest(svm())オブジェクトを保存しますか?

StackOverflow https://stackoverflow.com/questions/2674123

質問

私は使用しています 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を渡しています...それで、分類器を保存するにはどうすればよいですか?


私がこれを使用しているプロジェクトはISです 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()および.load()を使用して保存することができます。そのバージョン以前は、分類器を保存/ロードすることは自明であり、エラーが発生しやすくなります。

他のヒント

Multi.pyで96行目に "self.classifiers [i] .train(datai)"が渡さずに呼び出されます。 - argumentが迷子になります。これが、マルチクラスクラシファイアの分類子を個別に保存しようとすると、エラーメッセージが表示される理由です。ただし、この行を変更してすべての引数を渡すと、各分類器を個別に保存できます。

#!/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