¿Cómo implementar un regresor robusto frente a datos corruptos?
¡Bienvenido al fascinante mundo del machine learning aplicado! Aquí vamos a adentrarnos en la implementación de un regresor robusto que nos ayudará a lidiar con datos corruptos, una situación común en escenarios del mundo real. Vamos a trabajar con el conjunto de datos CD la felicidad, modificándolo ligeramente para introducir valores atípicos al final de nuestro dataset. Esta táctica nos permitirá comprobar la eficacia y robustez de nuestros modelos al enfrentarse con datos corrompidos.
¿Cómo estructuramos nuestro script y cargamos los datos?
Para empezar, es crucial comprender cómo estructuramos nuestro script y preparamos nuestros datos. Utilizaremos pandas para la manipulación de datos y Sklearn para la implementación del modelo. Aquí te mostramos cómo comenzamos configurando el entorno de trabajo y cargando los datos:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# Cargar los datos del archivo CSVdata = pd.read_csv('./data/felicidad_corrupta.csv')print(data.head())
Este snippet de código nos permite verificar que los datos se han cargado correctamente, mostrando los primeros cinco registros del dataset.
¿Cómo preparamos nuestros datos para modelar?
En esta fase, el objetivo es identificar las características que serán nuestros predictores y nuestra variable objetivo. Aquí descartamos las columnas que no aportan información relevante de predicción, como el nombre del país:
# Eliminamos columnas no relevantesfeatures = data.drop(['país','score'], axis=1)target = data['score']# Dividimos los datos en conjuntos de entrenamiento y pruebaX_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.3, random_state=42)
Es fundamental recordar configurar el random_state para asegurar la replicabilidad de los resultados.
¿Cómo configuramos y evaluamos múltiples modelos eficazmente?
Una parte interesante de este proyecto es cómo configuramos múltiples modelos de manera eficiente utilizando un diccionario en Python. Esto nos permite entrenar y evaluar varios modelos de manera simplificada.
from sklearn.svm import SVR
from sklearn.linear_model import RANSACRegressor, HuberRegressor
# Diccionario de estimadoresestimadores ={'SVR': SVR(gamma='auto', C=1.0, epsilon=0.1),'RANSAC': RANSACRegressor(),'Huber': HuberRegressor(epsilon=1.35)}# Entrenar y evaluar modelosfor nombre, modelo in estimadores.items(): modelo.fit(X_train, y_train) predicciones = modelo.predict(X_test) error = mean_squared_error(y_test, predicciones)print(f'{nombre} error cuadrático medio: {error}')
Este procedimiento no solo ahorra tiempo, sino que también facilita la comparación de resultados para elegir el modelo más adecuado.
¿Qué recomendaciones debemos seguir para mejorar nuestro modelo?
Análisis de datos atípicos: Evaluar el impacto de los outliers en tu dataset. Ajustar los parámetros epsilon del HuberRegressor para manipular cómo se manejan estos valores.
Ajuste de hiperparámetros: Realiza una búsqueda de hiperparámetros para el modelo SVR y otros modelos susceptibles a configuraciones específicas para optimizar su rendimiento.
Validación cruzada: Implementa técnicas de validación cruzada para asegurar que tu modelo tiene un rendimiento consistente a través de diferentes particiones del dataset.
Este enfoque ofrece una metodología práctica y efectiva para manejar datos corruptos y asegurar que nuestros modelos sean robustos y confiables. ¡Sigue explorando y aprendiendo para afinar tus habilidades en el machine learning!
Mediante el parámetro C, podemos controlar la penalización por error en la clasificación. Si C tiene valores amplios entonces, se penaliza de forma más estricta los errores, mientras que si escogemos un C pequeño seremos menos estrictos con los errores.
En otras palabras, si C es pequeño aumenta el sesgo y disminuye la varianza del modelo.
Hola @jfpuentes, me podrias explicar mas esto ? principalmente porque disminuye la varianza
Gracias
Creo que otra columna que debemos eliminar debería ser el RANK porque va a darle mucho peso a esa variable ya que es un orden numérico, no un valor o dato registrado.
No sé si me hice entender
Totalmente de acuerdo William, en clases pasadas no se tomo en cuenta, ahora no sé por qué el profe olvidó quitarla.
Es verdad, y más que RANK, va muy relacionado con Score
me esta gustando el curso :), veamos que mas sigue
Sí, esta muy interensante.
Para importar varios paquetes del mismo modulo no son necesarios los paréntesis, se puede importar como:
from sklearn.linear_modelimportRANSACRegressor,HuberRegressor
queda más limpio así, gracias
El paréntesis es para cuando se hace en varias lineas
Otros ejemplos
Complemento tu gráfico con uno donde se compara las regresiones Lasso y Ridge con respecto al HuberRegressor.
Aquí defino el umbral que considera el estimador Huber para aplicar Regresión Simple si el residuo o error está dentro del umbral, caso contrario aplica regresión huber.
En mi opinión también deberíamos quitar el Rank de el modelo predictivo ya que en la realidad es poco probable que contemos con ese dato si es que queremos predecir el score de felicidad de un país y es redundante, el score dará como resultado el rank pero comparado con otros países, no debería ser parte del modelo.
19. Preparación de datos para la regresión robusta
import pandas as pd
from sklearn.linear_model import( RANSACRegressor, HuberRegressor,)from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
if __name__ =='__main__':# Load the dataset df = pd.read_csv('./data/felicidad_corrupt.csv')print(df.head())# Split the dataset into features (X) and target (y) X = df.drop(['country','score'], axis=1) y = df[['score']]# Split the dataset into training and testing sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# Define the regression models to use estimators ={'SVR': SVR(gamma='auto', C=1.0, epsilon=0.1),'RANSAC': RANSACRegressor(),'HUBER': HuberRegressor(epsilon=1.35)}
Una consulta para trabajar de manera profesional con Machine Learning, ¿Cuáles serían todas las pruebas para evaluar el modelo para saber si es eficiente y robusto? Es que para algunos algoritmos se emplean unas pruebas y para otros otras pruebas, pero no estoy seguro si existe unas evaluaciones del modelo que arroje resultados precisos o que sean los más comunes para tenerlos presente
aun soy estudiante pero según lo que e visto depende de la variable que intentamos predecir, por ejemplo si es categorica o numerica, y del estimador ya que por ejemplo puedes usar R(correlacion) para medir como un modelo esta funcionando pero para comparar su funcionamiento debes usar R2 or MSE
dataset.head() de forma predeterminada nos muestra las 5 primeras filas, por ende, no es necesario ponerle el 5.
Depende el entorno en donde lo estés programando
“Explicito es mejor que implícito”
Sobre todo cuando se está enseñando.
Creo que si debimos quitar la columna rank O_0
Así es; Rank, Low y High también.
Importamos las bibliotecas
import pandas as pd
from sklearn.linear_model import (
RANSACRegressor, HuberRegressor
)
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
if name == "main":
# Importamos el dataset
dataset = pd.read_csv('./data/felicidad_corrupt.csv')
# Mostramos el reporte estadistico
print(dataset.describe())
X = dataset.drop(['country', 'score'], axis=1)
y = dataset[['score']]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
La preparación de datos es una parte crucial en el proceso de regresión robusta, al igual que en cualquier otro tipo de análisis estadístico o de machine learning
eL CÓDIGO PARA EL QUE LO NECESITE
import pandas as pd
from sklearn.linear_modelimportRANSACRegressor,HuberRegressorfrom sklearn.svmimportSVRfrom sklearn.model_selectionimporttrain_test_splitfrom sklearn.metricsimport mean_squared_error
if __name__ =="__main__": # Cargamos los datos del dataframe de pandas
dt_heart = pd.read_csv('./datos/whr2017.csv', sep=';')print(dt_heart.head(10))X= dt_heart.drop(["country","score"],axis=1)Y= dt_heart["score"]X_train,X_test, y_train, y_test =train_test_split(X,Y, test_size=0.3, random_state=42)estimadores ={'SVR':SVR(gamma='auto',c=1.0,epsilo=0.1),'RANSAC':RANSACRegressor(),'Huber':HuberRegressor(epsilon=1.35)}
Aquí hablan al respecto. Entiendo que son modelos que hacen parte de Sklearn.
En pocas palabras, son los modelos que estamos implementando.
En mas palabras( las de Google): En estadística, un estimador es un estadístico usado para estimar un parámetro desconocido de la población. en nuestro caso es lo mismo ya que todos los modelos que venimos usando son modelos estadísticos.
Excelente tema. El manejo de datos atípicos (outliers) es crucial tanto en Regresión Lineal como en Máquinas de Vectores de Soporte para Regresión (SVR). A continuación te explico cómo cada una de estas técnicas enfrenta los outliers y qué estrategias puedes usar en la práctica.
🧮 Regresión Lineal y Outliers
📉 Problema:
La Regresión Lineal Ordinaria (OLS) minimiza el error cuadrático medio:
Outliers tengan un gran impacto, ya que los errores se elevan al cuadrado.
El modelo se ajuste tratando de compensar esos puntos extremos, deteriorando el rendimiento general.
✅ Soluciones:
Transformación de variables (log, raíz cuadrada).
Regresión robusta:
HuberRegressor (penaliza suavemente los errores grandes).
RANSACRegressor (ignora los outliers).
🤖 Soporte Vectorial para Regresión (SVR) y Outliers
🧠 ¿Qué es SVR?
Es una extensión de las Máquinas de Vectores de Soporte (SVM) aplicada a regresión. La idea es encontrar una función plana que esté dentro de un margen de tolerancia ε respecto a las verdaderas etiquetas yiy_i.