Análisis Discriminante Lineal para la Clasificación

Beginner

This tutorial is from open-source community. Access the source code

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.