La regresión es una tarea de modelización que implica la predicción de un valor numérico dado una entrada.
La regresión lineal es el algoritmo estándar para la regresión que asume una relación lineal entre las entradas y la variable objetivo. Una extensión de la regresión lineal implica añadir penalizaciones a la función de pérdida durante el entrenamiento que fomentan modelos más simples que tienen valores de coeficientes más pequeños. Estas extensiones se denominan regresión lineal regularizada o regresión lineal penalizada.
Red elástica es un tipo popular de regresión lineal regularizada que combina dos penalizaciones populares, específicamente las funciones de penalización L1 y L2.
En este tutorial, descubrirás cómo desarrollar la regresión regularizada de Elastic Net en Python.
Después de completar este tutorial, lo sabrás:
- La red elástica es una extensión de la regresión lineal que añade penalizaciones de regularización a la función de pérdida durante el entrenamiento.
- Cómo evaluar un modelo de Elastic Net y utilizar un modelo final para hacer predicciones para nuevos datos.
- Cómo configurar el modelo de la Red Elástica para un nuevo conjunto de datos a través de la búsqueda en la red y de forma automática.
Empecemos.
Resumen del Tutorial
Este tutorial está dividido en tres partes; son:
- Regresión de la red elástica
- Ejemplo de regresión de la red elástica
- Sintonización de los hiperparámetros de la red elástica
Regresión de la red elástica
La regresión lineal se refiere a un modelo que asume una relación lineal entre las variables de entrada y la variable objetivo.
Con una sola variable de entrada, esta relación es una línea, y con dimensiones más altas, esta relación puede ser pensada como un hiperplano que conecta las variables de entrada con la variable objetivo. Los coeficientes del modelo se encuentran a través de un proceso de optimización que busca minimizar el error de suma al cuadrado entre las predicciones (yhat) y los valores objetivo esperados (y).
- pérdida = suma i=0 a n (y_i – yhat_i)^2
Un problema con la regresión lineal es que los coeficientes estimados del modelo pueden llegar a ser grandes, lo que hace que el modelo sea sensible a las entradas y posiblemente inestable. Esto es particularmente cierto para los problemas con pocas observaciones (muestras) o más muestras (n) que los predictores de entrada (p) o variables (las llamadas p >> n problemas).
Un enfoque para abordar la estabilidad de los modelos de regresión es cambiar la función de pérdida para incluir los costos adicionales de un modelo que tiene grandes coeficientes. Los modelos de regresión lineal que utilizan estas funciones de pérdida modificadas durante la formación se denominan colectivamente regresión lineal penalizada.
Una penalización popular es penalizar un modelo basado en la suma de los valores de los coeficientes cuadrados. Esto se llama una penalización L2. Una penalización L2 minimiza el tamaño de todos los coeficientes, aunque impide que se eliminen del modelo los coeficientes.
- l2_penalty = suma j=0 a p beta_j^2
Otra penalización popular es penalizar un modelo basado en la suma de los valores de los coeficientes absolutos. Esto se llama la penalización L1. Una penalización L1 minimiza el tamaño de todos los coeficientes y permite que algunos coeficientes se minimicen hasta el valor cero, lo que elimina el predictor del modelo.
- l1_penalty = suma j=0 a p abs(beta_j)
La red elástica es un modelo de regresión lineal penalizada que incluye las penalizaciones L1 y L2 durante el entrenamiento.
Usando la terminología de «Los elementos del aprendizaje estadístico», un hiperparámetro «alfa» para asignar el peso de cada una de las penalizaciones L1 y L2. Alfa es un valor entre 0 y 1 y se utiliza para ponderar la contribución de la penalización L1 y uno menos el valor alfa se utiliza para ponderar la penalización L2.
- elastic_net_penalty = (alpha * l1_penalty) + ((1 – alpha) * l2_penalty)
Por ejemplo, un alfa de 0,5 proporcionaría una contribución del 50 por ciento de cada penalización a la función de pérdida. Un valor alfa de 0 da todo el peso a la penalización L2 y un valor de 1 da todo el peso a la penalización L1.
El parámetro alfa determina la mezcla de las penalizaciones, y a menudo se elige previamente por motivos cualitativos.
– Página 663, Los elementos del aprendizaje estadístico, 2016.
El beneficio es que la red elástica permite un equilibrio de ambas penalizaciones, lo que puede dar lugar a un mejor rendimiento que un modelo con una u otra penalización en algunos problemas.
Se proporciona otro hiperparámetro llamado «lambda«que controla la ponderación de la suma de ambas penas a la función de pérdida. Un valor por defecto de 1,0 se utiliza para utilizar la pena totalmente ponderada; un valor de 0 excluye la pena. Son comunes los valores muy pequeños de lambada, como 1e-3 o menores.
- elastic_net_loss = pérdida + (lambda * elastic_net_penalty)
Ahora que estamos familiarizados con la regresión penalizada por la red elástica, veamos un ejemplo trabajado.
Ejemplo de regresión de la red elástica
En esta sección, demostraremos cómo usar el algoritmo de regresión de la Red Elástica.
Primero, introduzcamos un conjunto de datos de regresión estándar. Usaremos el conjunto de datos de la vivienda.
El conjunto de datos de la carcasa es un conjunto de datos estándar de aprendizaje de la máquina que comprende 506 filas de datos con 13 variables numéricas de entrada y una variable numérica de destino.
Utilizando un arnés de pruebas de validación cruzada estratificada 10 veces con tres repeticiones, un modelo ingenuo puede lograr un error medio absoluto (MAE) de alrededor de 6,6. Un modelo de alto rendimiento puede lograr un MAE en este mismo arnés de prueba de alrededor de 1,9. Esto proporciona los límites del rendimiento esperado en este conjunto de datos.
El conjunto de datos implica la predicción del precio de la casa, dados los detalles del suburbio de la casa en la ciudad americana de Boston.
No es necesario descargar el conjunto de datos; lo descargaremos automáticamente como parte de nuestros ejemplos de trabajo.
El siguiente ejemplo descarga y carga el conjunto de datos como un Pandas DataFrame y resume la forma del conjunto de datos y las cinco primeras filas de datos.
# Cargar y resumir el conjunto de datos de la vivienda de pandas importación read_csv de matplotlib importación pyplot # Cargar conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ dataframe = read_csv(url, encabezado=Ninguno) # Resumir la forma imprimir(dataframe.forma) # Resumir las primeras líneas imprimir(dataframe.cabeza()) |
La ejecución del ejemplo confirma las 506 filas de datos y 13 variables de entrada y una única variable objetivo numérica (14 en total).
También podemos ver que todas las variables de entrada son numéricas.
(506, 14) 0 1 2 3 4 5 … 8 9 10 11 12 13 0 0.00632 18.0 2.31 0 0.538 6.575 … 1 296.0 15.3 396.90 4.98 24.0 1 0.02731 0.0 7.07 0 0.469 6.421 … 2 242.0 17.8 396.90 9.14 21.6 2 0.02729 0.0 7.07 0 0.469 7.185 … 2 242.0 17.8 392.83 4.03 34.7 3 0.03237 0.0 2.18 0 0.458 6.998 … 3 222.0 18.7 394.63 2.94 33.4 4 0.06905 0.0 2.18 0 0.458 7.147 … 3 222.0 18.7 396.90 5.33 36.2 [5 rows x 14 columns] |
La biblioteca de aprendizaje de la máquina Python de scikit-learn proporciona una implementación del algoritmo de regresión penalizada de Elastic Net a través de la clase ElasticNet.
Confusamente, el alfa El hiperparámetro se puede establecer a través de la «l1_ratio«El argumento que controla la contribución de las penalizaciones L1 y L2 y la lambda El hiperparámetro se puede establecer a través de la «alfa» argumento que controla la contribución de la suma de ambas penas a la función de pérdida.
Por defecto, se utiliza un saldo igual de 0,5 para «l1_ratio«y una ponderación completa de 1.0 se utiliza para el alfa.
... # Definir el modelo modelo = ElasticNet(alfa=1.0, l1_ratio=0.5) |
Podemos evaluar el modelo de Red Elástica en el conjunto de datos de la vivienda utilizando una validación cruzada repetida 10 veces e informar del error medio absoluto (MAE) en el conjunto de datos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Evaluar un modelo de red elástica en el conjunto de datos de numpy importación significa de numpy importación std de numpy importación absoluto de pandas importación read_csv de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.model_selection importación RepetidoKFold de sklearn.modelo_lineal importación ElasticNet # Cargar el conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ dataframe = read_csv(url, encabezado=Ninguno) datos = dataframe.valores X, y = datos[[:, :–1], datos[[:, –1] # Definir el modelo modelo = ElasticNet(alfa=1.0, l1_ratio=0.5) # Definir el método de evaluación del modelo cv = RepetidoKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Evaluar el modelo resultados = puntaje_valor_cruzado(modelo, X, y, puntuación=‘neg_mean_absolute_error’, cv=cv, n_jobs=–1) # forzar las puntuaciones a ser positivas resultados = absoluto(resultados) imprimir(«Promedio MAE: %.3f (%.3f) % (significa(resultados), std(resultados))) |
La ejecución del ejemplo evalúa el algoritmo de la Red Elástica en el conjunto de datos de la vivienda y reporta el promedio de MAE a través de las tres repeticiones de validación cruzada de 10 veces.
Sus resultados específicos pueden variar dada la naturaleza estocástica del algoritmo de aprendizaje. Considere ejecutar el ejemplo unas cuantas veces.
En este caso, podemos ver que el modelo alcanzó un MAE de alrededor de 3.682.
Podemos decidir usar la Red Elástica como nuestro modelo final y hacer predicciones sobre nuevos datos.
Esto puede lograrse ajustando el modelo a todos los datos disponibles y llamando al predecir() pasando en una nueva fila de datos.
Podemos demostrarlo con un ejemplo completo, que se enumera a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# Hacer una predicción con un modelo de red elástica en el conjunto de datos de pandas importación read_csv de sklearn.modelo_lineal importación ElasticNet # Cargar el conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ dataframe = read_csv(url, encabezado=Ninguno) datos = dataframe.valores X, y = datos[[:, :–1], datos[[:, –1] # Definir el modelo modelo = ElasticNet(alfa=1.0, l1_ratio=0.5) # Modelo de ajuste modelo.encajar(X, y) # Definir nuevos datos fila = [[0.00632,18.00,2.310,0,0.5380,6.5750,65.20,4.0900,1,296.0,15.30,396.90,4.98] # hacer una predicción yhat = modelo.predecir([[fila]) # resumir la predicción imprimir(«Predicho: %.3f % yhat) |
Ejecutando el ejemplo se ajusta al modelo y hace una predicción para las nuevas filas de datos.
A continuación, podemos ver la configuración de los hiperparámetros del modelo.
Sintonización de los hiperparámetros de la red elástica
¿Cómo sabemos que los hiperparámetros por defecto de alfa=1.0 y l1_ratio=0.5 son buenos para nuestro conjunto de datos?
No lo hacemos.
En su lugar, es una buena práctica probar un conjunto de diferentes configuraciones y descubrir qué es lo que mejor funciona.
Un enfoque sería la búsqueda de la cima… l1_ratio valores entre 0 y 1 con una separación de 0,1 o 0,01 y alfa valores de quizás 1e-5 a 100 en una escala log-10 y descubrir qué es lo que mejor funciona para un conjunto de datos.
El siguiente ejemplo lo demuestra utilizando la clase GridSearchCV con una cuadrícula de valores que hemos definido.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# Hiperparámetros de búsqueda de la red elástica de numpy importación arange de pandas importación read_csv de sklearn.model_selection importación GridSearchCV de sklearn.model_selection importación RepetidoKFold de sklearn.modelo_lineal importación ElasticNet # Cargar el conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ dataframe = read_csv(url, encabezado=Ninguno) datos = dataframe.valores X, y = datos[[:, :–1], datos[[:, –1] # Definir el modelo modelo = ElasticNet() # Definir el método de evaluación del modelo cv = RepetidoKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Definir la cuadrícula cuadrícula = dict() cuadrícula[[«alfa] = [[1e–5, 1e–4, 1e–3, 1e–2, 1e–1, 0.0, 1.0, 10.0, 100.0] cuadrícula[[‘l1_ratio’] = arange(0, 1, 0.01) # Definir la búsqueda busca en = GridSearchCV(modelo, cuadrícula, puntuación=‘neg_mean_absolute_error’, cv=cv, n_jobs=–1) # realizar la búsqueda resultados = busca en.encajar(X, y) # Resumir imprimir(MAE: %.3f % resultados.mejor_puntuación_) imprimir(Config: %s’ % resultados.best_params_) |
Al ejecutar el ejemplo se evaluará cada combinación de configuraciones utilizando una validación cruzada repetida.
Podrías ver algunas advertencias que pueden ser ignoradas con seguridad, tales como:
El objetivo no convergió. Tal vez quieras aumentar el número de iteraciones. |
Sus resultados específicos pueden variar dada la naturaleza estocástica del algoritmo de aprendizaje. Intente ejecutar el ejemplo unas cuantas veces.
En este caso, podemos ver que conseguimos resultados ligeramente mejores que los 3.378 contra 3.682 por defecto. Ignore el signo; la biblioteca hace que el MAE sea negativo para fines de optimización.
Podemos ver que el modelo asignó un peso alfa de 0,01 a la penalización y se centra exclusivamente en la penalización L2.
MAE: -3.378 Config: {‘alpha’: 0.01, ‘l1_ratio’: 0.97} |
La biblioteca scikit-learn también proporciona una versión incorporada del algoritmo que encuentra automáticamente buenos hiperparámetros a través de la clase ElasticNetCV.
Para usar esta clase, primero se ajusta al conjunto de datos, y luego se usa para hacer una predicción. Automáticamente encontrará los hiperparámetros apropiados.
Por defecto, el modelo probará 100 valores alfa y usará un ratio por defecto. Podemos especificar nuestras propias listas de valores para probar a través del «l1_ratio«y»alphas«…como hicimos con la búsqueda manual de la cuadrícula.
El siguiente ejemplo lo demuestra.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Usar el algoritmo de red elástica configurado automáticamente de numpy importación arange de pandas importación read_csv de sklearn.modelo_lineal importación ElasticNetCV de sklearn.model_selection importación RepetidoKFold # Cargar el conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv’ dataframe = read_csv(url, encabezado=Ninguno) datos = dataframe.valores X, y = datos[[:, :–1], datos[[:, –1] # Definir el método de evaluación del modelo cv = RepetidoKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Definir el modelo ratios = arange(0, 1, 0.01) alphas = [[1e–5, 1e–4, 1e–3, 1e–2, 1e–1, 0.0, 1.0, 10.0, 100.0] modelo = ElasticNetCV(l1_ratio=ratios, alphas=alphas, cv=cv, n_jobs=–1) # Modelo de ajuste modelo.encajar(X, y) # resumir la configuración elegida imprimir(«alfa: %f % modelo.alfa_) imprimir(«Relación l1: %f % modelo.l1_ratio_) |
Sus resultados específicos pueden variar dada la naturaleza estocástica del algoritmo de aprendizaje. Intente ejecutar el ejemplo unas cuantas veces.
De nuevo, puede que vea algunas advertencias que pueden ser ignoradas con seguridad, como:
El objetivo no convergió. Tal vez quieras aumentar el número de iteraciones. |
En este caso, podemos ver que se eligió un alfa de 0,0, eliminando ambas penalizaciones de la función de pérdida.
Esto es diferente de lo que encontramos a través de nuestra búsqueda manual en la cuadrícula, quizás debido a la forma sistemática en que se buscaron o seleccionaron las configuraciones.
alfa: 0.000000 l1_ratio_: 0.470000 |
Más lecturas
Esta sección proporciona más recursos sobre el tema si desea profundizar en él.
Libros
APIs
Artículos
Resumen
En este tutorial, descubriste cómo desarrollar la regresión regularizada de Elastic Net en Python.
Específicamente, aprendiste:
- La red elástica es una extensión de la regresión lineal que añade penalizaciones de regularización a la función de pérdida durante el entrenamiento.
- Cómo evaluar un modelo de Elastic Net y utilizar un modelo final para hacer predicciones para nuevos datos.
- Cómo configurar el modelo de la Red Elástica para un nuevo conjunto de datos a través de la búsqueda en la red y de forma automática.
¿Tiene alguna pregunta?
Haga sus preguntas en los comentarios de abajo y haré lo posible por responder.