Vahid Mirjalili

Python Machine Learning


Скачать книгу

id="ulink_ea561f1c-8c2a-5b9e-b2cf-82b0d278ee06">Abordar el sobreajuste con la regularización

      El sobreajuste es un problema común en el aprendizaje automático, donde un modelo funciona bien en el entrenamiento de datos pero no generaliza bien con los datos no vistos (datos de prueba). Si un modelo sufre una situación de sobreajuste, también decimos que el modelo tiene una alta varianza, causada quizás por tener demasiados parámetros que conducen a un modelo demasiado complejo dados los datos subyacentes. De forma parecida, nuestro modelo también puede sufrir una situación de subajuste o underfitting (un sesgo elevado), que significa que nuestro modelo no es suficientemente complejo como para capturar correctamente el patrón en los datos de entrenamiento y, por lo tanto, sufre por el bajo rendimiento en los datos no vistos.

      Aunque hasta ahora solo hemos encontrado modelos lineales para clasificación, el problema del sobreajuste y el subajuste se puede ilustrar mejor mediante la comparación de un límite de decisión lineal con otros límites de decisión no lineales y más complejos, como se muestra en la siguiente imagen:

La varianza mide la consistencia (o variabilidad) de la predicción del modelo para una instancia de muestra en particular en el caso de tener que entrenar el modelo varias veces, por ejemplo en diferentes subconjuntos del conjunto de datos de entrenamiento. Podemos decir que el modelo es sensible a la aleatoriedad en los datos de entrenamiento. Al contrario, el sesgo mide cómo estarían de lejos las predicciones de los valores correctos si volviéramos a crear el modelo varias veces en distintos conjuntos de datos de entrenamiento; el sesgo es la medida del error sistemático que no procede de la aleatoriedad.

      Una manera de encontrar una buena compensación entre el sesgo y la varianza es afinar la complejidad del modelo mediante la regularización. La regularización es un método muy útil para manejar la colinealidad (alta correlación entre características), filtra el ruido de los datos y puede prevenir el sobreajuste. El concepto que hay detrás de la regularización es presentar información adicional (sesgo) para penalizar valores (peso) de parámetros extremos. La forma más común de regularización también se denomina regularización L2 (conocida a veces como contracción L2 o penalización de pesos), que puede escribirse de la siguiente forma:

      Aquí, también se denomina parámetro de regularización.

La regularización es otra de las razones por las que el escalado de características como la normalización es importante. Para que la regularización funcione adecuadamente, debemos asegurarnos de que todas nuestras características se encuentran en escalas comparables.

      La función de coste para la regresión logística se puede regularizar añadiendo un sencillo término de regularización, que contraerá los pesos durante el entrenamiento del modelo:

      Mediante el parámetro de regularización , podemos controlar el ajuste de los datos de entrenamiento manteniendo pequeños los pesos. Si aumentamos el valor de , aumentamos la fuerza de regularización.

      El parámetro C implementado para la clase LogisticRegression en scikit-learn procede de una convención entre las máquinas de vectores de soporte, tema que será tratado en la siguiente sección. El término C está directamente relacionado con el parámetro de regularización , que es su inverso. En consecuencia, reducir el valor del parámetro de regularización inverso C significa que estamos incrementando la fuerza de regularización, hecho que podemos visualizar mostrando gráficamente la ruta de regularización L2 para los dos coeficientes de peso:

      >>> weights, params = [], []

      >>> for c in np.arange(-5, 5):

      ... lr = LogisticRegression(C=10.**c, random_state=1)

      ... lr.fit(X_train_std, y_train)

      ... weights.append(lr.coef_[1])

      ... params.append(10.**c)

      >>> weights = np.array(weights)

      >>> plt.plot(params, weights[:, 0],

      ... label='petal length')

      >>> plt.plot(params, weights[:, 1], linestyle='--',

      ... label='petal width')

      >>> plt.ylabel('weight coefficient')

      >>> plt.xlabel('C')

      >>> plt.legend(loc='upper left')

      >>> plt.xscale('log')

      >>> plt.show()

      Si ejecutamos este código, ajustaremos diez modelos de regresión logística con distintos valores para el parámetro de regularización inverso C. A efectos de ilustración, solo hemos recogido los coeficientes de peso de la clase 1 (en este caso, la segunda clase en el conjunto de datos, Iris-versicolor) frente a todos los clasificadores –recuerda que estamos utilizando la técnica OvR para clasificación multiclase–.

      Como podemos ver en el diagrama resultante, los coeficientes de peso se contraen si reducimos el parámetro C, es decir, si aumentamos la fuerza de regularización:

Como un tratamiento más profundo de los algoritmos de clasificación individual supera el objetivo de este libro, recomendamos fervientemente Logistic Regression: From Introductory to Advanced Concepts and Applications, Dr. Scott Menard's, Sage Publications, 2009, para aquellos lectores que deseen aprender más acerca de la regresión logística.

      Otro potente algoritmo de aprendizaje muy utilizado es la máquina de vectores de soporte (SVM, del inglés Support Vector Machine), que puede considerarse una extensión del perceptrón. Con el algoritmo del perceptrón, minimizamos errores de clasificación. Sin embargo, con las SVM nuestro objetivo de optimización es maximizar el margen. El margen se define como la distancia entre el hiperplano de separación (límite de decisión) y las muestras de entrenamiento que están más cerca de ese hiperplano, que también se denominan vectores de soporte. Así lo mostramos en la siguiente imagen:

      El razonamiento que hay detrás de tener límites de decisión con amplios márgenes es que estos tienden a tener más bajo error de generalización allí donde los modelos con márgenes pequeños son más propensos al sobreajuste. Para hacernos una