Curso
La ciencia de datos ha avanzado como pocas disciplinas. Integra multitud de áreas —Estadística, Álgebra lineal, Machine Learning, Bases de datos— y las combina de la forma más útil posible. Pero, en el fondo, ¿qué hace que este campo sea tan fascinante? - Sus potentes algoritmos estadísticos
Uno de los algoritmos estadísticos más básicos es la regresión lineal. Aunque es antiguo, nunca pasa de moda para alguien que está empezando en ciencia de datos. Entender el principio de funcionamiento de la regresión lineal es clave para comprender la evolución de toda una familia de algoritmos estadísticos llamada modelos lineales generalizados. Además, te ayudará a entender otros aspectos comunes de los algoritmos estadísticos y de machine learning como las funciones de coste, los coeficientes, la optimización, etc.
Como sugiere el título, en este tutorial verás la regresión lineal en detalle. Antes de meternos de lleno en la teoría, aclaremos el término regresión.
Entender un problema de regresión
La regresión pertenece a las tareas de aprendizaje supervisado, donde los conjuntos de datos usados para modelado predictivo/estadístico contienen etiquetas continuas. Pero definamos un problema de regresión de forma más matemática.
Considera la siguiente imagen:
Fuente: apuntes de Andrew Ng
En la imagen, X es el conjunto de valores que corresponden a las superficies habitables de distintas casas (también llamado espacio de entrada) y y es el precio de esas casas, pero fíjate en que estos valores los predice h. h es la función que mapea los valores de X a y (a menudo, el predictor). Por tradición, a esta h se la denomina función de hipótesis. Ten presente que este dataset solo tiene una característica, es decir, la superficie habitable; considéralo un conjunto de juguete para entender los conceptos.
Observa que los valores predichos aquí son continuos. Tu objetivo, dado un conjunto de entrenamiento, es aprender una función $h : \mathcal{X} \rightarrow \mathcal{Y}$ tal que h(x) sea un buen predictor del valor correspondiente de y. Ten también en cuenta que el dominio de valores que aceptan X e Y son números reales y puedes definirlo como: $\mathcal{X} = \mathcal{Y} = \mathbb{IR}$, donde $\mathbb{IR}$ es el conjunto de los números reales.
Un par (x(i), y(i)) se llama ejemplo de entrenamiento. Puedes definir el conjunto de entrenamiento como {(x(i), y(i)) ; i = 1,...,m} (si el conjunto tiene m instancias y solo hay una característica x).
Un poco de matemáticas para que no haya dudas ni en lo básico. Según Han, Kamber y Pei:
"En general, estos métodos se usan para predecir el valor de una variable de respuesta (dependiente) a partir de una o más variables predictoras (independientes), donde las variables son numéricas." - Data Mining: Concepts and Techniques (3rd edn.)
Así de simple.
Al entender un problema típico de regresión, también has visto cómo definir su hipótesis. ¡Perfecto! Ahora vamos directos a la mecánica de la regresión lineal.
Regresión lineal: ¿cómo funciona?
Antes de entrar en detalles, no está de más recordar cuándo se descubrió. Tenemos que remontarnos al siglo XVIII. El gran Carl Friedrich Gauss propuso una de las formas más elementales de la regresión estadística, aunque hay debate al respecto. No entraremos en ello. Si te interesa la discusión entre Gauss y Adrien-Marie Legendre, échale un vistazo a este enlace.
La regresión lineal es quizá uno de los algoritmos más conocidos y comprendidos en estadística y machine learning. Nació en el ámbito de la estadística como modelo para entender la relación entre variables numéricas de entrada y salida, pero con el tiempo se ha convertido en parte esencial del arsenal moderno de machine learning.
Veamos un dataset de ejemplo. Usaremos el mismo conjunto de predicción de precios de casas, pero esta vez con dos características. La tarea es la misma: predecir el precio de la vivienda.
Fuente: apuntes de Andrew Ng
Como se mencionó, ahora las x son bidimensionales, es decir, tu dataset tiene dos características. Por ejemplo, x1(i) es la superficie habitable de la i-ésima casa del conjunto de entrenamiento, y x2(i) es su número de dormitorios.
Para hacer regresión, debes decidir cómo vas a representar h. Como elección inicial, aproxima y como una función lineal de x:
Aquí, los θi son los parámetros (también llamados pesos) que parametrizan el espacio de funciones lineales que mapean de $\mathcal{X}$ a $\mathcal{Y}$. En pocas palabras, estos parámetros se usan para mapear correctamente $\mathcal{X}$ a $\mathcal{Y}$. Para simplificar, omitiremos el subíndice θ en hθ(x) y escribiremos simplemente h(x). Para simplificar aún más la notación, introducimos la convención x0 = 1 (el término de intercepto), de modo que

