2016-08-31 3 views
0

Я пытаюсь использовать Scikit для обучения 2 функций, называемых x1 и x2. Оба этих массива имеют форму (490,1). Чтобы передать один аргумент X в clf.fit(X,y), я использовал np.concatenate для получения формы массива (490,2). Массив метки состоит из 1 и 0 и имеет форму (490,). Код показан ниже:Ошибка Scikit SVM: X.shape [1] = 1 должен быть равен 2

x1 = int_x # previously defined array shape (490,1) 
x2 = int_x2 # previously defined array shape (490,1) 
y=np.ravel(close) # where close is composed of 1's and 0's shape (490,1) 
X,y = np.concatenate((x1[:-1],x2[:-1]),axis=1), y[:-1] #train on all datapoints except last 
clf = SVC() 
clf.fit(X,y) 

следующее сообщение об ошибке показано ниже:

X.shape[1] = 1 should be equal to 2, the number of features at training time 

То, что я не понимаю, почему это сообщение появляется, даже если при проверке формы X, это действительно 2, а не 1. Я изначально пробовал это только с одной особенностью, и clf.fit(X,y) работал хорошо, поэтому я склонен думать, что np.concatenate создал что-то, что не подходило. Любые предложения были бы замечательными.

ответ

0

Сложно сказать без конкретных значений int_x, int_x2 и close. В самом деле, если я пытаюсь с int_x, int_x2 и close случайным образом строится

import numpy as np 
from sklearn.svm import SVC 

int_x = np.random.normal(size=(490,1)) 
int_x2 = np.random.normal(size=(490,1)) 
close = np.random.randint(2, size=(490,)) 

который соответствует вашим спецификациям, то ваш код работает. Таким образом, ошибка может быть в том, как вы построили int_x, int_x2 и close.

Если вы считаете, что проблема не существует, можете ли вы поделиться минимальным воспроизводимым примером со специальными значениями int_x, int_x2 и close?

+0

Я просто попробовал это, используя тот же метод, что и вы, но получил ту же ошибку. Можете ли вы предоставить остальную часть кода, которая привела к успешному результату сверху? – ColeS

0

Я думаю, что понимаю, что случилось с моим кодом.

Во-первых, я должен был создать еще одну переменную, скажем x, который определил конкатенацию int_x и int_x2 и является форма: (490,2), который имеет такую ​​же форму, как close. Это пригодилось позже.

В настоящее время, clf.fit(X,y) не был правильным образом. Однако я неправильно сформулировал код предсказания. Например, я сказал: clf.predict([close[-1]]) в надежде захватить двоичный выходной сигнал (0 или 1). Аргумент, который был передан в этот метод, неверен. Это должно было быть clf.predict([x[-1]]), потому что алгоритм предсказывает метку в месте расположения, а не наоборот. Так как переменная x теперь имеет ту же форму, что и close, то результат clf.predict([x[-1]]) должен давать прогнозируемый результат close[-1].

Смежные вопросы