Introducción
En este laboratorio, aprenderemos sobre el SGDClassifier y el SGDRegressor en scikit-learn y cómo utilizarlos para aplicar penas L1, L2 y elastic-net en los datos.
Consejos sobre la VM
Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.
A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.
Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y resolveremos el problema inmediatamente para usted.
Importando bibliotecas
El primer paso es importar las bibliotecas necesarias. Vamos a utilizar numpy, matplotlib y scikit-learn.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDClassifier, SGDRegressor
Generando datos
Generaremos algunos datos de muestra para aplicar nuestras penas. Para este ejemplo, generaremos dos clases de datos con 100 muestras cada una.
np.random.seed(42)
## Generate two classes of data
X = np.random.randn(200, 2)
y = np.repeat([1, -1], 100)
Aplicando la penalización L1
Ahora aplicaremos la penalización L1 a nuestros datos utilizando el SGDClassifier.
## Create a classifier with L1 penalty
clf = SGDClassifier(loss='hinge', penalty='l1', alpha=0.05, max_iter=1000, tol=1e-3)
## Fit the model
clf.fit(X, y)
## Plot the decision boundary
plt.scatter(X[:, 0], X[:, 1], c=y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 201), np.linspace(ylim[0], ylim[1], 201))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.title('Penalización L1')
plt.show()
Aplicando la penalización L2
Ahora aplicaremos la penalización L2 a nuestros datos utilizando el SGDClassifier.
## Create a classifier with L2 penalty
clf = SGDClassifier(loss='hinge', penalty='l2', alpha=0.05, max_iter=1000, tol=1e-3)
## Fit the model
clf.fit(X, y)
## Plot the decision boundary
plt.scatter(X[:, 0], X[:, 1], c=y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 201), np.linspace(ylim[0], ylim[1], 201))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.title('Penalización L2')
plt.show()
Aplicando la penalización Elastic-Net
Ahora aplicaremos la penalización Elastic-Net a nuestros datos utilizando el SGDClassifier.
## Create a classifier with elastic-net penalty
clf = SGDClassifier(loss='hinge', penalty='elasticnet', alpha=0.05, l1_ratio=0.15, max_iter=1000, tol=1e-3)
## Fit the model
clf.fit(X, y)
## Plot the decision boundary
plt.scatter(X[:, 0], X[:, 1], c=y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 201), np.linspace(ylim[0], ylim[1], 201))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
ax.set_xlim(xlim)
ax.set_ylim(ylim)
plt.title('Penalización Elastic-Net')
plt.show()
Resumen
En este laboratorio, aprendimos cómo aplicar penas L1, L2 y Elastic-Net a datos utilizando el SGDClassifier en scikit-learn. Generamos datos de muestra, aplicamos las penas y graficamos los límites de decisión. Esta es una herramienta útil para la regularización en modelos de aprendizaje automático, especialmente para prevenir el sobreajuste.