Вопрос

я использую Пимл Чтобы построить многоклассную линейную поддержку векторную машину (SVM). После тренировки SVM я хотел бы иметь возможность сохранить классификатор, так что на последующих прогонах я могу использовать классификатор, без переподготовки. К сожалению, функция .save () не реализована для этого классификатора и попытка раскручивания его (как со стандартным сортировкой, так и CPICKle) давать следующее сообщение об ошибке:

Pickle.PickLingError: не могу созревать: он не найден как __Builtin __. Pyswigobject

Кто-нибудь знает об этом или альтернативной библиотеке без этой проблемы? Спасибо.

Редактировать / Обновить
Я сейчас тренируюсь и пытаюсь сохранить классификатор со следующим кодом:

MC = Multi.oneaGainstrest (SVM ()); mc.train (dataset_pyml, savespace = false); Для I, классификатор в перечислении (mc.classifiers): filename = os.path.join (префикс, этикетки [i] + ". SVM"); классификатор .save (filename);

Обратите внимание, что я сейчас спасаю с механизмом сохранения Pyml, а не с маринованием, и что я прошел «Savespace = False» на функцию обучения. Тем не менее, я все еще получаю ошибку:

ValuctionError: Чтобы сохранить набор данных, вам нужно тренироваться как: s.train (данные, savespace = false)

Тем не менее, я пропускаю Savespace = False ... Итак, как я могу сохранить классификатор (ы)?

PS.
Проект, который я использую это в том, пюймгаттр, В случае, если вы хотите получить полный тестируемый пример ... Программа работает с «./PYIMGATTR.PY TRAY» ... Это получит вам эту ошибку. Также записка по информации о версии:

Michaelsafyan @ CodeMage / тома / классы / классы / CSE559 / Pyimgattr] $ Python Python 2.6.1 (R261: 67515, 11 февраля 2010, 00:51:29) [GCC 4.2.1 (Apple Inc. Build 5646)] Дарвин Тип «Помощь», «Авторское право», «Кредиты» или «Лицензия» для получения дополнительной информации. >>> Импорт Pyml >>> Печать Pyml .__ Версия __ 0.7.0
Это было полезно?

Решение 2

Получите более новую версию Pyml. Поскольку версия 0.7.4, можно сохранить классификатор OneAgainster (с .save () и .load ()); До этой версии сохранение / загрузка классификатора нетривиальная и подвержена ошибкам.

Другие советы

В multi.py на линии 96 "self.classiers [i] .train (datai)" называется без прохождения "** args", так что если вы вызываете «Mc.train (Data, Savespace = false)», это Savespace -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