sklearn scikit machine learning learn espaƱol python scikit-learn regression svm scaling

python - machine - scikit learn pipeline



Escalar el objetivo hace que la regresiĆ³n SVM de Scikit-learn se descomponga (1)

La regresión de vectores de soporte usa una función de pérdida que solo es positiva si la diferencia entre el valor predicho y el objetivo excede algún umbral. Por debajo del umbral, la predicción se considera "lo suficientemente buena" y la pérdida es cero. Cuando reduce los objetivos, el alumno SVM puede salirse con la suya devolviendo un modelo plano, porque ya no incurre en ninguna pérdida.

El parámetro de umbral se llama epsilon en sklearn.svm.SVR ; establecerlo en un valor inferior para objetivos más pequeños. La matemática detrás de esto se explica aquí .

Al entrenar una regresión SVM, generalmente es recomendable escalar las características de entrada antes del entrenamiento.

Pero, ¿qué hay de escalar los objetivos? Por lo general, esto no se considera necesario, y no veo una buena razón por la que deba ser necesario.

Sin embargo, en el ejemplo scikit-learn para la 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 descompondrá a un valor constante. Escalar la variable objetivo antes del entrenamiento 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()