Analizar los resultados de los modelos de algoritmos y su impacto en la predicción de datos puede ser una tarea desafiante, especialmente después de correr múltiples modelos simultáneamente. Sin embargo, los hallazgos obtenidos de tales análisis pueden ser sumamente intrigantes y valiosos. Comprender cómo estos modelos operan y qué revelan sobre los datos iniciales puede proporcionar insights esclarecedores.
¿Qué nos indica la medida de pérdida en los algoritmos de regresión?
Es fundamental recordar que la medida de pérdida en un modelo de regresión refleja el grado de error entre los valores esperados y los valores predichos por el algoritmo. En esencia:
Una menor pérdida sugiere una mayor precisión.
En nuestra aplicación, la regresión Ridge resultó ser superior, lo que nos indica que, para este caso específico, la regularización tipo L2 fue más efectiva.
Sin embargo, es clave subrayar que este resultado no implica que la regresión Ridge sea la mejor opción en todos los escenarios. Cada conjunto de datos es único y puede requerir diferentes técnicas de modelado.
¿Cómo interpretamos los coeficientes de las regresiones?
Los coeficientes resultantes de una regresión nos proporcionan una perspectiva valiosa sobre la relevancia de las variables en el modelo. Observamos que:
Existe un arreglo numérico de coeficientes correspondiente al número de columnas utilizadas.
Cada coeficiente se asocia directamente con una variable específica, permitiéndonos identificar qué tan influyente es en la predicción del modelo.
Por ejemplo, un coeficiente alto en la variable relacionada con el ingreso indica un impacto significativo de dicho factor económico en el índice de felicidad modelado.
¿Qué revelan los coeficientes sobre las variables eliminadas del modelo?
Un aspecto sorprendente fue que la regresión de Lasso excluyó la variable de corrupción por considerarla no determinante para la predicción. Esto nos lleva a plantearnos importantes cuestiones sobre:
Posibles sesgos en nuestros datos.
La necesidad de realizar análisis adicionales para comprender las relaciones entre las variables y sus efectos en el modelo.
Estas observaciones subrayan la importancia del papel de científicos de datos y desarrolladores en la interpretación de estas complejas interacciones.
¿Qué significa que ningún coeficiente se redujera a cero en la regresión Ridge?
En la regresión Ridge, ningún coeficiente fue reducido a cero. Esto contrasta con la regresión de Lasso, que puede minimizar ciertos coeficientes hasta anularlos. En nuestro caso:
Los coeficientes fueron solo disminuidos y no eliminados.
Esto mantiene la influencia de todas las variables, aunque su importancia en el modelo se ajuste según la regularización L2.
Entender los detalles técnicos detrás de los modelos de regresión y sus resultados es crítico para desarrollar un análisis efectivo de los datos. El constante aprendizaje y la exploración en el campo de la ciencia de datos pueden revelar comportamientos y patrones de valor incalculable en nuestras investigaciones. Mantén la curiosidad viva y no dejes de profundizar en tus conocimientos. Nos vemos en la próxima clase para seguir descubriendo y aprendiendo juntos.
Veo un inconveniente con la explicación del resultado. Si miramos el resultado de la perdida para el modelo lineal, aparece en pantalla algo como 9.11362706964361e-08 (el resultado que me arroja cercano al del video) que es igual a 0.00000009113… , es decir, que en realidad el modelo que genera menor perdida es el lineal. Por otro lado al comparar los coeficientes para la variable "corruption" en todos los modelos, se observa que el coeficiente para el modelo lineal es de 0.9996… , osea casi 1!!. Luego esto indicaría que la variable es estadisticamente muy significativa y por tanto el modelo lasso nos estaría llevando hacia un resultado erróneo. Me gustaría escuchar su opinión.
Gracias por tu aporte, yo estoy de acuerdo en que el mejor modelo en realidad es el NO regularizado, el que hemos llamado Lineal (aunque los tres son lineales).
Sobre lo que comentas del valor del coeficiente 'corruption' cercano a 1, y que por eso sea 'estadísticamente muy significativo', no sé si tenga mucho sentido decir eso. En este caso, los coeficientes (llamados aveces valores theta o beta) pueden tomar cualquier valor según los datos y el modelo (en el modelo lineal equivalen al valor de la pendiente). Yy que yo recuerde lo que sí se busca comprobar estadísticamente es que los coeficientes sean distintos de 0 (la hipótesis nula es que sí lo son, y la alternativa es que NO), pero no necesariamente que sean igual a 1, sólo que sean distintos de 0 (el qué tan distintos depende de los datos).
No es una conclusión tan sencilla de sacar con las pocas pruebas que se hicieron (1. por que son muy pocos datos y 2. por que no se modificaron los parámetros en ningún momento, solo fue un ejercicio "ilustrativo" para dar las nociones generales), ya que la importancia de los modelos con regularización se ve en su generalización cuando se tenga una mayor cantidad de datos a evaluar, además si mira las formulas como tal siempre que incluya regularización la comparación con el modelo básico no va a ser igual que buena recuerde que le esta induciendo un "error" de más a la fuerza. Y por último lo que dice el compañero es cierto que el valor sea 1 no tiene nada que ver con que sea "estadísticamente muy significativo" simplemente son la constante de la formula de regresión para saber si son estadisticamente significativo se tiene que realizar una prueba de hipótesis como el menciona y aún así no es una confirmación absoluta es solo un indicativo con la información que se tiene.
Cierto lo que dice joahnR, en realidad el modelo con mejor desempeño es el Lineal, ya que su valor de MSE es muy cercano a 0 (6.182e-08), es decir, la media del cuadrado de las diferencias entre los valores de y reales (y_test) y los valores predichos (y_pred) es muy pequeña, lo cual es muy bueno.
Esto lo podemos visualizar graficando los valores y_test frente a los valores y_pred de cada modelo. O, mejor aún, graficando los valores de los mínimos cuadrados:
Dejo el código:
import seaborn as sns
import matplotlib.pyplotas plt
# Calculamos los mínimos cuadrados
# es decir, el cuadrado de la diferencia entre los valoes
# predichos y los valores reales
y_test_values = y_test.values.ravel()mins_lineal =(y_test_values - y_predict_linear)**2mins_ridge =(y_test_values - y_predict_ridge)**2mins_lasso =(y_test_values - y_predict_lasso)**2# Graficamosobservaciones =range(len(y_test)) # Número de observaciones
# Plot con seaborn
sns.scatterplot(x, ms_lineal, label ='Mod. Lineal (sin reg.)')sns.scatterplot(x, ms_ridge, label ='Mod. con Reg. Ridge')sns.scatterplot(x, ms_lasso, label ='Mod. con Reg. Ridge')plt.xlabel('Observaciones del set de prueba')plt.ylabel('Mínimos cuadrados ('+ r'$(\hat{y} - y)^2$')plt.show()
Como se observa en la gráfica, el modelo lineal tiene valores muy bajos, todos en cero prácticamente, lo que significa que lo predicho por el modelo (y_pred) se ajusta muy bien a los valores observados (los reales; y_test). En cambio, al regularizar con Lasso o Ridge, sí que hay diferencias entre los valores predichos y los observados. Por esto, al promediar todas estas diferencias, que es justo lo que hace el MSE (mean_square_error), el valor es más alto para estos dos modelos.
Yo noté de igual manera el error, pero agradezco que te hayas tomado el. Tiempo de hacerlo aún más explicativo
No funciona tu codigo.
¿Como calculaste el ms_lineal, ms_lineal, ms_lineal y la x?
Se cometió un error gracias a la notación científica, así se observa mejor:
"Los arboles no te dejan ver el bosque". Mucho analisis matematico (que lo hace la libraria por ti), sin entender lo que esta evaluando y sacando conclusiones sin validez.
Eso te hace cometer errores ' no forzados'.
Entiendo que la regresión lineal "básica" no entra en competencia con Lasso y Ridge debido a que la premisa es que este modelo "sobreajusta" por eso solo evaluamos L1 y L2.
Aplicando un poco de lo que se conversó en las clases pasadas. Porque el modelo lineal no es el mejor. Al tener pocos datos como uds han comentado vamos a tener un modelo muy sobre ajustado, lo cual para próximas mediciones no nos da un correcto resultado. Es decir ese modelo tan sobre ajustado solo servirá para ese conjunto de datos, pero al tratar de predecir con otros datos no serviría. Por esa razón comenta el uso de regularización para evitar el sobre ajuste al tener pocos datos
Según puedo observar se utiliza el modelo lineal para comparar el trabajo que hacen los otros dos modelos, con el tema de "penalizar" aquellas variables que estarían aportando menos información.
El modelo lineal no penaliza nada y mantiene los valores de los coeficiente igual durante todo el proceso.
Aprovechamos el ejercicio para comparar lo que hacen Lasso y Ridge, aunque si es innegable que la perdida del modelo lineal, para este caso específico y para los features que escogimos, es la mas pequeña.
¿Cómo puedo determinar el valor de alpha?
¿cómo decido si el valor es muy alto o muy bajo?
Si hay overfitting lo mejor seria aumentar el valor de alpha, de lo contrario si hay underfitting disminuir el valor de alpha.
Yo utilice Kaggle para esta practica, les dejo mi
notebook .
Valores de Pérdida (Pérdida):
Linera_loss:
1.0320887698413223e-07: El valor es extremadamente pequeño, en notación científica (e-07).
Esto indica que el modelo de regresión lineal (sin regularización) se ajusta prácticamente a la perfección a los datos de prueba.
Sin embargo, este valor puede indicar un posible sobreajuste en los datos de entrenamiento.
Lasso_Loss: 0.06832940807010227:
El valor es mayor que el de la regresión lineal. Indica que el modelo Lasso tiene un rendimiento ligeramente inferior al modelo de regresión
lineal en términos de ajuste a los datos de prueba.
Este valor se considera razonable y puede estar generalizando mejor.
Ridge Loss: 0.008008658393959037:
Este valor es más pequeño que el de Lasso.
Indica que el modelo Ridge tiene un rendimiento superior en términos de ajuste a los datos de prueba.
Ridge es capaz de reducir aún más la varianza en comparación con Lasso.
Coeficientes Lasso:
Los coeficientes del modelo Lasso son [1.27832505, 0.94626719, 0.49712179, 0.54420218, 0.0, 0.18702965, 0.89819832].
Esto significa que Lasso ha reducido algunos coeficientes a cero, lo que implica que algunas características no están contribuyendo
significativamente a la predicción.
Las características con coeficientes diferentes de cero son las que Lasso considera más relevantes para la predicción.
Coeficientes Ridge:
Los coeficientes del modelo Ridge son [1.06916508, 0.97360654, 0.86465538, 0.83804516, 0.6480948, 0.74175414, 0.96148902].
Los coeficientes de Ridge son más pequeños en general que los de Lasso.
Ridge busca minimizar la magnitud de los coeficientes, lo que ayuda a reducir la varianza en el modelo.
En resumen, estos resultados indican que Ridge está obteniendo el mejor rendimiento en términos de ajuste a los datos de prueba,
seguido de Lasso y luego el modelo de regresión lineal.
La diferencia de y_test y los algoritmos gráficamente:
Se aprecia claramente que Lasso difiere más.
Gran aporte 📝
Que tal con Scatter plot:
import seaborn as sns
import matplotlib.pyplotas plt
import numpy as np
residuals_l = np.subtract(y_test, y_predict_linear)residuals_r = np.subtract(y_test, y_predict_ridge)residuals_ls = np.subtract(y_test, y_predict_lasso.reshape((-1,1)))plt.scatter(y_predict_linear, residuals_l)plt.scatter(y_predict_ridge, residuals_r)plt.scatter(y_predict_lasso, residuals_ls)plt.axhline(y=0, color='r', linestyle='--') # Agregar la línea en el valor cero
plt.show()
Deberia haber una función para copiar codigo, no creen 🤔!!!
Noté que hay mucha confusión con el error del modelo lineal. Da muy bajo y mucho piensan que se trata de overfitting o errores en los otros modelos, etc. Ninguna de esas es la causa, simplente la variable 'score' es la suma de las variable escogidas, es decir, hay una relación lineal perfecta entre las variables elegidas y la variable objetivo, con lo cual el modelo lineal es el mejor. Si prueban sumar las variables seleccionadas por el profesor, observarán los mismo valores de la variable score:
X = df_happiness[['gdp','family','lifexp','freedom','generosity','corruption','dystopia']]y = df_happiness['score']print(pd.concat([X.sum(axis=1).rename('suma'), y], axis=1))
Linear loss: 9.068971727801338e-08
Linear coef:
[1.00004716 0.99992617 0.99991259 1.0001198 1.00017723 1.000054495 1.00001989]
Espero les sirva mi aporte, y a seguir metiéndole para adelante antes de que nos coman las IAs!
¿Alguno de ustedes obtuvo unos resusltados parecidos a estos? La verdad, me sorprende que obtengamos unos scores casi perfectos.
Si estoy haciendo algo mal escribiendo las siguientes líneas de código, por favor coméntenmelo.
Obtuve esos resultados. La diferencia de nuestros resultados puede que se deba a la semilla utilizada en el SPLIT de los datos.
Aunque en Lasso la diferencia es demasiada puede ser otra la causa.
¿Por qué Lasso en mi modelo quitó casi todos los coeficientes?
Quizá le diste un valor alpha muy elevado
me paso lo mismo , modifique laso con varios valores pero me siguio eliminando features alguna explicacion del por que pasa esto porfavor ?
¿Cómo interpretar los resultados?
Cuando aplica diferentes técnicas de regularización en modelos de aprendizaje automático, es crucial interpretar los resultados para comprender cómo afectan la complejidad del modelo y su capacidad para generalizar a datos nuevos. Aquí hay algunos enfoques avanzados para interpretar los resultados de diferentes regularizaciones:
Análisis de pérdida y métricas de rendimiento(Loss and Performance Metrics Analysis):
Compara la función de pérdida o el error de validación entre diferentes modelos entrenados con diferentes técnicas de regularización.
Observa cómo la regularización afecta la convergencia del modelo durante el entrenamiento y si hay signos de sobreajuste o subajuste.
Evalúa métricas de rendimiento como la precisión, el área bajo la curva ROC (AUC), o cualquier otra métrica relevante para tu problema específico en conjuntos de datos de prueba o validación.
Análisis de coeficientes de variables(Variable Coefficients Analysis):
Examina los coeficientes de las variables para entender cómo la regularización influye en la importancia relativa de cada característica en la predicción.
Con Lasso (L1), observa qué características tienen coeficientes no nulos, ya que Lasso tiende a hacer que algunos coeficientes sean exactamente cero, lo que sugiere una selección de características automática.
Con Ridge (L2), observa cómo la magnitud de los coeficientes se ve afectada por la regularización. Ridge tiende a reducir la magnitud de todos los coeficientes por igual.
Visualización de coeficientes y trayectorias de regularización(Visualization of Coefficients and Regularization Paths):
Grafica los coeficientes de las variables en función del parámetro de regularización (como el inverso de la fuerza de regularización) para ver cómo cambian a medida que ajustas la fuerza de la regularización.
Observa cómo las trayectorias de regularización difieren entre L1 y L2. Con L1, es probable que veas que los coeficientes se vuelven exactamente cero en algún punto, mientras que con L2, los coeficientes disminuyen gradualmente.
Análisis de importancia de características(Feature Importance Analysis):
Utiliza técnicas como la importancia de características basada en árboles (como el método feature_importances_ en Random Forest o Gradient Boosting) para evaluar la importancia relativa de las características en el modelo final.
Validación cruzada y búsqueda de hiperparámetros(Cross-Validation and Hyperparameter Tuning):
Realiza validación cruzada para evaluar el rendimiento de los modelos regularizados en múltiples particiones de datos y asegurarte de que los resultados sean consistentes.
Realiza una búsqueda de hiperparámetros para encontrar el valor óptimo del parámetro de regularización utilizando técnicas como la búsqueda en malla (grid search) o la búsqueda aleatoria (random search).
Al interpretar los resultados de diferentes regularizaciones, es esencial considerar tanto el rendimiento predictivo del modelo como la interpretación de la importancia de las características. Experimenta con diferentes técnicas y ajusta los hiperparámetros para encontrar el equilibrio adecuado entre la capacidad predictiva y la interpretabilidad del modelo.
Aplique Cross Validation para poder ver realmente cual de los 3 era el modelo más estable. Cross Validation lo que hace es hacer n número de samples de todos tus registros y les aplica el modelo que le pases, lo que te devuelve un arreglo con todos las puntuaciones de r2.
from sklearn.model_selectionimport cross_val_score
cv_linear_model =LinearRegression()cv_linear_scores =cross_val_score(cv_linear_model,X, y, cv=5)cv_lasso_model =Lasso(alpha=0.02)cv_lasso_scores =cross_val_score(cv_lasso_model,X, y, cv=5)cv_ridge_model =Ridge(alpha=1)cv_ridge_scores =cross_val_score(cv_ridge_model,X, y, cv=5)print('Linear model: ', cv_linear_scores)print('Lasso model: ', cv_lasso_scores)print('Ridge model: ', cv_ridge_scores)
Linear model:[0.999999520.999997370.999996280.999998310.99999934]Lasso model:[-1.626048410.49859277-0.30365239-0.332273230.37685477]Ridge model:[0.563547660.948469750.860668840.897434810.92261616]
Esto se puede interpretar como que el modelo linear está haciendo overfitting siempre al tener un valor casi 1 en todos los casos. Y en este caso se podría decir que el mejor modelo sería con el ridge ya que es el más estable de los 3 sin caer en el overfitting. Aunque si se va modificando el valor de alpha del modelo lasso puedes llegar a un mejor resultado.
Pero hay otro problema y es que como se mencionó en otro comentario, la variable score es la suma de las demás variables por lo que eso explicaría el porque el overfitting del modelo linear.
ALpha = 0.0010
ta de un mejor score
PAra interpretar los coeficientes comparandolos deberia estandariazar las variables
¡Exacto, Andrea! Has dado en el clavo.
Si intentas comparar coeficientes cuyas variables tienen escalas distintas —por ejemplo, una medida en millones de pesos y otra en una escala de 1 a 10—, el coeficiente más grande no necesariamente indica mayor importancia, sino simplemente que está "ajustando" la unidad de medida.
Al estandarizar, pones a todas las variables a jugar en el mismo terreno (media 0 y desviación estándar 1). Solo así, los coeficientes se vuelven comparables directamente: ahí es cuando realmente puedes decir que una variable tiene más peso que otra en tu modelo.
Sin estandarizar, estás comparando peras con manzanas. ¿Qué crees que pasaría con la penalización de Ridge o Lasso si no estandarizaras antes de entrenar?
Existe un detalle al aplicar los algoritmos de Lasso y Ridge. Ambos necesitan que sus features estén escaladas. Aquí el código completo:
import pandas as pd
import numpy as np
from sklearn.linear_modelimportLinearRegressionfrom sklearn.model_selectionimporttrain_test_splitfrom sklearn.metricsimport mean_squared_error, r2_score
from sklearn.preprocessingimportStandardScalerfrom sklearn.linear_modelimportRidge,Lassoimport statsmodels.apias sm
from scipy import stats
import matplotlib.pyplotas plt
import seaborn as sns
from psa importScif __name__ =="__main__": df=pd.read_csv("./data/felicidad.csv")print(df.head(10))print(df.info())print(df.describe())print(df.isnull().sum())X=df.drop(["score","country","rank","high","low"], axis=1) y=df["score"]print(X.shape)print(y.shape)print(X.head())X_train,X_test, y_train, y_test =train_test_split(X, y, test_size=0.25, random_state=42)# ---MODELO1:LINEAR(NoRequiere escalado) lrg =LinearRegression() lrg.fit(X_train, y_train) y_predict_linear = lrg.predict(X_test) # ---MODELO2:LASSO(Requiere escalado)--- scaler =StandardScaler()X_train_scaled= scaler.fit_transform(X_train)X_test_scaled= scaler.transform(X_test) lasso =Lasso(alpha=0.02) lasso.fit(X_train_scaled, y_train) y_predict_lasso = lasso.predict(X_test_scaled) # Ya sale en la escala del 'score' # ---MODELO3:RIDGE(Requiere escalado)--- ridge =Ridge(alpha=1.0) ridge.fit(X_train_scaled, y_train) # Podemos reutilizar el X_train_scaled de arriba
y_predict_ridge = ridge.predict(X_test_scaled) mse_lrg=mean_squared_error(y_test, y_predict_linear) r2_lrg=r2_score(y_test, y_predict_linear)print("Linear Regression")print("MSE:", mse_lrg)print("R2 Score:", r2_lrg)print("Coeficientes:", lrg.coef_) mse_lasso=mean_squared_error(y_test, y_predict_lasso) r2_lasso=r2_score(y_test, y_predict_lasso)print("\nLasso Regression")print("MSE:", mse_lasso)print("R2 Score:", r2_lasso)print("Coeficientes:", lasso.coef_) mse_ridge=mean_squared_error(y_test, y_predict_ridge) r2_ridge=r2_score(y_test, y_predict_ridge)print("\nRidge Regression")print("MSE:", mse_ridge)print("R2 Score:", r2_ridge)print("Coeficientes:", ridge.coef_) residuos_linear = y_test - y_predict_linear.flatten() residuos_lasso = y_test - y_predict_lasso.flatten() residuos_ridge = y_test - y_predict_ridge.flatten()# 1.CreamosUNASOLA figura de 4 filas y 3columnas(Total12 espacios)fig, axes = plt.subplots(4,3, figsize=(20,22))axes = axes.flatten() # Convertimos la matriz en una lista del 0 al 11fig.suptitle('Diagnóstico Completo: Linear vs Lasso vs Ridge', fontsize=20, y=0.98)# ---FILA1:HOMOCEDASTICIDAD(Índices 0,1,2)---# Linearsns.scatterplot(x=y_predict_linear.flatten(), y=residuos_linear, ax=axes[0])axes[0].axhline(0, color='r', linestyle='--')axes[0].set_title('Homocedasticidad: Linear')# Lassosns.scatterplot(x=y_predict_lasso.flatten(), y=residuos_lasso, ax=axes[1])axes[1].axhline(0, color='r', linestyle='--')axes[1].set_title('Homocedasticidad: Lasso')# Ridgesns.scatterplot(x=y_predict_ridge.flatten(), y=residuos_ridge, ax=axes[2])axes[2].axhline(0, color='r', linestyle='--')axes[2].set_title('Homocedasticidad: Ridge')# ---FILA2:DISTRIBUCIÓNDERESIDUOS(Índices 3,4,5)---sns.histplot(residuos_linear, kde=True, ax=axes[3], color='blue')axes[3].set_title('Distribución Residuos: Linear')sns.histplot(residuos_lasso, kde=True, ax=axes[4], color='green')axes[4].set_title('Distribución Residuos: Lasso')sns.histplot(residuos_ridge, kde=True, ax=axes[5], color='orange')axes[5].set_title('Distribución Residuos: Ridge')# ---FILA3:NORMALIDADQ-QPLOTS(Índices 6,7,8)---stats.probplot(residuos_linear, dist="norm", plot=axes[6])axes[6].set_title('Q-Q Plot: Linear')stats.probplot(residuos_lasso, dist="norm", plot=axes[7])axes[7].set_title('Q-Q Plot: Lasso')stats.probplot(residuos_ridge, dist="norm", plot=axes[8])axes[8].set_title('Q-Q Plot: Ridge')# ---FILA4:REALVSPREDICHO(Índices 9,10,11)---# Linearsns.scatterplot(x=y_test, y=y_predict_linear.flatten(), ax=axes[9])axes[9].plot([y_test.min(), y_test.max()],[y_test.min(), y_test.max()],'r--')axes[9].set_title('Real vs Predicho: Linear')# Lassosns.scatterplot(x=y_test, y=y_predict_lasso.flatten(), ax=axes[10])axes[10].plot([y_test.min(), y_test.max()],[y_test.min(), y_test.max()],'r--')axes[10].set_title('Real vs Predicho: Lasso')# Ridgesns.scatterplot(x=y_test, y=y_predict_ridge.flatten(), ax=axes[11])axes[11].plot([y_test.min(), y_test.max()],[y_test.min(), y_test.max()],'r--')axes[11].set_title('Real vs Predicho: Ridge')# Ajustamos para que nada se encime
plt.tight_layout(rect=[0,0.03,1,0.95])plt.show()
Una salida mas limpia y con la seleccion del mejor modelo: