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

вот вставка кода:SVM пример кода

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

во-первых, мои входы нормализованы, и у меня есть пять входов на точку. Все значения имеют разумный размер (здоровые 0.5 s и 0.7 S и т. д.-немногие около нуля или около 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, чтобы выплюнуть соответствующие прогнозы? Или, по крайней мере различные прогнозы, основанные на входных данных...

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

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 case вы также захотите уменьшить свой Эпсилон.

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, чтобы помочь вам сделать это.


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

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


в моем случае мне нужно было масштабировать мои данные с помощью 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])