0

PYMLを使用して、マルチクラス線形サポートベクターマシン(SVM)を構築しています。SVMをトレーニングした後、分類器を保存できるようにしたいと思います。これにより、以降の実行で、再トレーニングせずに分類器をすぐに使用できます。残念ながら、.save()関数はその分類子に実装されておらず、それを(標準のpickleとcPickleの両方で)pickleしようとすると、次のエラーメッセージが表示されます。

pickle.PicklingError:ピクルスできません:__builtin__。PySwigObjectとして見つかりません

誰かがこれを回避する方法またはこの問題のない代替ライブラリを知っていますか?ありがとう。

編集/更新
私は現在、次のコードで分類子をトレーニングして保存しようとしています。

mc = multi.OneAgainstRest(SVM());
mc.train(dataset_pyml、saveSpace = False);
    iの場合、enumerate(mc.classifiers)の分類子:
        filename = os.path.join(prefix、labels [i] + "。svm");
        classifier.save(ファイル名);

現在、ピクルスではなくPyML保存メカニズムを使用して保存していることに注意してください。また、トレーニング関数に「saveSpace=False」を渡していることに注意してください。ただし、まだエラーが発生しています。

ValueError:データセットを保存するには、次のようにトレーニングする必要があります:s.train(data、saveSpace = False)

ただし、saveSpace = Falseを渡しています...では、分類子を保存するにはどうすればよいですか?

PS
私がこれを使用しているプロジェクトはpyimgattrです。完全なテスト可能な例が必要な場合に備えて、プログラムは「./pyimgattr.pytrain」で実行されます...このエラーが発生します。また、バージョン情報に関する注意:

[michaelsafyan @ codemage / Volumes / Storage / classes / cse559 / pyimgattr] $ python
Python 2.6.1(r261:67515、2010年2月11日、00:51:29)
[GCC 4.2.1(Apple Inc.ビルド5646)]ダーウィン
詳細については、「help」、「copyright」、「credits」、または「license」と入力してください。
>>>PyMLをインポートする
>>>印刷PyML.__version__
0.7.0
4

2 に答える 2

2

multi.py の 96 行目では、"**args" を渡さずに "self.classifiers[i].train(datai)" を呼び出しているため、"mc.train(data, saveSpace=False)" を呼び出すと、この saveSpace -引数が失われます。これが、分類子を multiclass-classifier に個別に保存しようとすると、エラー メッセージが表示される理由です。ただし、この行をすべての引数を渡すように変更すると、各分類子を個別に保存できます。

#!/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)]
于 2010-04-20T17:13:57.493 に答える
0

PyML の新しいバージョンを入手してください。バージョン 0.7.4 以降、OneAgainstRest 分類子を保存することが可能になりました (.save() と .load() を使用)。そのバージョンより前では、分類子の保存/読み込みは簡単ではなく、エラーが発生しやすくなっています。

于 2010-06-20T06:51:30.013 に答える