Regularización sobre algoritmos de regresión

| Última modificación: 15 de noviembre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este artículo vamos a ver cómo funciona la regularización sobre algoritmos de regresión.

Trabajaremos la regularización Lasso y la regularización Ridge, L1 y L2, respectivamente.

Pintar las gráficas

Lo primero que haremos es cargar las librerías y las funciones necesarias para pintar las gráficas:

#Regularización sobre algoritmos de regresión
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
%matplotlib inline

cm = plt.cm. RdBu
cm_bright = ListedColormap (['#FF0000', '#0000FF'])

import warnings
warnings.filterwarnings ('ignore')
#definimos una función para representar el resultado del ajuste
#Regularización sobre algoritmos de regresión

def plot_decision_boundary (X, y, h, model):

x_min, x_max = X [ : , 0].min () - .5, X [ : , 0].max () + .5

y_min, y_max = X [ : , 1].min () - .5, X [ : , 1].max () + .5

h = .05 #step size in the mesh

xx, yy = np.meshgrid (np.arange (x_min, x_max, h), np.arange (y_min, y_max, h))

Zd = model.predict (np.c [xx.ravel (), yy.ravel ()])

Zd= Zd.reshape (xx.shape)

Zp = model.predict proba (np.c_ [xx.ravel), yy.ravel ()]) [ : ,1]

Zp = Zp.reshape (xx. shape)

#Error de clasificación

ypred = model.predict (x)

acc = accuracy_score (y, ypred)

plt.figure (1, figsize = (12, 5))

plt.subplot (1, 2, 1)

plt.scatter (X [ : , 0], X [ : , 1], c = y, cap = cm_bright)
plt.axis ([x_min, x_max, y_min, y_max])

plt.contour (xx, yy, Zd, levels = [ 0 ], linewidths = 2)
plt.contourf (xx, yy, Zd, cmap = co, alpha = .5)

plt.xlabel ("$x_1$", fontsize = 16)
plt.ylabel("$x 2$", fontsize = 16)
msg = 'FRONTERA DECISION\n Acc: %0.2g' % acc
plt.title (msg)

plt.subplot (1, 2, 2)
plt.scatter (X [ : , 0], X [ : , 1], c = y, cmap = cm_bright)
plt.axis ([x_min, x_max, y_min, y_max])
#plt. contour(xx, yy, Zp, levels = [0], linewidths = 2)
plt.contourf (xx, yy, Zp, cmap = cm, alpha = .5)
plt.xlabel ("$x_1s", fontsize = 16)
plt.ylabel ("$x_2$", fontsize = 16)
msg = 'PROBABILIDAD\n Acc: %0.2g' % acc
plt.title (msg)
plt.tight_layout ()
plt.show ()

Regularización sobre algoritmos de regresión

Ahora entendamos mejor cómo funciona la regularización sobre algoritmos de regresión:

#Regularización sobre algoritmos de regresión
N_train = 10
N_test = 100

#función verdadera g (x)
x = np.linspace (0, 1, N_test)
g_x = np.cos (1.5 * np.pi * x)

# proceso y
np.random.seed (0) #para asegurar reproducibilidad
epsilon = np.random.randn (N_test) * 0.2
y = g_x + epsilon

# Datos: 0 = {x_1, y_1}, obtenemos una muestra
#Regularización sobre algoritmos de regresión

idx = np.random.randint (0, N_test, N_train)
x_i = x [idx]
y_i = y lidx]

#dibujamos la función g(x), y el conjunto de datos x_i, y_i
plt.plot (x, g_x, 'r', label = 'g (x) ' )
plt.plot (x_i, y_i, 'b.', label = 'y')
plt.legend ()
plt.show ()

En primer lugar, ajustamos un modelo (regresión lineal) muy complejo sobre estos datos de la siguiente forma:

Tiene 10 coeficientes (ω1, … , ω10). Este modelo seguramente sufrirá overfitting.

Ahora lo que haremos será entrenar un algoritmo de regresión lineal y calcular el error cuadrático medio del conjunto de test:

#Regularización sobre algoritmos de regresión
from sklearn.preprocessing import Polynomial Features
from sklearn.linear model import LinearRegression

degree = 10

#features
poly = Polynomial Features (degree) #generamos x^j
X_train = poly. fit_transform (x_i.reshape (-1, 1))
y_train = y_i

X_test = poly.fit_transform (x.reshape (-1, 1))
y_test = y

lr = linearRegression ().fit (X_train, y_train)

#predicción
y_hat = lr.predict (X_test)

mse = np.mean ((y - y_hat) 2)

plt.plot (x, g_x, 'r', label = '$y$')
plt.plot (x_i, y_i, 'b.', label = '$y_i$')
plt.plot (x, y_hat, 'g', label = '$\hat {y} $')
plt.title ('Grado: %i\nMSE:2f'% (degree, mse))
plt.legend ()
plt.xlim ((0, 1))
plt.ylim ((-2, 2))
plt.show ()

#Mostramos los coeficientes del modelo
#Regularización sobre algoritmos de regresión
prin t('w0: ', lr.intercept_)

w = lr.coef_
norm_w2 = np.dot (w, w, T) #no se tiene en cuenta el intercepto

coef_names = ['w' + str (i) + ' :  ' for i in range (1, degree + 1)]
for f, wi in zip(coef_names, w):
print (f, wi)

print ('\n l l w l l _2 ^ 2 -- %.2g' % norm_w2)
Regularización sobre algoritmos de regresión

w0: 1018.7591895935266

w1: -0.029389281292386715

w2: -24032.863921608543

w3: 231294.00705064868

w4: -1191201.1474242613

w5: 3568841.9532320956

w6: -6150955.357541396

w7: 5013085.5819753045

w8: 1032053.2895785227

w9: -5939085.981209873

w10: 4781062.610945556

Mostramos los coeficientes del modelo. Vemos cómo, salvo el primero, que tiene como motivo un -0.029389281292386715, el resto son todos del orden de los millones, es decir, son coeficientes muy altos.

El que tenemos, por lo tanto, es un modelo de una altísima complejidad y está claramente sobreajustado a los datos, es decir, está en overfitting. ¿Qué podemos hacer? Podemos tratar de suavizar este modelo, regularizarlo manteniendo no más que la complejidad inicial, que son los 10°. Vamos a penalizar los coeficientes altos y lo que va a conseguir eso es que el modelo sea mucho más sencillo.

¿Cómo continuar?

El Big Data tiene uno de los mercados laborales más prolíficos del sector IT, por eso, si quieres empezar a ver los resultados de tus esfuerzos, tenemos una excelente opción para ti: por medio de nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, podrás aprender todo lo necesario para incursionar en el mundo profesional en pocos meses. ¡Anímate a impulsar tu futuro y solicita ya más información!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado