La regresión lineal es una técnica fundamental en estadística y aprendizaje automático que modela la relación entre variables. En pocas palabras, nos permite predecir un resultado a partir de uno o varios factores que lo influyen. Se aplica ampliamente en la valoración inmobiliaria, la previsión de ventas, la evaluación de riesgos y muchos otros ámbitos.
En este tutorial, exploraremos la regresión lineal en scikit-learn: cómo funciona, por qué es útil y cómo implementarla con esta biblioteca. Al final, serás capaz de crear y evaluar un modelo de regresión lineal para realizar predicciones basadas en datos.
Diagrama de dispersión del precio de la vivienda frente al número de habitaciones
Regresión lineal y aprendizaje automático
Más allá de su utilidad inmediata para estimar precios de vivienda, la regresión lineal desempeña un papel importante en el aprendizaje automático.
Pese a su sencillez, la regresión lineal sigue siendo una herramienta imprescindible por su eficiencia, interpretabilidad y versatilidad.
Regresión lineal y la biblioteca scikit-learn
La biblioteca scikit-learn facilita enormemente implementar regresión lineal. Tiene muchas ventajas.
Interfaz coherente: el código para distintos algoritmos de ML es muy similar.
Código sencillo: las matemáticas y detalles complejos quedan abstraídos. Por ejemplo, para ajustar un modelo basta con model.fit(X_train, y_train).
Acceso sencillo a los coeficientes del modelo.
Incluye métricas integradas para evaluar el rendimiento.
Permite integrar fácilmente la regresión lineal (o cualquier otro algoritmo) con pasos de preprocesado, como escalado y selección de características, mediante Pipeline.
Si eres nuevo en scikit-learn, puedes echar un vistazo a nuestro curso Machine Learning with scikit-learn para una introducción práctica a esta biblioteca de Python.
Entender la regresión lineal
Como hemos visto, en la regresión lineal simple los datos se modelan con una "línea de mejor ajuste". La fórmula de esa línea es:
donde m es la pendiente y b la intersección con el eje.
La "regresión lineal múltiple" generaliza el caso de un predictor a varios (número de habitaciones, cercanía al mar, renta mediana del barrio). La fórmula se generaliza a:
donde cada xi es una variable independiente y el correspondiente bi su coeficiente. En tres dimensiones, la línea se convierte en un plano. En dimensiones superiores, en un "hiperplano".
¿Cómo interpretamos los coeficientes y la intersección? La intersección es el valor previsto de y cuando todas las variables independientes valen 0; dicho de otro modo, el valor base de la variable dependiente sin contribución de los predictores. Cada coeficiente bi representa el cambio en y ante un cambio de una unidad en xi, manteniendo constantes el resto de variables.
Preparar el entorno
Instalar scikit-learn es sencillo. Usa el comando pip install scikit-learn. Si quieres instalar una versión concreta, por ejemplo la 1.2.2, añade la versión: pip install scikit-learn==1.2.2. Si usas Anaconda, scikit-learn debería venir instalado. Si por algún motivo necesitas instalarlo con Anaconda, utiliza conda install scikit-learn.
Hay varias bibliotecas necesarias o recomendadas al usar scikit-learn. La biblioteca numpy es necesaria para almacenar características y etiquetas. Se recomienda pandas para cargar, preprocesar y explorar conjuntos de datos.
Si usas scikit-learn, lo más probable es que ya utilices pandas para la preparación de datos. Para graficar resultados, seguramente uses matplotlib o seaborn o ambos. Cualquiera de estas bibliotecas puede instalarse con pip, como en el ejemplo anterior. Incluso puedes instalar varias a la vez con un único comando:
Antes de cargar el conjunto de datos, importemos a los sospechosos habituales.
# Import libraries.import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as snsCon la tecnología de
Cargar el conjunto de datos
Usemos el conocido conjunto de datos de viviendas de California.
# Read in California housing dataset.from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()Con la tecnología de
Preparar los datos
Dividamos los datos en entrenamiento y prueba. Importamos el método train_test_split() de sklearn.model_selection, lo invocamos indicando el porcentaje para test y un random_state. Además, usaremos regresión lineal simple con la característica correspondiente al número medio de habitaciones.
# Import train_test_split.from sklearn.model_selection import train_test_split
# Create features X and target y.
X = pd.DataFrame(housing.data, columns=housing.feature_names)[["AveRooms"]]
y = housing.target # Median house value in $100,000s# Split the dataset into training (80%) and testing (20%) sets.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)Con la tecnología de
Ahora que hemos dividido en entrenamiento y prueba, vamos a estandarizar las características. Así nos aseguramos de que todas las variables estén en la misma escala, lo que puede mejorar el rendimiento y la estabilidad numérica del modelo.
# Import StandardScaler.from sklearn.preprocessing import StandardScaler
# Instantiate StandardScaler.
scaler = StandardScaler()# Fit and transform training data.
X_train_scaled = scaler.fit_transform(X_train)# Also transform test data.
X_test_scaled = scaler.transform(X_test)Con la tecnología de
En este código, StandardScaler es una herramienta de preprocesado que elimina la media y escala las características a varianza unitaria. Esto evita que ciertas variables dominen el modelo por diferencias de escala.
El escalador se ajusta sobre los datos de entrenamiento con fit_transform(). Los datos de prueba se transforman por separado con transform() para usar los mismos factores de escalado y evitar fuga de información.
Entrenar el modelo de regresión lineal
Para crear un modelo de regresión lineal, importa LinearRegression() de sklearn.linear_model. Instáncialo y asígnalo a una variable.
# Import LinearRegression.from sklearn.linear_model import LinearRegression
# Instantiate linear regression model.
model = LinearRegression()Con la tecnología de
Ajustar el modelo con los datos de entrenamiento es directo.
# Fit the model to the training data.
model.fit(X_train_scaled, y_train)Con la tecnología de
Hacer predicciones
Con el modelo entrenado, hacemos predicciones sobre el conjunto de prueba.
# Make predictions on the testing data.
y_pred = model.predict(X_test_scaled)Con la tecnología de
Evaluar el rendimiento del modelo
Una vez realizadas las predicciones sobre el conjunto de prueba, necesitamos saber qué tal se ajustan a la realidad. Hay varias métricas para evaluar un algoritmo de regresión. Algunas de las más comunes son el coeficiente de determinación (R2), el error cuadrático medio (MSE) y la raíz del error cuadrático medio (RMSE).
El coeficiente de determinación, R2, mide cuánto explica el modelo la variabilidad de la variable objetivo. Es decir, cuantifica qué parte de la variabilidad del objetivo explican los predictores: la bondad de ajuste.
Para entenderlo mejor, veamos la fórmula:
donde yactual son los valores reales de la variable objetivo, ypredicted los valores predichos por el modelo, y ȳ la media de los valores reales. La fórmula nos indica cuánta varianza del objetivo explica el modelo. El denominador representa la varianza total y el numerador la varianza no explicada tras aplicar la regresión. El cociente es, por tanto, el porcentaje de varianza explicada por el modelo.
¿Cómo interpretamos R2?
R2 = 1: el modelo explica perfectamente toda la varianza.
R2 = 0: el modelo no explica nada; predecir la media sería igual de bueno.
R2 < 0: peor que usar la media; indica mal ajuste.
Aspectos clave a tener en cuenta.
Un R2 más alto no siempre es mejor. Puede indicar sobreajuste, especialmente con modelos complejos.
Añadir más variables puede inflar artificialmente R2, así que un valor mayor no implica necesariamente mejor modelo.
En regresión múltiple, usa R2 ajustado, que tiene en cuenta el número de predictores y evita mejoras engañosas por variables innecesarias.
Evaluar el rendimiento con el coeficiente de determinación es muy sencillo con scikit-learn.
# Import metrics.from sklearn.metrics import mean_squared_error, r2_score
# Calculate and print R^2 score.
r2 = r2_score(y_test, y_pred)print(f"R-squared: {r2:.4f}")Con la tecnología de
Otras métricas muy usadas son el error cuadrático medio (MSE) y su raíz (RMSE). Miden cuánto se desvían las predicciones de los valores reales.
El MSE calcula la diferencia cuadrática media entre valores reales y predichos:
para un total de n observaciones. Como los errores se elevan al cuadrado antes de promediar, los errores grandes se penalizan más que los pequeños; por ello el MSE es sensible a valores atípicos. Un MSE más bajo indica mejor ajuste.
Para abordar esto, se usa el RMSE, que no es más que la raíz cuadrada del MSE. Al estar en las mismas unidades que la variable objetivo, es más interpretable como desviación media de las predicciones.
Calcular MSE y RMSE también es muy sencillo con scikit-learn.
# Calculate and print MSE.
mse = mean_squared_error(y_test, y_pred)print(f"Mean squared error: {mse:.4f}")# Calculate and print RMSE.
rmse = mse **0.5print(f"Root mean squared error: {rmse:.4f}")Con la tecnología de
Trabajar con regresión lineal múltiple en scikit-learn
Volvamos a ejecutar el modelo usando todas las características disponibles, no solo el número medio de habitaciones. ¿Esperas mejores o peores resultados?
# Uses all features.import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# Load data set.
housing = fetch_california_housing()# Split into X, y.
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = housing.target # Median house value in $100,000s
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# Scale the data.
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# Create model and fit it to the training data.
model = LinearRegression()
model.fit(X_train_scaled, y_train)# Make predictions.
y_pred = model.predict(X_test_scaled)# Calculate and print errors.
r2 = r2_score(y_test, y_pred)print(f"R-squared: {r2:.4f}")
mse = mean_squared_error(y_test, y_pred)print(f"Mean squared error: {mse:.4f}")
rmse = mse **0.5print(f"Root mean squared error: {rmse:.4f}")Con la tecnología de
R-squared:0.5758
Mean squared error:0.5559
Root mean squared error:0.7456Con la tecnología de
Vemos que los resultados son bastante mejores que usando una sola característica. Ahora bien, ¿necesitamos todas? ¿Hay unas más relevantes que otras? Elegir las características más relevantes del conjunto de datos se conoce como selección de características.
La selección de características es importante por varias razones.
Reduce el sobreajuste. Menos variables implica menos complejidad y menor riesgo de sobreajuste.
Mejora la precisión. Al eliminar variables irrelevantes o redundantes, el modelo se centra en patrones útiles.
Aumenta la interpretabilidad. Facilita entender el modelo al resaltar los factores más importantes.
Acelera el entrenamiento. Menos variables reducen el tiempo de cómputo y el uso de memoria.
Cuando varias características están muy correlacionadas, son redundantes: aportan básicamente la misma información. A esto se le llama multicolinealidad. Aunque no siempre perjudica la precisión predictiva, complica la selección e interpretación, especialmente en modelos lineales.
El factor de inflación de la varianza (VIF) es una métrica para detectar multicolinealidad entre predictores. Para cada predictor, el VIF se calcula como:
donde Ri2 es el R2 obtenido al ajustar el predictor Xi frente al resto de predictores del modelo. Un VIF alto indica que el predictor está muy correlacionado con otras variables.
VIF = 1: sin multicolinealidad (escenario ideal).
VIF < 5: multicolinealidad baja o moderada (generalmente aceptable).
VIF > 5: multicolinealidad alta (valora eliminar o combinar variables correlacionadas).
# Import libraries.import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from statsmodels.stats.outliers_influence import variance_inflation_factor
# Load the dataset.
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)# Compute the correlation matrix.
corr_matrix = X.corr()# Identify pairs of features with high collinearity (correlation > 0.8 or < -0.8).
high_corr_features =[(col1, col2, corr_matrix.loc[col1, col2])for col1 in corr_matrix.columns
for col2 in corr_matrix.columns
if col1 != col2 andabs(corr_matrix.loc[col1, col2])>0.8]# Convert to a DataFrame for better visualization.
collinearity_df = pd.DataFrame(high_corr_features, columns=["Feature 1","Feature 2","Correlation"])print("\nHighly Correlated Features:\n", collinearity_df)# Compute Variance Inflation Factor (VIF) for each feature.
vif_data = pd.DataFrame()
vif_data["Feature"]= X.columns
vif_data["VIF"]=[variance_inflation_factor(X.values, i)for i inrange(X.shape[1])]# Print VIF values.print("\nVariance Inflation Factor (VIF) for each feature:\n", vif_data)Con la tecnología de
Highly Correlated Features:
Feature 1 Feature 2 Correlation
0 AveRooms AveBedrms 0.8476211 AveBedrms AveRooms 0.8476212 Latitude Longitude -0.9246643 Longitude Latitude -0.924664
Variance Inflation Factor (VIF)for each feature:
Feature VIF
0 MedInc 11.5111401 HouseAge 7.1959172 AveRooms 45.9936013 AveBedrms 43.5903144 Population 2.9357455 AveOccup 1.0952436 Latitude 559.8740717 Longitude 633.711654Con la tecnología de
Eliminemos AveBedrms del modelo.
# Import libraries.import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# Load California housing dataset.
housing = fetch_california_housing()# Create DataFrame and remove "AveBedrms" feature.
X = pd.DataFrame(housing.data, columns=housing.feature_names).drop(columns=["AveBedrms"])
y = housing.target # Median house value in $100,000s# Split data into training and testing sets.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# Scale the data (Standardization).
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# Create a linear regression model and train it.
model = LinearRegression()
model.fit(X_train_scaled, y_train)# Make predictions on the test set.
y_pred = model.predict(X_test_scaled)# Calculate performance metrics.
r2 = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)# Print evaluation metricsprint(f"R-squared: {r2:.4f}")print(f"Mean squared error: {mse:.4f}")print(f"Root mean squared error: {rmse:.4f}")Con la tecnología de
R-squared:0.5823
Mean squared error:0.5473
Root mean squared error:0.7398Con la tecnología de
Los resultados mejoran (ligeramente).
Extraer información del modelo
Construir un modelo de regresión es solo el primer paso; entender sus salidas es igual de importante. Analizando los coeficientes del modelo podemos ver qué características tienen más impacto en las predicciones.
Entender los coeficientes de la regresión
Una vez entrenado un modelo de regresión lineal, puedes acceder a los coeficientes con model.coef_. La intersección se obtiene con model.intercept_.
Una vez entrenado con LinearRegression(), los coeficientes se consultan con model.coef_ y la intersección con model.intercept_.
print("Intercept:", model.intercept_)
coeff_df = pd.DataFrame({"Feature": X.columns,"Coefficient": model.coef_})print("\nFeature Coefficients:\n", coeff_df)Con la tecnología de
Intercept:2.0719469373788777
Feature Coefficients:
Feature Coefficient
0 MedInc 0.7257471 HouseAge 0.1215192 Latitude -0.9431053 Longitude -0.900735Con la tecnología de
Resumir los resultados del modelo
Como Scikit-Learn no ofrece un método summary() como Statsmodels, podemos extraer y visualizar manualmente la importancia de cada característica usando los coeficientes. Las variables con coeficientes absolutos mayores tienen más impacto en el objetivo. Considera el siguiente código.
# Sort dataframe by coefficients.
coef_df_sorted = coef_df.sort_values(by="Coefficient", ascending=False)# Create plot.
plt.figure(figsize=(8,6))
plt.barh(coef_df["Feature"], coef_df_sorted["Coefficient"], color="blue")
plt.xlabel("Coefficient Value")
plt.ylabel("Feature")
plt.title("Feature Importance (Linear Regression Coefficients)")
plt.show()Con la tecnología de
Gráfico de importancia de características según los coeficientes
Ahora, visualicemos los residuos y el ajuste de la regresión.
# Compute residuals.
residuals = y_test - y_pred
# Create plots.
plt.figure(figsize=(12,5))# Plot 1: Residuals Distribution.
plt.subplot(1,2,1)
sns.histplot(residuals, bins=30, kde=True, color="blue")
plt.axvline(x=0, color='red', linestyle='--')
plt.title("Residuals Distribution")
plt.xlabel("Residuals (y_actual - y_predicted)")
plt.ylabel("Frequency")# Plot 2: Regression Fit (Actual vs Predicted).
plt.subplot(1,2,2)
sns.scatterplot(x=y_test, y=y_pred, alpha=0.5)
plt.plot([min(y_test),max(y_test)],[min(y_test),max(y_test)], color='red', linestyle='--')# Perfect fit line
plt.title("Regression Fit: Actual vs Predicted")
plt.xlabel("Actual Prices (in $100,000s)")
plt.ylabel("Predicted Prices (in $100,000s)")# Show plots.
plt.tight_layout()
plt.show()Con la tecnología de
Gráficas para visualizar residuos y ajuste de la regresión
La distribución de residuos (gráfico izquierdo) debería estar centrada en cero, lo que indica errores distribuidos aleatoriamente. Si los residuos siguen una distribución normal, el ajuste es bueno; si hay asimetrías o tendencias, podría haber errores sistemáticos. El gráfico de ajuste (derecha) compara valores reales y predichos; la línea roja discontinua representa el ajuste perfecto. Si los puntos siguen de cerca la línea, las predicciones son precisas; si aparece un patrón (p. ej., una curva), quizá la relación no sea realmente lineal.
Estas visualizaciones ayudan a diagnosticar sobreajuste o infraajuste, revelan patrones en los residuos que sugieren relaciones omitidas y ofrecen una evaluación clara de la eficacia del modelo.
Aplicaciones en el mundo real
La regresión lineal se usa ampliamente en distintos sectores para predecir y tomar decisiones. En inmobiliaria, estima precios de vivienda en función de factores como tamaño y ubicación.
Ventas y marketing la emplean para prever demanda y optimizar presupuestos; en salud se aplica a evaluar riesgos de enfermedad. En finanzas ayuda a predecir precios de acciones y a la calificación crediticia; en manufactura, a control de calidad y predicción de fallos.
Cuándo usar regresión lineal
Las características y la variable objetivo mantienen una relación lineal.
La interpretabilidad y la sencillez pesan más que el modelado complejo.
Los datos requieren poco ingenierizado de variables.
Cuándo no usar regresión lineal
La relación entre el objetivo y las características es compleja y no lineal.
La regresión lineal sigue siendo una de las técnicas más básicas y a la vez más utilizadas en machine learning y modelado estadístico. Pese a su sencillez, es una herramienta potente para entender relaciones entre variables y realizar predicciones en multitud de casos de uso.
Qué debes recordar de este tutorial:
Aplicaciones versátiles. La regresión lineal aporta información valiosa en múltiples sectores y tipos de problemas.
Interpretable. A diferencia de los modelos caja negra, ofrece interpretaciones claras basadas en coeficientes, fáciles de explicar.
Selección de características. Elegir bien las variables y abordar la multicolinealidad ayuda a que los modelos sean precisos, estables y fiables.
Si quieres seguir aprendiendo sobre interpolación de cadenas en Python, consulta los recursos de DataCamp.
Preguntas frecuentes sobre regresión lineal en sklearn
¿Qué es la regresión lineal y cómo funciona?⌄
La regresión lineal es un método estadístico para modelar la relación entre una variable objetivo y uno o más predictores. Encuentra la línea que mejor se ajusta minimizando la diferencia entre valores reales y predichos mediante el método de mínimos cuadrados.
¿Cuáles son los supuestos de la regresión lineal?⌄
La regresión lineal se apoya en estos supuestos:
Linealidad: la relación entre predictores y objetivo es lineal.
Independencia: las observaciones son independientes entre sí.
Homoscedasticidad: la varianza de los residuos es constante en todos los valores.
Normalidad de los residuos: los residuos deberían seguir una distribución normal.
Sin multicolinealidad: las variables independientes no deberían estar altamente correlacionadas.
¿Por qué debería escalar las características antes de ajustar un modelo de regresión lineal?⌄
El escalado de características garantiza que todas aporten por igual al modelo. Como la regresión lineal es sensible a la magnitud, escalar evita que variables con valores grandes dominen sobre otras más pequeñas. Usa StandardScaler() para estandarizar.
¿Qué es la multicolinealidad y cómo puedo detectarla?⌄
La multicolinealidad aparece cuando dos o más variables independientes están muy correlacionadas, haciendo poco fiables las interpretaciones de los coeficientes. Puede detectarse con el factor de inflación de la varianza (VIF).
¿Cómo evalúo un modelo de regresión lineal?⌄
Las métricas clave incluyen:
R² (coeficiente de determinación) → mide cuánto explica el modelo la varianza de la variable objetivo.
MSE (error cuadrático medio) → mide el error cuadrático medio entre valores reales y predichos.
RMSE (raíz del error cuadrático medio) → versión más interpretable del MSE.
Mark Pedigo, PhD, es un distinguido científico de datos con experiencia en ciencia de datos sanitarios, programación y educación. Doctor en Matemáticas, Licenciado en Informática y Certificado Profesional en Inteligencia Artificial, Mark combina los conocimientos técnicos con la resolución práctica de problemas. Su carrera incluye funciones en la detección del fraude, la predicción de la mortalidad infantil y la previsión financiera, junto con contribuciones al software de estimación de costes de la NASA. Como educador, ha impartido clases en DataCamp y en la Universidad Washington de San Luis, y ha sido mentor de programadores noveles. En su tiempo libre, Mark disfruta de la naturaleza de Minnesota con su esposa Mandy y su perro Harley, y toca el piano de jazz.
Aprende la ciencia de datos en Python, desde la manipulación de datos hasta el machine learning. ¡Este programa te proporciona las habilidades necesarias para triunfar como científico de datos!
La regresión lineal es una técnica fundamental en estadística y aprendizaje automático que modela la relación entre variables. En pocas palabras, nos permite predecir un resultado a partir de uno o varios factores que lo influyen. Se aplica ampliamente en la valoración inmobiliaria, la previsión de ventas, la evaluación de riesgos y muchos otros ámbitos.
En este tutorial, exploraremos la regresión lineal en scikit-learn: cómo funciona, por qué es útil y cómo implementarla con esta biblioteca. Al final, serás capaz de crear y evaluar un modelo de regresión lineal para realizar predicciones basadas en datos.
Diagrama de dispersión del precio de la vivienda frente al número de habitaciones
Regresión lineal y aprendizaje automático
Más allá de su utilidad inmediata para estimar precios de vivienda, la regresión lineal desempeña un papel importante en el aprendizaje automático.
Pese a su sencillez, la regresión lineal sigue siendo una herramienta imprescindible por su eficiencia, interpretabilidad y versatilidad.
Regresión lineal y la biblioteca scikit-learn
La biblioteca scikit-learn facilita enormemente implementar regresión lineal. Tiene muchas ventajas.
model.fit(X_train, y_train).Si eres nuevo en scikit-learn, puedes echar un vistazo a nuestro curso Machine Learning with scikit-learn para una introducción práctica a esta biblioteca de Python.
Entender la regresión lineal
Como hemos visto, en la regresión lineal simple los datos se modelan con una "línea de mejor ajuste". La fórmula de esa línea es:
donde m es la pendiente y b la intersección con el eje.
La "regresión lineal múltiple" generaliza el caso de un predictor a varios (número de habitaciones, cercanía al mar, renta mediana del barrio). La fórmula se generaliza a:
donde cada xi es una variable independiente y el correspondiente bi su coeficiente. En tres dimensiones, la línea se convierte en un plano. En dimensiones superiores, en un "hiperplano".
¿Cómo interpretamos los coeficientes y la intersección? La intersección es el valor previsto de y cuando todas las variables independientes valen 0; dicho de otro modo, el valor base de la variable dependiente sin contribución de los predictores. Cada coeficiente bi representa el cambio en y ante un cambio de una unidad en xi, manteniendo constantes el resto de variables.
Preparar el entorno
Instalar scikit-learn es sencillo. Usa el comando
pip install scikit-learn. Si quieres instalar una versión concreta, por ejemplo la 1.2.2, añade la versión:pip install scikit-learn==1.2.2.Si usas Anaconda, scikit-learn debería venir instalado. Si por algún motivo necesitas instalarlo con Anaconda, utilizaconda install scikit-learn.Hay varias bibliotecas necesarias o recomendadas al usar scikit-learn. La biblioteca
numpyes necesaria para almacenar características y etiquetas. Se recomiendapandaspara cargar, preprocesar y explorar conjuntos de datos.Si usas scikit-learn, lo más probable es que ya utilices pandas para la preparación de datos. Para graficar resultados, seguramente uses
matplotliboseaborno ambos. Cualquiera de estas bibliotecas puede instalarse con pip, como en el ejemplo anterior. Incluso puedes instalar varias a la vez con un único comando:pip install scikit-learn numpy pandas matplotlib seaborn.Implementar regresión lineal en sklearn
Antes de cargar el conjunto de datos, importemos a los sospechosos habituales.
Cargar el conjunto de datos
Usemos el conocido conjunto de datos de viviendas de California.
Preparar los datos
Dividamos los datos en entrenamiento y prueba. Importamos el método
train_test_split()desklearn.model_selection, lo invocamos indicando el porcentaje para test y unrandom_state. Además, usaremos regresión lineal simple con la característica correspondiente al número medio de habitaciones.Ahora que hemos dividido en entrenamiento y prueba, vamos a estandarizar las características. Así nos aseguramos de que todas las variables estén en la misma escala, lo que puede mejorar el rendimiento y la estabilidad numérica del modelo.
En este código,
StandardScaleres una herramienta de preprocesado que elimina la media y escala las características a varianza unitaria. Esto evita que ciertas variables dominen el modelo por diferencias de escala.El escalador se ajusta sobre los datos de entrenamiento con
fit_transform(). Los datos de prueba se transforman por separado contransform()para usar los mismos factores de escalado y evitar fuga de información.Entrenar el modelo de regresión lineal
Para crear un modelo de regresión lineal, importa
LinearRegression()desklearn.linear_model. Instáncialo y asígnalo a una variable.Ajustar el modelo con los datos de entrenamiento es directo.
Hacer predicciones
Con el modelo entrenado, hacemos predicciones sobre el conjunto de prueba.
Evaluar el rendimiento del modelo
Una vez realizadas las predicciones sobre el conjunto de prueba, necesitamos saber qué tal se ajustan a la realidad. Hay varias métricas para evaluar un algoritmo de regresión. Algunas de las más comunes son el coeficiente de determinación (R2), el error cuadrático medio (MSE) y la raíz del error cuadrático medio (RMSE).
El coeficiente de determinación, R2, mide cuánto explica el modelo la variabilidad de la variable objetivo. Es decir, cuantifica qué parte de la variabilidad del objetivo explican los predictores: la bondad de ajuste.
Para entenderlo mejor, veamos la fórmula:
donde yactual son los valores reales de la variable objetivo, ypredicted los valores predichos por el modelo, y ȳ la media de los valores reales. La fórmula nos indica cuánta varianza del objetivo explica el modelo. El denominador representa la varianza total y el numerador la varianza no explicada tras aplicar la regresión. El cociente es, por tanto, el porcentaje de varianza explicada por el modelo.
¿Cómo interpretamos R2?
Aspectos clave a tener en cuenta.
Evaluar el rendimiento con el coeficiente de determinación es muy sencillo con scikit-learn.
Otras métricas muy usadas son el error cuadrático medio (MSE) y su raíz (RMSE). Miden cuánto se desvían las predicciones de los valores reales.
El MSE calcula la diferencia cuadrática media entre valores reales y predichos:
para un total de n observaciones. Como los errores se elevan al cuadrado antes de promediar, los errores grandes se penalizan más que los pequeños; por ello el MSE es sensible a valores atípicos. Un MSE más bajo indica mejor ajuste.
Para abordar esto, se usa el RMSE, que no es más que la raíz cuadrada del MSE. Al estar en las mismas unidades que la variable objetivo, es más interpretable como desviación media de las predicciones.
Calcular MSE y RMSE también es muy sencillo con scikit-learn.
Trabajar con regresión lineal múltiple en scikit-learn
Volvamos a ejecutar el modelo usando todas las características disponibles, no solo el número medio de habitaciones. ¿Esperas mejores o peores resultados?
Vemos que los resultados son bastante mejores que usando una sola característica. Ahora bien, ¿necesitamos todas? ¿Hay unas más relevantes que otras? Elegir las características más relevantes del conjunto de datos se conoce como selección de características.
La selección de características es importante por varias razones.
Cuando varias características están muy correlacionadas, son redundantes: aportan básicamente la misma información. A esto se le llama multicolinealidad. Aunque no siempre perjudica la precisión predictiva, complica la selección e interpretación, especialmente en modelos lineales.
El factor de inflación de la varianza (VIF) es una métrica para detectar multicolinealidad entre predictores. Para cada predictor, el VIF se calcula como:
donde Ri2 es el R2 obtenido al ajustar el predictor Xi frente al resto de predictores del modelo. Un VIF alto indica que el predictor está muy correlacionado con otras variables.
Eliminemos AveBedrms del modelo.
Los resultados mejoran (ligeramente).
Extraer información del modelo
Construir un modelo de regresión es solo el primer paso; entender sus salidas es igual de importante. Analizando los coeficientes del modelo podemos ver qué características tienen más impacto en las predicciones.
Entender los coeficientes de la regresión
Una vez entrenado un modelo de regresión lineal, puedes acceder a los coeficientes con
model.coef_. La intersección se obtiene conmodel.intercept_.Una vez entrenado con LinearRegression(), los coeficientes se consultan con
model.coef_y la intersección conmodel.intercept_.Resumir los resultados del modelo
Como Scikit-Learn no ofrece un método
summary()como Statsmodels, podemos extraer y visualizar manualmente la importancia de cada característica usando los coeficientes. Las variables con coeficientes absolutos mayores tienen más impacto en el objetivo. Considera el siguiente código.Gráfico de importancia de características según los coeficientes
Ahora, visualicemos los residuos y el ajuste de la regresión.
Gráficas para visualizar residuos y ajuste de la regresión
La distribución de residuos (gráfico izquierdo) debería estar centrada en cero, lo que indica errores distribuidos aleatoriamente. Si los residuos siguen una distribución normal, el ajuste es bueno; si hay asimetrías o tendencias, podría haber errores sistemáticos. El gráfico de ajuste (derecha) compara valores reales y predichos; la línea roja discontinua representa el ajuste perfecto. Si los puntos siguen de cerca la línea, las predicciones son precisas; si aparece un patrón (p. ej., una curva), quizá la relación no sea realmente lineal.
Estas visualizaciones ayudan a diagnosticar sobreajuste o infraajuste, revelan patrones en los residuos que sugieren relaciones omitidas y ofrecen una evaluación clara de la eficacia del modelo.
Aplicaciones en el mundo real
La regresión lineal se usa ampliamente en distintos sectores para predecir y tomar decisiones. En inmobiliaria, estima precios de vivienda en función de factores como tamaño y ubicación.
Ventas y marketing la emplean para prever demanda y optimizar presupuestos; en salud se aplica a evaluar riesgos de enfermedad. En finanzas ayuda a predecir precios de acciones y a la calificación crediticia; en manufactura, a control de calidad y predicción de fallos.
Cuándo usar regresión lineal
Cuándo no usar regresión lineal
Conclusión
La regresión lineal sigue siendo una de las técnicas más básicas y a la vez más utilizadas en machine learning y modelado estadístico. Pese a su sencillez, es una herramienta potente para entender relaciones entre variables y realizar predicciones en multitud de casos de uso.
Qué debes recordar de este tutorial:
Si quieres seguir aprendiendo sobre interpolación de cadenas en Python, consulta los recursos de DataCamp.