Selección vía regularización e Iris

Veamos un ejemplo aplicando el algoritmo de regresión logística al dataset Iris. Cargamos el dataset, nos quedamos solo con dos especies de flores (para trabajar en un escenario de clasificación binaria y evitar tener que entrenar más de un modelo) y extraemos las características predictivas y las etiquetas codificadas:

iris = sns.load_dataset("iris")
iris = iris[iris.species.isin(["setosa", "versicolor"])]
X = iris.drop("species", axis = 1)
y = iris.species.astype("category").cat.codes

E importamos el algoritmo:

from sklearn.linear_model import LogisticRegression

Regularización L2

Entrenemos el algoritmo aplicando regularización L2 (es la opción por defecto, de forma que no sería necesario especificarlo en el siguiente código):

model = LogisticRegression(penalty = "l2")
model.fit(X, y)

Selección vía regularización e Iris

Podemos visualizar los pesos por los que se van a multiplicar los valores de entrada con el atributo .coef_:

model.coef_
array([[ 0.44036482, -0.90696813,  2.30849566,  0.96232763]])

Y el bias con el atributo .intercept_:

model.intercept_
array([-6.61165119])

Comprobamos que ninguno de los cinco parámetros es nulo.

Regularización L1

Repitamos ahora el entrenamiento especificando regularización L1. Obsérvese que, en este caso, debemos especificar un optimizador distinto al aplicado por defecto, lbfgs, pues éste no soporta este tipo de regularización:

model = LogisticRegression(penalty = "l1", solver = "liblinear")
model.fit(X, y)

Selección vía regularización e Iris

Ahora, los pesos son:

model.coef_
array([[ 0.       , -2.505779 ,  2.8025585,  0.       ]])

Y el bias:

model.intercept_
array([0.])

En este caso, tres de los cinco parámetros son nulos. Recordemos que, en cualquier caso, la fuerza de la regularización en la clase LogisticRegression de Scikit-Learn es controlable mediante el parámetro C, por lo que podríamos forzar el entrenamiento para que el número de parámetros nulos fuese mayor o menor.