pyml.classifiers.multi.onegainstrest(svm())オブジェクトを保存しますか?
質問
私は使用しています 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)]