2017-02-09 10 views
0

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

import pandas as pd 
import numpy as np 
from sklearn import svm 
from sklearn.preprocessing import MinMaxScaler 

np.random.seed(0) 
X_training = np.random.rand(100,15)*10 
Y_training = np.random.rand(100,1)*10 
model = svm.SVR() 

без масштабирования:

model.fit(X_training,Y_training) 
print model.predict(X_training)[0:10] 

array([ 4.99980599, 6.99479293, 4.9784396 , 5.03911175, 6.99557904, 
     6.57214885, 6.99454049, 5.60940831, 6.99989978, 5.98628179]) 

Использование MinMax скейлер:

scaler = MinMaxScaler() 
X_scaled = scaler.fit_transform(X_training) 
model.fit(X_scaled,Y_training) 
model.predict(X_scaled)[0:10] 

array([ 5.63521939, 6.70378514, 5.83393228, 5.33274858, 6.47539108, 
     5.61135278, 5.7890052 , 5.74425789, 6.15799404, 6.1980326 ]) 

Хотя предсказание в том же порядке величины существует значительная разница между обоих случаях.

ответ

0

Для нормальной линейной регрессии вы правы, что масштабирование значений функций не должно иметь никакого эффекта. Разница здесь в том, что ядро ​​SVM по умолчанию для sklearn не является линейным.

Основываясь на docs для svm.SVR:

  • ядра параметр: Если иное не указано, «rbf» будет использоваться.

  • gamma параметр: Коэффициент ядра для 'rbf', 'poly' и 'sigmoid'. Если гамма является «авто», тогда вместо нее будут использоваться 1/n_features.

Ядро RBF выглядит сложным, но это не так. Он в основном просто производит 1.0, если вектор-функция соответствует базовому вектору и создает число, которое приближается к 0, когда они становятся более отдаленными. Параметр gamma управляет тем, как он отклоняется с расстоянием. Гамма-параметр по умолчанию sklearn, по-видимому, является фиксированным значением, основанным на том, сколько функций у вас есть. Таким образом, вы можете ожидать несколько разных результатов, если масштабировать вверх и вниз векторы объектов.

Я ожидаю, что если вы перейдете на kernel=‘linear’, вы получите точно такие же прогнозы.

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

  • Нет связанных вопросов^_^