2017-02-19 5 views
0

У меня ужасное время, устраняя проблему предупреждения, описанную в this question, к сожалению, следуя предложенным исправлениям, я не решаю проблему.Получение предупреждения об устаревании в Sklearn над массивом 1d

Видимо, я подаю 1D-массив в SVM.SVC, и я получаю предупреждения об устаревании. Я просто не могу понять, что я делаю неправильно, и я надеюсь, что кто-то может помочь мне исправить мой код. Я уверен, что это небольшая коррекция, которую мне не хватает.

Я использую Python 2.7

Я начинаю с dataframe data_df (размеры уменьшенной здесь для ясности, но кода и структуры являются точными):

Price/Sales Price/Book Profit Margin Operating Margin 
0   2.80  6.01   29.56    11.97 
1   2.43  4.98   25.56    6.20 
2   1.61  3.24   4.86    5.38 
3   1.52  3.04   4.86    5.38 
4   3.31  4.26   6.38    3.58 

изменить dataframe к Numpy массива:

X = data_df.values 

, который дает мне:

[[ 2.8, 6.01, 29.56, 11.97], 
[ 2.43, 4.98, 25.56, 6.2 ], 
[ 1.61, 3.24, 4.86, 5.38], 
[ 1.52, 3.04, 4.86, 5.38], 
[ 3.31, 4.26, 6.38, 3.58]] 

Тогда я центрирования и нормализовать мои данные:

X = preprocessing.scale(X) 

которые дают мне:

[[ 0.67746872 1.5428404 1.39746257 1.90843628] 
[ 0.13956437 0.61025495 1.03249454 -0.10540376] 
[-1.05254797 -0.96518067 -0.85621499 -0.3915994 ] 
[-1.18338957 -1.14626523 -0.85621499 -0.3915994 ] 
[ 1.41890444 -0.04164945 -0.71752714 -1.01983373]] 

Моя у представляет собой серию из 0 и 1.:

[0, 0, 1, 0, 1] 

Фактический набор данных составляет около 10 000 наблюдений. Я использую следующий код для выбора подмножества для обучения, тестирования и проверки точности:

test_size = 500 


clf = svm.SVC(kernel = "linear", C=1.0) 
clf.fit(X[:-test_size],y[:-test_size]) 

correct_count = 0 

for x in range(1, test_size+1): 
    if clf.predict(X[-x])[0] == y[-x]: 
     correct_count += 1 

print("Accuracy: ", correct_count/test_size * 100.00) 

Тест набор факторов корма в clf.predict (X [-x] при х = 1 до test_size +1) Приводит следующее предупреждение:

C:\Users\me\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\ut 
ils\validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecat 
ed in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.re 
shape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contain 
s a single sample. 
    DeprecationWarning) 

код работает, и я получаю прогнозы и я в состоянии вычислить точность, но я до сих пор бросает предупреждение.

Насколько я могу судить по поиску и указанному выше вопросу, мои данные находятся в надлежащей форме. Что мне не хватает?

Заранее за вашу помощь.

ответ

2

Вам просто нужно сделать то, что предлагает предупреждающее сообщение. Ваша переменная X[-x] 1D, но должна быть 2D. Это один образец с несколькими функциями, так что просто добавьте .reshape(1,-1) к нему и предупреждение проясняет:

for x in range(1, test_size+1): 
    if clf.predict(X[-x].reshape(1,-1))[0] == y[-x]: 
     correct_count += 1 

clf.predict функция способна предсказывать несколько значений с помощью нескольких функций. Если вы передаете массив 1D, неясно, было ли ваше намерение единым значением с несколькими функциями или несколькими значениями с одной функцией. В предупреждающем сообщении вам будет предложено сформировать 2D-массив, чтобы сделать различие явным.

+0

Спасибо за этот ответ. Я думал, что попробовал это, но у меня появилось другое перекрывающееся предупреждение, которое заставило меня думать, что это не работает. Однако вы могли бы более подробно объяснить, что делает .resape (-1,1)? Массив все еще представляет собой 1D массив списков.Кроме того, вы могли бы прояснить свое заявление «неясно, было ли ваше намерение единым значением с несколькими функциями или несколькими значениями с помощью одной функции». Благодарю. – Windstorm1981

+0

'-1' в' .reshape (1, -1) 'создает новое измерение в массиве, превращая 1D-массив в 2D-массив. Результат имеет 1 строку и столько же значений, сколько требуется новому измерению для хранения исходных 1D-данных. Обратите внимание на дополнительные круглые скобки при печати, обозначая размерность. 'clf.predict' может использовать несколько независимых переменных для прогнозирования одного результата, и он может прогнозировать сразу несколько результатов, каждый из которых имеет свой собственный срез двумерного входного массива. Если ему задан массив 1D, не сразу понятно, хотите ли вы использовать многие независимые переменные или предсказывать множество результатов. – Brian

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