2014-08-31 12 views
5

Podczas treningu regresji maszyny SVM zwykle zaleca się skalowanie elementów wejściowych przed treningiem.Skalowanie celu powoduje naukową regresję SVM dla Scikita, aby się zepsuć.

Ale co z skalowaniem celów? Zwykle nie jest to uważane za konieczne i nie widzę dobrego powodu, dla którego powinno to być konieczne.

Jednakże w przykładzie scikit-learn w SVM regresji z: http://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.html

tylko przez wprowadzenie do linii y = y/1000 przed szkolenia przewidywania zepsuje się do stałej wartości. Skalowanie zmiennej docelowej przed treningiem rozwiązałoby problem, ale nie rozumiem, dlaczego jest to konieczne.

Co powoduje ten problem?

import numpy as np 
from sklearn.svm import SVR 
import matplotlib.pyplot as plt 

# Generate sample data 
X = np.sort(5 * np.random.rand(40, 1), axis=0) 
y = np.sin(X).ravel() 

# Add noise to targets 
y[::5] += 3 * (0.5 - np.random.rand(8)) 

# Added line: this will make the prediction break down 
y=y/1000 

# Fit regression model 
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1) 
svr_lin = SVR(kernel='linear', C=1e3) 
svr_poly = SVR(kernel='poly', C=1e3, degree=2) 
y_rbf = svr_rbf.fit(X, y).predict(X) 
y_lin = svr_lin.fit(X, y).predict(X) 
y_poly = svr_poly.fit(X, y).predict(X) 

# look at the results 
plt.scatter(X, y, c='k', label='data') 
plt.hold('on') 
plt.plot(X, y_rbf, c='g', label='RBF model') 
plt.plot(X, y_lin, c='r', label='Linear model') 
plt.plot(X, y_poly, c='b', label='Polynomial model') 
plt.xlabel('data') 
plt.ylabel('target') 
plt.title('Support Vector Regression') 
plt.legend() 
plt.show() 

Odpowiedz

7

Pomoc wektor regresja używa funkcji strat, która zostaje tylko pozytywny, jeżeli różnica pomiędzy wartością przewidywaną a celem przekracza pewien próg. Poniżej progu prognoza jest uważana za "wystarczająco dobrą", a strata wynosi zero. Po zmniejszeniu celów, osoba ucząca się SVM może uciec, zwracając płaski model, ponieważ nie powoduje już żadnych strat.

Parametr progowy nazywa się epsilon w sklearn.svm.SVR; ustaw niższą wartość dla mniejszych celów. Matematyka tego jest wyjaśniona here.

+0

To było to, dziękuję za odpowiedź. Tak więc w przypadku modelu generycznego dostępne są opcje skalowania obiektu docelowego lub uwzględnienia epsilon w moim przeszukiwaniu siatki. Czy masz radę, co ma więcej sensu? – user1774143

+1

@ user1774143 Wyszukiwanie siatki dla prawego 'epsilon'. Skalowanie "y" jest równoważne, ale podatne na błędy. –