Introducción
Esta práctica te presentará el Análisis Discriminante Lineal (LDA) y cómo se puede utilizar para la clasificación. Utilizaremos scikit-learn, una popular biblioteca de aprendizaje automático en Python, para implementar el LDA. También exploraremos cómo los estimadores de covarianza Ledoit-Wolf y Oracle Shrinkage Approximating (OAS) pueden mejorar la clasificación.
Consejos sobre la VM
Una vez finalizada la inicialización de la VM, haz 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 tengas 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 tienes problemas durante el aprendizaje, no dudes en preguntar a Labby. Proporciona retroalimentación después de la sesión y resolveremos el problema para ti de inmediato.
Generar datos aleatorios
Primero, necesitamos generar datos aleatorios con una característica discriminativa y características ruidosas. Utilizaremos la función make_blobs de scikit-learn para generar dos grupos de datos con una característica discriminativa. Luego agregaremos ruido aleatorio a las otras características.
import numpy as np
from sklearn.datasets import make_blobs
def generate_data(n_samples, n_features):
"""Generate random blob-ish data with noisy features.
This returns an array of input data with shape `(n_samples, n_features)`
and an array of `n_samples` target labels.
Only one feature contains discriminative information, the other features
contain only noise.
"""
X, y = make_blobs(n_samples=n_samples, n_features=1, centers=[[-2], [2]])
## add non-discriminative features
if n_features > 1:
X = np.hstack([X, np.random.randn(n_samples, n_features - 1)])
return X, y
Implementar LDA
A continuación, implementaremos el LDA utilizando la clase LinearDiscriminantAnalysis de scikit-learn. Crearemos tres clasificadores:
- LDA sin encogimiento
- LDA con encogimiento Ledoit-Wolf
- LDA con encogimiento OAS
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.covariance import OAS
clf1 = LinearDiscriminantAnalysis(solver="lsqr", shrinkage=None)
clf2 = LinearDiscriminantAnalysis(solver="lsqr", shrinkage="auto")
oa = OAS(store_precision=False, assume_centered=False)
clf3 = LinearDiscriminantAnalysis(solver="lsqr", covariance_estimator=oa)
Entrenar y probar los clasificadores
Entrenaremos y probaremos cada clasificador para ver cómo se comportan con los datos generados. Repetiremos este proceso varias veces para obtener una puntuación de precisión promedio.
n_train = 20 ## muestras para el entrenamiento
n_test = 200 ## muestras para la prueba
n_averages = 50 ## cuántas veces se repetirá la clasificación
n_features_max = 75 ## número máximo de características
step = 4 ## tamaño del paso para el cálculo
acc_clf1, acc_clf2, acc_clf3 = [], [], []
n_features_range = range(1, n_features_max + 1, step)
for n_features in n_features_range:
score_clf1, score_clf2, score_clf3 = 0, 0, 0
for _ in range(n_averages):
X, y = generate_data(n_train, n_features)
clf1.fit(X, y)
clf2.fit(X, y)
clf3.fit(X, y)
X, y = generate_data(n_test, n_features)
score_clf1 += clf1.score(X, y)
score_clf2 += clf2.score(X, y)
score_clf3 += clf3.score(X, y)
acc_clf1.append(score_clf1 / n_averages)
acc_clf2.append(score_clf2 / n_averages)
acc_clf3.append(score_clf3 / n_averages)
Visualizar los resultados
Finalmente, graficaremos la precisión de clasificación de cada clasificador en función del número de características. Utilizaremos matplotlib para crear la gráfica.
import matplotlib.pyplot as plt
features_samples_ratio = np.array(n_features_range) / n_train
plt.plot(
features_samples_ratio,
acc_clf1,
linewidth=2,
label="LDA",
color="gold",
linestyle="solid",
)
plt.plot(
features_samples_ratio,
acc_clf2,
linewidth=2,
label="LDA with Ledoit Wolf",
color="navy",
linestyle="dashed",
)
plt.plot(
features_samples_ratio,
acc_clf3,
linewidth=2,
label="LDA with OAS",
color="red",
linestyle="dotted",
)
plt.xlabel("n_features / n_samples")
plt.ylabel("Precisión de clasificación")
plt.legend(loc="lower left")
plt.ylim((0.65, 1.0))
plt.suptitle(
"LDA (Análisis Discriminante Lineal) vs. "
+ "\n"
+ "LDA con Ledoit Wolf vs. "
+ "\n"
+ "LDA con OAS (1 característica discriminativa)"
)
plt.show()
Resumen
En este laboratorio, aprendimos cómo implementar el Análisis Discriminante Lineal (LDA) utilizando scikit-learn. Exploramos cómo los estimadores de covarianza Ledoit-Wolf y Oracle Shrinkage Approximating (OAS) pueden mejorar la precisión de clasificación. También generamos datos aleatorios con una característica discriminativa y probamos nuestros clasificadores con estos datos. Finalmente, visualizamos la precisión de clasificación en función del número de características.