2014-08-31 9 views
5

Quando si allena una regressione SVM, in genere è consigliabile ridimensionare le caratteristiche dell'input prima dell'allenamento.Il ridimensionamento del target causa Scikit: impara la regressione SVM al guasto

Ma che dire del ridimensionamento degli obiettivi? Di solito questo non è considerato necessario, e non vedo una buona ragione per cui dovrebbe essere necessario.

Tuttavia nell'esempio scikit-learn per SVM regressione da: http://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.html

Semplicemente introducendo la linea y = y/1000 prima dell'allenamento, la predizione si rompe a un valore costante. Scalare la variabile target prima dell'allenamento risolverebbe il problema, ma non capisco perché sia ​​necessario.

Quali sono le cause di questo problema?

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() 

risposta

7

Help vettoriale regressione utilizza una funzione di perdita che è soltanto positivo se la differenza tra il valore previsto e la destinazione supera una certa soglia. Sotto la soglia, la previsione è considerata "abbastanza buona" e la perdita è zero. Quando ridimensiona i bersagli, lo studente SVM può farla franca restituendo un modello piatto, perché non subisce alcuna perdita.

Il parametro di soglia è chiamato epsilon in sklearn.svm.SVR; impostalo su un valore inferiore per obiettivi più piccoli. La matematica dietro a questo è spiegata here.

+0

Ecco, grazie per la risposta. Quindi, per un modello generico, le opzioni sono di ridimensionare l'obiettivo o di includere epsilon nella mia ricerca di griglia. Hai un consiglio che cosa ha più senso? – user1774143

+1

@ user1774143 Grid-search per il corretto 'epsilon'. La scala 'y' è equivalente, ma soggetta a errori. –

Problemi correlati