donde en el lado derecho consideramos θ y x como vectores, y n es el número de variables de entrada (sin contar x0).
La gran pregunta ahora es: ¿cómo eliges o aprendes los parámetros θ? No puedes cambiar tus variables de entrada para predecir los precios. Solo puedes ajustar estos parámetros θ.
Una forma natural es hacer que h(x) se acerque a y, al menos para los ejemplos de entrenamiento. Para formalizarlo, definamos una función que determine, para cada valor de θ, cuán cerca están los h(x(i)) de los y(i) correspondientes. La función tiene este aspecto:

¿Por qué usamos el término cuadrático en lugar del valor absoluto? Piensa en el término cuadrático como una ventaja para las operaciones posteriores al entrenar el modelo. Si quieres profundizar, aquí tienes más.
Acabas de ver una de las fórmulas más importantes en ciencia de datos/machine learning/estadística: la función de coste.
Esta derivación es esencial porque no solo da pie a la siguiente evolución de la regresión lineal (mínimos cuadrados ordinarios) sino que también sienta las bases de toda una clase de algoritmos lineales (recuerda los modelos lineales generalizados).
Es importante señalar que la regresión lineal suele dividirse en dos formas básicas:
- Regresión lineal simple (SLR), con solo dos variables (la que viste al principio)
- Regresión lineal múltiple (MLR), con más de dos variables (la que acabas de ver)
Son conceptos sencillos, pero pueden llevar a confusión.
Ya has asentado las bases de la regresión lineal. Ahora veremos formas de estimar los parámetros que viste arriba. Esta estimación es, en esencia, el entrenamiento de la regresión lineal. Existen varios métodos para entrenarla, siendo mínimos cuadrados ordinarios (OLS) el más popular. Por eso, es habitual llamar a un modelo de regresión lineal entrenado con OLS: regresión lineal por mínimos cuadrados.
Nota: en este contexto, a los parámetros también se les llama coeficientes del modelo.
Optimizar un modelo de regresión lineal: distintos enfoques
Aprender/entrenar un modelo de regresión lineal significa estimar los valores de los coeficientes/parámetros usados en su representación con los datos que tienes.
En esta sección, daremos un repaso a algunas técnicas para preparar un modelo de regresión lineal.
Regresión por mínimos cuadrados
Terminamos la sección anterior con la idea de elegir θ para minimizar J(θ). Para ello, usemos un algoritmo de búsqueda que parta de una "estimación inicial" de θ y cambie θ iterativamente para reducir J(θ) hasta converger a un valor que lo minimice. En concreto, consideremos el algoritmo de descenso por gradiente, que parte de un θ inicial y repite la actualización:
Fuente: apuntes de Andrew Ng
(Esta actualización se realiza simultáneamente para j = 0, . . . , n.) Aquí, α es la tasa de aprendizaje. Es un algoritmo muy natural que da pasos en la dirección de mayor descenso de J. Este término α controla efectivamente lo pronunciado del paso hacia la disminución de J. Visualmente, se puede expresar así:
Fuente: ml-cheatsheet
Intuitivamente, la fórmula anterior indica el pequeño cambio en J respecto al parámetro θj y cómo afecta al valor inicial de θj. Fíjate en que aparece una derivada parcial. Toda la derivación queda fuera del alcance de este tutorial.
Para un único ejemplo de entrenamiento, la regla de actualización es:
Fuente: ml-cheatsheet
Esta regla se llama regla LMS (de “least mean squares”) y también se conoce como regla de aprendizaje de Widrow-Hoff.
Resumamos OLS:
"El procedimiento de mínimos cuadrados ordinarios busca minimizar la suma de los residuos al cuadrado. Dada una recta de regresión a través de los datos, calculamos la distancia de cada punto a la recta, la elevamos al cuadrado y sumamos todos los errores cuadrados. Esa es la cantidad que OLS intenta minimizar." - Jason Brownlee
Optimización con descenso por gradiente
En la regla de entrenamiento anterior ya visteis cómo incorporar el descenso por gradiente. En esencia, es un proceso para optimizar los coeficientes minimizando iterativamente el error del modelo en tus datos de entrenamiento.
Funciona empezando con valores aleatorios para cada coeficiente. Se calcula la suma de los errores al cuadrado para cada par entrada-salida. Se usa una tasa de aprendizaje como factor de escala y se actualizan los coeficientes en la dirección que minimiza el error. Se repite hasta alcanzar un mínimo de error cuadrático total o no haya más mejora.
El término α (tasa de aprendizaje) es crucial porque determina el tamaño del paso de mejora en cada iteración.
Hay dos variantes habituales del descenso por gradiente:
- El método que evalúa todos los ejemplos del conjunto de entrenamiento en cada paso: descenso por gradiente por lotes (batch).
- El método que recorre el conjunto y, cada vez que encuentra un ejemplo, actualiza los parámetros según el gradiente del error respecto a ese único ejemplo: descenso por gradiente estocástico (también incremental).
Hasta aquí el descenso por gradiente. Veamos ahora otra manera de optimizar un modelo de regresión lineal: la regularización.
Regularización
DataCamp ya tiene un buen artículo introductorio sobre regularización. Te puede venir bien leerlo antes de seguir.
En general, los métodos de regularización penalizan los coeficientes de las características con valores extremadamente grandes para reducir el error. No solo mejora la tasa de error, sino que reduce la complejidad del modelo. Es especialmente útil cuando trabajas con un dataset con muchas características y tu modelo base no distingue bien su importancia (no todas las variables son igual de relevantes, ¿verdad?).
En regresión lineal hay dos variantes habituales de regularización:
Lasso regression: añade un término de penalización equivalente al valor absoluto de la magnitud de los coeficientes (también llamada regularización L1). El término de penalización es: 
donde:
- $\lambda$ es el factor constante que añade control sobre la velocidad de mejora del error (tasa de aprendizaje)
- el dataset tiene (M+1) características, así que recorre de 0 a M. wj es el peso/coeficiente.
Ridge regression: añade un término de penalización equivalente al cuadrado de la magnitud de los coeficientes (también llamada regularización L2). El término de penalización es: 
¿Sigue mereciendo la pena aprender regresión lineal?
¡Y tanto! Ya has visto cómo la regresión lineal presenta con elegancia conceptos críticos de machine learning como funciones de coste, optimización, relaciones entre variables y mucho más. Todo esto es vital incluso al construir una red neuronal. La aplicabilidad cambia en algunos puntos, pero los conceptos de fondo son los mismos. Sin entender estas bases, nunca sabrás por qué tu red neuronal no rinde bien.
Además, a partir de una idea sencilla —modelar relaciones entre variables— surgieron muchos conceptos y, lo más importante, toda una familia de algoritmos: los modelos lineales generalizados. Así que, para cualquier aspirante a profesional de Data Science/Machine Learning/Inteligencia artificial, este algoritmo no es opcional. ¡A estas alturas ya lo habrás visto!
Ahora vas a implementar una regresión lineal sencilla en Python por tu cuenta. ¡Vamos allá!
Un caso práctico en Python
Para este caso práctico, usarás la librería Statsmodel de Python. Es muy popular y ofrece clases y funciones para estimar muchos modelos estadísticos, realizar pruebas y explorar datos estadísticos. Para los datos, emplearás el famoso Boston House dataset. scikit-learn incluye este dataset, así que no necesitas descargarlo.
Empecemos importando la librería statsmodels y el dataset:
import statsmodels.api as sm
from sklearn import datasets
data = datasets.load_boston()
Scikit-learn ofrece una descripción del dataset que puedes ver así:
print (data.DESCR)
Boston House Prices dataset
===========================
Notes
------
Data Set Characteristics:
:Number of Instances: 506
:Number of Attributes: 13 numeric/categorical predictive
:Median Value (attribute 14) is usually the target
:Attribute Information (in order):
- CRIM per capita crime rate by town
- ZN proportion of residential land zoned for lots over 25,000 sq.ft.
- INDUS proportion of non-retail business acres per town
- CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
- NOX nitric oxides concentration (parts per 10 million)
- RM average number of rooms per dwelling
- AGE proportion of owner-occupied units built prior to 1940
- DIS weighted distances to five Boston employment centres
- RAD index of accessibility to radial highways
- TAX full-value property-tax rate per $10,000
- PTRATIO pupil-teacher ratio by town
- B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
- LSTAT % lower status of the population
- MEDV Median value of owner-occupied homes in $1000's
:Missing Attribute Values: None
:Creator: Harrison, D. and Rubinfeld, D.L.
This is a copy of UCI ML housing dataset.
http://archive.ics.uci.edu/ml/datasets/Housing
This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.
The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic
prices and the demand for clean air', J. Environ. Economics & Management,
vol.5, 81-102, 1978. Used in Belsley, Kuh & Welsch, 'Regression diagnostics
...', Wiley, 1980. N.B. Various transformations are used in the table on
pages 244-261 of the latter.
The Boston house-price data has been used in many machine learning papers that address regression
problems.
**References**
- Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.
- Quinlan, R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.
- many more! (see http://archive.ics.uci.edu/ml/datasets/Housing)
Antes de aplicar la regresión lineal, prepara los datos y separa las características y la etiqueta del dataset. MEDV (valor mediano de la vivienda) es la etiqueta en este caso. Puedes acceder a las características con el atributo feature_names.
Un poco de pandas te vendrá genial. Esta chuleta es imprescindible si quieres repasar conceptos básicos de pandas.
# Pandas and NumPy import
import numpy as np
import pandas as pd
# Set the features
df = pd.DataFrame(data.data, columns=data.feature_names)
# Set the target
target = pd.DataFrame(data.target, columns=["MEDV"])
En este punto conviene tener presentes algunas cosas sobre la regresión lineal antes de aplicarla. Podríamos haberlas visto antes, pero hacerlo ahora te ayudará a asimilarlas mejor.
- Suposición de linealidad: La regresión lineal se usa para capturar la relación entre variables de entrada y salida. Para ello asume que la relación es lineal (y no siempre lo es). Siempre puedes transformar los datos para que la relación sea lineal. Por ejemplo, si tu relación es exponencial, puedes aplicar un log-transform para linealizar.
- Colinealidad entre características: La colinealidad mide la importancia de una característica de forma matemática. Cuando las características están muy correlacionadas entre sí, la regresión lineal no aproxima bien la relación y tiende a sobreajustar. Es recomendable detectar las variables muy correlacionadas y eliminarlas antes de aplicar la regresión lineal. Si quieres saber más, echa un vistazo a este excelente kernel de Kaggle.
Manos a la obra. Para simplificar, usaremos solo la característica RM — número medio de habitaciones. Ten en cuenta que Statsmodels no añade el término constante (recuerda θ0) por defecto. Veámoslo primero sin el término constante en tu modelo:
X = df["RM"]
y = target["MEDV"]
# Fit and make the predictions by the model
model = sm.OLS(y, X).fit()
predictions = model.predict(X)
# Print out the statistics
model.summary()

¿Qué es todo este output? Es mucho para una primera vez. Vamos por partes con lo más importante:
- Lo primero que ves es que estás usando el método
OLSpara entrenar tu regresión lineal. - Hay un valor de R-squared. R-cuadrado es el “porcentaje de varianza explicada” por el modelo. Es decir, la fracción por la cual la varianza de los errores es menor que la varianza de la variable dependiente. Toma valores entre 0 y 1 (0% a 100%). R-cuadrado te da una estimación de la relación entre los movimientos de la variable dependiente según los movimientos de la independiente. No te dice si tu modelo es bueno o malo, ni si hay sesgos. Un R-cuadrado alto o bajo no es necesariamente bueno o malo: no refleja la fiabilidad del modelo ni si has elegido la regresión adecuada. Puedes obtener un R-cuadrado bajo con un buen modelo, o alto con un mal ajuste, y viceversa.
- El coeficiente (coef) de 3.634 significa que si
RMaumenta en 1, el valor predicho deMEDVaumenta en 3.634. - Hay un intervalo de confianza del 95% para RM, es decir, el modelo estima con un 95% de confianza que el valor del coeficiente de RM está entre 3.548 y 3.759.
Estos son los puntos clave por ahora (y puedes ignorar el aviso).
Puedes añadir fácilmente el término constante al modelo: con X = sm.add_constant(X) (X es el dataframe con las variables independientes).
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
predictions = model.predict(X)
model.summary()

Se ve claramente que añadir el término constante afecta directamente al coeficiente. Sin constante, tu modelo pasaba por el origen; ahora tienes una intersección con el eje y en -34.67. La pendiente del predictor RM también cambia de 3.634 a 9.1021 (coef de RM).
Ahora ajustaremos un modelo con más de una variable: añadiremos LSTAT (porcentaje de población con menor estatus) junto con RM. El procedimiento de entrenamiento es exactamente el mismo:
X = df[["RM", "LSTAT"]]
y = target["MEDV"]
model = sm.OLS(y, X).fit()
predictions = model.predict(X)
model.summary()

Interpretemos:
Este modelo tiene un R-cuadrado mucho más alto —0.948—, lo que significa que captura el 94.8% de la varianza de la variable dependiente. Veamos la relación entre RM, LSTAT y el valor mediano de la vivienda. Si RM aumenta en 1, MEDV aumenta en 4.9069; si LSTAT aumenta en 1, MEDV disminuye en 0.6557. Indica que RM y LSTAT son estadísticamente significativas para predecir (o estimar) el valor mediano de la vivienda.
En castellano llano:
- Las casas con pocas habitaciones tienden a tener precios más bajos.
- En zonas con menor estatus socioeconómico, los precios de la vivienda tienden a ser más bajos.
¡Ahora sí que tiene sentido! ¿Verdad?
Este fue el ejemplo de regresión lineal simple y múltiple con Statsmodels. Tu tarea es investigar e interpretar los resultados con más características.
Ahora veamos cómo implementar la regresión lineal con tu querido scikit-learn. Ya tienes el dataset importado, pero necesitas importar la clase linear_model.
from sklearn import linear_model
X = df
y = target["MEDV"]
lm = linear_model.LinearRegression()
model = lm.fit(X,y)
El entrenamiento ha finalizado. Esta implementación de sklearn también usa OLS. Hagamos predicciones de MEDV para las cinco primeras muestras.
predictions = lm.predict(X)
print(predictions[0:5])
[30.00821269 25.0298606 30.5702317 28.60814055 27.94288232]
Si quieres más detalles (R-cuadrado, coeficientes, etc.) del modelo, puedes obtenerlos fácilmente.
lm.score(X,y)
0.7406077428649427
lm.coef_
array([-1.07170557e-01, 4.63952195e-02, 2.08602395e-02, 2.68856140e+00,
-1.77957587e+01, 3.80475246e+00, 7.51061703e-04, -1.47575880e+00,
3.05655038e-01, -1.23293463e-02, -9.53463555e-01, 9.39251272e-03,
-5.25466633e-01])
Para terminar
¡Genial! Has llegado al final. No era trivial cubrir uno de los algoritmos más simples y fundamentales, y lo has hecho muy bien. No solo te has familiarizado con la regresión lineal simple, sino que también has repasado muchos conceptos, términos y factores clave del machine learning. Y además hiciste un caso práctico a fondo en Python.
Este tutorial también puede servirte como motivación para implementar la regresión lineal desde cero. Estos son los pasos, a modo de guía rápida:
- Calcular la media y la varianza de los datos
- Calcular la covarianza
- Estimar los coeficientes
- Realizar predicciones
Estas son algunas referencias usadas para preparar el tutorial:
- Machine Learning course by Coursera (taught by the great Andrew Ng)
- Implementing linear regression from scratch
- The Elements of Statistical Learning
- Simple and Multiple Linear Regression in Python by Adi Bronshtein
Si quieres aprender más sobre clasificadores lineales, echa un vistazo al curso Linear Classifiers in Python de DataCamp.
Consulta también nuestro tutorial sobre la ecuación normal para regresión lineal.

