Sklearn SVM: SVR и SVC, получение одинакового прогноза для каждого ввода

Вот вставка кода: образец кода SVM

Я проверил пару других ответов на эту проблему ... и похоже, что эта конкретная итерация проблемы немного отличается.

Во-первых, мои входные данные нормализованы, и у меня есть пять входов на точку. Все значения имеют разумный размер (здоровые 0,5 с и 0,7 с и т. Д. - несколько чисел около нуля или около 1).

У меня есть около 70 входов x, соответствующих их 70 входам y. Входы y также нормализованы (они представляют собой процентные изменения моей функции после каждого временного шага).

Я инициализирую свой SVR (и SVC), обучаю их, а затем тестирую их с 30 входами вне выборки ... и получаю точно такой же прогноз для каждого входа (и входы меняются на разумные величины - 0,3, 0,6 , 0,5 и т. Д.). Я бы подумал, что классификатор (по крайней мере) будет иметь некоторую дифференциацию ...

Вот код, который у меня есть:

# train svr

my_svr = svm.SVR()
my_svr.fit(x_training,y_trainr)

# train svc

my_svc = svm.SVC()
my_svc.fit(x_training,y_trainc)


# predict regression

p_regression = my_svr.predict(x_test)
p_r_series = pd.Series(index=y_testing.index,data=p_regression)

# predict classification

p_classification = my_svc.predict(x_test)
p_c_series = pd.Series(index=y_testing_classification.index,data=p_classification)

А вот образцы моих входных данных:

x_training = [[  1.52068627e-04   8.66880301e-01   5.08504362e-01   9.48082047e-01
7.01156322e-01],
              [  6.68130520e-01   9.07506250e-01   5.07182647e-01   8.11290634e-01
6.67756208e-01],
              ... x 70 ]

y_trainr = [-0.00723209 -0.01788079  0.00741741 -0.00200805 -0.00737761  0.00202704 ...]

y_trainc = [ 0.  0.  1.  0.  0.  1.  1.  0. ...]

И матрица x_test (5x30) похожа на матрицу x_training с точки зрения величин и дисперсии входных данных ... то же самое для y_testr и y_testc.

В настоящее время прогнозы для всех тестов точно такие же (0,00596 для регрессии и 1 для классификации ...)

Как мне заставить функции SVR и SVC выдавать соответствующие прогнозы? Или, по крайней мере, разные прогнозы на основе входных данных ...

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


person Chris    schedule 26.12.2015    source источник
comment
Вам нужно будет предоставить автономный работоспособный пример с образцами данных, которые действительно демонстрируют проблему.   -  person BrenBarn    schedule 27.12.2015
comment
Хорошо. Одна секунда (или около 10 минут =)   -  person Chris    schedule 27.12.2015
comment
@BrenBarn есть ссылка на пастебин кода. Я включил полные данные ...   -  person Chris    schedule 27.12.2015
comment
@bordeo, ты поможешь мне с этим, дорогой? stackoverflow.com/questions/40357805/   -  person Mahsolid    schedule 01.11.2016


Ответы (3)


Попробуйте увеличить C по умолчанию. Похоже, вы не подходите.

my_svc = svm.SVC(probability=True, C=1000)
my_svc.fit(x_training,y_trainc)

p_classification = my_svc.predict(x_test)

p_classification тогда становится:

array([ 1.,  0.,  1.,  0.,  1.,  1.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,
        1.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  0.,  1.,  1.,  1.,  1.,
        1.,  1.,  1.,  1.])

Для случая SVR вы также захотите уменьшить свой эпсилон.

my_svr = svm.SVR(C=1000, epsilon=0.0001)
my_svr.fit(x_training,y_trainr)

p_regression = my_svr.predict(x_test)

p_regression тогда становится:

array([-0.00430622,  0.00022762,  0.00595002, -0.02037147, -0.0003767 ,
        0.00212401,  0.00018503, -0.00245148, -0.00109994, -0.00728342,
       -0.00603862, -0.00321413, -0.00922082, -0.00129351,  0.00086844,
        0.00380351, -0.0209799 ,  0.00495681,  0.0070937 ,  0.00525708,
       -0.00777854,  0.00346639,  0.0070703 , -0.00082952,  0.00246366,
        0.03007465,  0.01172834,  0.0135077 ,  0.00883518,  0.00399232])

Вам следует настроить свой параметр C с помощью перекрестной проверки, чтобы он мог лучше всего работать с той метрикой, которая для вас наиболее важна. Вы можете посмотреть GridSearchCV, чтобы помочь вам в этом.

person David Maust    schedule 26.12.2015
comment
Хорошо ... здорово, спасибо - классификация заработала. SVR все еще не работает ... Но похоже, что я не делаю ничего плохого, так что это должно направить меня на верный путь. Как вы думаете, минимизация scipy поможет? Во всяком случае, вы знаете PCA? Улучшит ли этот бег ситуацию? (Думаю, мне понадобится вдвое больше обучающих данных ... и это может отбросить меня слишком далеко во времени ...) - person Chris; 27.12.2015
comment
Просто добавил правку для случая SVR. PCA, вероятно, вам не поможет. Сначала попробуйте настроить параметры с помощью GridSearchCV, затем вы сможете решить, нужны ли вам дополнительные данные. - person David Maust; 27.12.2015
comment
На самом деле, хороший способ увидеть, помогут ли дополнительные данные, - это построить кривую обучения, где вы изменяете объем данных и измеряете как тренировку, так и потерю сердечно-сосудистой системы. - person David Maust; 27.12.2015
comment
Ой. Кроме того, поскольку вы используете ядро, вы также можете настроить gamma. Этот эффект может быть довольно драматичным. - person David Maust; 27.12.2015

У меня была та же проблема, но по совершенно другой причине, и поэтому я искал решение в совершенно другом месте.

Если ваши входные данные для прогнозов по какой-либо причине масштабируются неправильно, вы можете столкнуться с теми же симптомами, что и здесь. Это может быть забвение (или неправильное кодирование) масштабирования входных значений в более позднем прогнозе или из-за того, что входные данные находятся в неправильном порядке.

person James Nowell    schedule 06.04.2017

В моем случае мне нужно было масштабировать мои данные с помощью StandardScaler в пакете sklearn.

Также мне пришлось масштабировать каждый набор функций независимо, в моем случае - два типа расстояний, каждый из которых масштабируется индивидуально.

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(X[:,0:10])
X[:,0:10] = ss.transform(X[:,0:10])
ss = StandardScaler()
ss.fit(X[:,10:20])
X[:,10:20] = ss.transform(X[:,10:20])
person John    schedule 26.10.2017