Как мне изменить тестовые данные для метода SVM, чтобы можно было без ошибок использовать функцию ядра `precomputed`? - PullRequest
2 голосов
/ 19 апреля 2019

Я использую sklearn.svm.SVR для «задачи регрессии», в которой я хочу использовать свой «настроенный метод ядра».Вот примеры набора данных и код:

 index   density     speed        label
 0         14      58.844020    77.179139
 1         29      67.624946    78.367394
 2         44      77.679100    79.143744
 3         59      79.361877    70.048869
 4         74      72.529289    74.499239
 .... and so on

from sklearn import svm
import pandas as pd
import numpy as np

density = np.random.randint(0,100, size=(3000, 1))
speed   = np.random.randint(20,80, size=(3000, 1)) + np.random.random(size=(3000, 1))
label   = np.random.randint(20,80, size=(3000, 1)) + np.random.random(size=(3000, 1))

d    = np.hstack((a,b,c))
data = pd.DataFrame(d, columns=['density', 'speed', 'label'])
data.density = data.density.astype(dtype=np.int32)

def my_kernel(X,Y):
    return np.dot(X,X.T)

svr = svm.SVR(kernel=my_kernel)
x = data[['density', 'speed']].iloc[:2000]
y = data['label'].iloc[:2000]
x_t = data[['density', 'speed']].iloc[2000:3000]
y_t = data['label'].iloc[2000:3000]

svr.fit(x,y)
y_preds = svr.predict(x_t)

проблема возникает в последней строке svm.predict, которая гласит:

X.shape[1] = 1000 should be equal to 2000, the number of samples at training time

Я искал в Интернете, чтобы найти способ разобратьсяс проблемой, но многие вопросы (например, {1} , { 2 }, { 3 }) остались без ответа.

На самом делеЯ использовал SVM-методы с rbf, sigmoid, ... раньше, и код работал просто отлично, но я впервые использовал настраиваемые ядра, и я подозревал, что это должно быть причиной возникновения этой ошибки.

Итак, после небольшого исследования и чтения документации я обнаружил, что при использовании precomputed ядер форма матрицы для SVR.predict() должна быть похожа на [n_samples_test, n_samples_train] shape.

Интереснокак изменить x_test, чтобы получить прогнозы, и все работает отлично, без проблем, как, например, когда мы не используем настроенные ядра?

Если возможно, опишите, пожалуйста, причину, по которой входные данные для svm.predictфункция в ядре precomputed отличается от других ядер ".

Я действительно надеюсь, что на оставшиеся без ответа вопросы, связанные с этой проблемой, можно будет ответить соответственно.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2019

Проблема в вашей функции ядра, она не выполняет свою работу.

Как указано в документации https://scikit -learn.org / stable / modules / svm.html # using-python-functions-as-kernels гласит: «Ваше ядро ​​должно принимать в качестве аргументов две матрицы формы (n_samples_1, n_features), (n_samples_2, n_features) и вернуть матрицу ядра формы (n_samples_1, n_samples_2). " Образец ядра на той же странице удовлетворяет следующим критериям:

def my_kernel(X, Y):
    return np.dot(X, Y.T)

В вашей функции вторым аргументом dot является X.T, и, следовательно, результат будет иметь форму (n_samples_1, n_samples_1), которая не является ожидаемой.

0 голосов
/ 19 апреля 2019

Форма не совпадает означает, что тестовые данные и данные о поездах не совпадают, всегда думайте о матрице или массиве в виде кучи. Если вы делаете какую-либо арифметическую операцию, вам всегда нужна похожая форма. Вот почему мы проверяем array.shape. [n_samples_test, n_samples_train] вы можете изменять фигуры, но это не лучшая идея.

array.shape, изменить форму, изменить размер используются для этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...