SVM: Модель, созданная с нуля, после обучения

Как я могу сгенерировать свою модель после обучения? Я не использовал пакет sklearn для моей пригодности и предсказания. Мой код выглядит так:

class SVM(object):

def __init__(self, kernel=polynomial_kernel, C=None):
    self.kernel = kernel
    self.C = C
    if self.C is not None: self.C = float(self.C)

def fit(self, X, y):
    n_samples, n_features = X.shape

    # Gram matrix
    K = np.zeros((n_samples, n_samples))
    for i in range(n_samples):
        for j in range(n_samples):
            K[i,j] = self.kernel(X[i], X[j])

    P = cvxopt.matrix(np.outer(y,y) * K)
    q = cvxopt.matrix(np.ones(n_samples) * -1)
    A = cvxopt.matrix(y, (1,n_samples))
    b = cvxopt.matrix(0.0)

    if self.C is None:
        G = cvxopt.matrix(np.diag(np.ones(n_samples) * -1))
        h = cvxopt.matrix(np.zeros(n_samples))
    else:
        tmp1 = np.diag(np.ones(n_samples) * -1)
        tmp2 = np.identity(n_samples)
        G = cvxopt.matrix(np.vstack((tmp1, tmp2)))
        tmp1 = np.zeros(n_samples)
        tmp2 = np.ones(n_samples) * self.C
        h = cvxopt.matrix(np.hstack((tmp1, tmp2)))

    # solve QP problem
    solution = cvxopt.solvers.qp(P, q, G, h, A, b)

    # Lagrange multipliers
    a = np.ravel(solution['x'])

    # Support vectors have non zero lagrange multipliers
    sv = a > 1e-5
    ind = np.arange(len(a))[sv]
    self.a = a[sv]
    self.sv = X[sv]
    self.sv_y = y[sv]
    print("%d support vectors out of %d points" % (len(self.a), n_samples))

    # Intercept
    self.b = 0
    for n in range(len(self.a)):
        self.b += self.sv_y[n]
        self.b -= np.sum(self.a * self.sv_y * K[ind[n],sv])
    self.b /= len(self.a)


    # Weight vector
    if self.kernel == linear_kernel:
        self.w = np.zeros(n_features)
        for n in range(len(self.a)):
            self.w += self.a[n] * self.sv_y[n] * self.sv[n]
    else:
        self.w = None

def project(self, X):
    if self.w is not None:
        return np.dot(X, self.w) + self.b
    else:
        y_predict = np.zeros(len(X))
        for i in range(len(X)):
            s = 0
            for a, sv_y, sv in zip(self.a, self.sv_y, self.sv):
                s += a * sv_y * self.kernel(X[i], sv)
            y_predict[i] = s
        return y_predict + self.b

def predict(self, X):
    return np.sign(self.project(X))

И я попытался отобразить свою модель в своем тестовом файле:

self.clf = SVM(C=1000.1)
self.svm_model=self.clf.fit(X, Y)
print(self.svm_model)

Вывод показывает:

Никто

Затем я попробовал сохранить модель в Pickle:

    SVM_pkl_filename=QtGui.QFileDialog.getSaveFileName(self,'Save File')

    print ("SVM classifier :: ", self.svm_model)

    #SVM_pkl_filename = 'SVM_model.pkl'
    SVM_model_pkl = open(SVM_pkl_filename, 'wb')
    # Dump the trained SVM classifier with Pickle
    pickle.dump(self.svm_model, SVM_model_pkl)

    # Close the pickle instances
    SVM_model_pkl.close()

И открываю сохраненный файл, ничего не показывает. Я сравнил его с моим другим файлом сохраненной модели со Sklearn, и в нем есть случайное содержимое.

Цель моей модели - сохранить и загрузить ее с помощью Pickle. Я использовал Pickle для обучения своих 4 наборов данных, которые моя модель будет обновлять каждый раз, когда я обучаю свои наборы данных. И загрузите модель для тестирования.


person Christel Junco    schedule 04.03.2018    source источник


Ответы (1)


Проблема в этой строке - self.svm_model=self.clf.fit(X, Y)

Обратите внимание, что вы пытаетесь сохранить вывод функции fit() в self.svm_model, но функция fit() ничего не возвращает.

Либо вам нужно назначить оператор return функции подбора, либо назначить объект self.svm_model на месте в функции fit().

Кроме того, у меня нет четкого представления о том, что вы хотите от svm_model. Вы хотите сохранить веса или вам нужен удобный объект, у которого есть свои собственные fit() и predict() методы, такие как scikit-learn?

Предположим, вы просто хотите сохранить веса, измените функцию fit() на return self.w в конце.

pickle не работает - это просто следствие этого. Как только вы решите svm_model проблему, травление должно исчезнуть само.

ИЗМЕНИТЬ

В вашем коде есть еще одно условие -

else:
        self.w = None

Еще одна причина, по которой он может вернуть None. Трудно сказать, не глядя на исполнение вместе с данными.

Что касается проверки перед травлением, вы можете выполнить простую нулевую проверку.

if not self.svm_model: # check not None
    # pickle here
person Vivek Kalyanarangan    schedule 04.03.2018
comment
Спасибо за вашу помощь, да, я хочу сохранить веса для корректировки или обновления весов каждый раз, когда я тренируюсь. Я пытаюсь добавить return self.w в свою функцию fit (), но все равно. Как я могу узнать, успешно ли я сгенерировал свою модель и готов к использованию в Pickle? - person Christel Junco; 04.03.2018
comment
Я просто хочу создать модель, которую можно сохранить и загрузить в Pickle. - person Christel Junco; 04.03.2018
comment
Оно работает! Спасибо. Как насчет удобного объекта, у которого есть fit () и pred (), как scikit-learn? Есть ли у вас какие-либо идеи? - person Christel Junco; 04.03.2018