El escalado del objective hace que la regresión SVM de Scikit-learn se descomponga

Cuando se entrena una regresión SVM, generalmente es recomendable escalar las características de entrada antes de entrenar.

Pero ¿qué hay de la escala de los objectives? Por lo general, esto no se considera necesario y no veo una buena razón por la que debería ser necesario.

Sin embargo, en el ejemplo de scikit-learn para regresión SVM de: http://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.html

Simplemente introduciendo la línea y = y / 1000 antes del entrenamiento, la predicción se dividirá en un valor constante. La escala de la variable objective antes de la capacitación resolvería el problema, pero no entiendo por qué es necesario.

¿Qué causa este 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() 

La regresión de vectores de soporte utiliza una función de pérdida que solo es positiva si la diferencia entre el valor predicho y el objective supera algún umbral. Por debajo del umbral, la predicción se considera “suficientemente buena” y la pérdida es cero. Cuando reduce los objectives, el aprendiz de SVM puede salirse con la suya con la devolución de un modelo plano, ya que ya no incurre en ninguna pérdida.

El parámetro de umbral se llama epsilon en sklearn.svm.SVR ; configúrelo en un valor más bajo para objectives más pequeños. Las matemáticas detrás de esto se explican aquí .