Análisis Discriminante Lineal (LDA) en Python con Scikit-Learn

En nuestro artículo anterior Implementación de PCA en Python con Scikit-Learn, estudiamos cómo podemos reducir la dimensionalidad del conjunto de características usando PCA. En este articulo...

En nuestro artículo anterior Implementando PCA en Python con Scikit-Learn, estudiamos cómo podemos reducir la dimensionalidad del conjunto de características usando PCA. En este artículo estudiaremos otra técnica de reducción de dimensionalidad muy importante: análisis discriminante lineal (o LDA). Pero primero analicemos brevemente cómo PCA y LDA se diferencian entre sí.

PCA vs LDA: ¿Cuál es la diferencia?

Tanto PCA como LDA son técnicas de transformación lineal. Sin embargo, PCA es una técnica de reducción de dimensionalidad no supervisada, mientras que LDA es una técnica supervisada.

PCA no se preocupa por las etiquetas de clase. En palabras simples, PCA resume el conjunto de funciones sin depender de la salida. PCA intenta encontrar las direcciones de la varianza máxima en el conjunto de datos. En un gran conjunto de funciones, hay muchas funciones que son simplemente duplicados de otras funciones o tienen una alta correlación con las otras funciones. Tales características son básicamente redundantes y pueden ignorarse. El papel de PCA es encontrar características altamente correlacionadas o duplicadas y crear un nuevo conjunto de características donde haya una correlación mínima entre las características o, en otras palabras, un conjunto de características con la máxima variación entre las características. Dado que la variación entre las funciones no depende de la salida, PCA no tiene en cuenta las etiquetas de salida.

A diferencia de PCA, LDA intenta reducir las dimensiones del conjunto de funciones mientras conserva la información que discrimina las clases de salida. LDA intenta encontrar un límite de decisión alrededor de cada grupo de una clase. Luego, proyecta los puntos de datos a nuevas dimensiones de manera que los grupos estén lo más separados posible entre sí y los elementos individuales dentro de un grupo estén lo más cerca posible del centroide del grupo. Las nuevas dimensiones se clasifican según su capacidad para maximizar la distancia entre los grupos y minimizar la distancia entre los puntos de datos dentro de un grupo y sus centroides. Estas nuevas dimensiones forman los discriminantes lineales del conjunto de características.

Veamos ahora cómo podemos implementar LDA usando Scikit-Learn de Python.

Implementación de LDA con Scikit-Learn

Al igual que PCA, la biblioteca Scikit-Aprender contiene clases integradas para realizar LDA en el conjunto de datos. En esta sección, aplicaremos LDA en el conjunto de datos de Iris, ya que usamos el mismo conjunto de datos para el artículo de PCA y queremos comparar los resultados de LDA con PCA. La información sobre el conjunto de datos de Iris está disponible en el siguiente enlace:

https://archive.ics.uci.edu/ml/datasets/iris

El resto de las secciones sigue nuestra canalización tradicional de aprendizaje automático:

Importación de bibliotecas

1
2
import numpy as np
import pandas as pd

Importación del conjunto de datos

1
2
3
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
dataset = pd.read_csv(url, names=names)

Preprocesamiento de datos {#preprocesamiento de datos}

Una vez que el conjunto de datos se carga en un objeto de marco de datos de pandas, el primer paso es dividir el conjunto de datos en características y etiquetas correspondientes y luego dividir el conjunto de datos resultante en conjuntos de entrenamiento y prueba. El siguiente código divide los datos en etiquetas y conjunto de características:

1
2
X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:, 4].values

El script anterior asigna las primeras cuatro columnas del conjunto de datos, es decir, el conjunto de características a la variable X, mientras que los valores en la quinta columna (etiquetas) se asignan a la variable y.

El siguiente código divide los datos en conjuntos de entrenamiento y prueba:

1
2
3
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

Escalado de funciones {#escalado de funciones}

Como fue el caso con PCA, también debemos realizar escalado de funciones para LDA. Ejecute el siguiente script para hacerlo:

1
2
3
4
5
from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Realización de LDA

Solo requiere cuatro líneas de código para realizar LDA con Scikit-Learn. La clase LinearDiscriminantAnalysis de la biblioteca sklearn.discriminant_analysis se puede utilizar para realizar LDA en Python. Echa un vistazo al siguiente script:

1
2
3
4
5
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

lda = LDA(n_components=1)
X_train = lda.fit_transform(X_train, y_train)
X_test = lda.transform(X_test)

En el script anterior, la clase LinearDiscriminantAnalysis se importa como LDA. Al igual que PCA, tenemos que pasar el valor del parámetro n_components de LDA, que se refiere al número de discriminaciones lineales que queremos recuperar. En este caso, establecemos n_components en 1, ya que primero queremos verificar el rendimiento de nuestro clasificador con un solo discriminante lineal. Finalmente, ejecutamos los métodos fit y transform para recuperar los discriminantes lineales.

Tenga en cuenta que, en el caso de LDA, el método transform toma dos parámetros: el X_train y el y_train. Sin embargo, en el caso de PCA, el método transform solo requiere un parámetro, es decir, X_train. Esto refleja el hecho de que LDA tiene en cuenta las etiquetas de clase de salida al seleccionar los discriminantes lineales, mientras que PCA no depende de las etiquetas de salida.

Entrenamiento y elaboración de predicciones {#entrenamiento y elaboración de predicciones}

Dado que queremos comparar el rendimiento de LDA con un discriminante lineal con el rendimiento de PCA con un componente principal, utilizaremos el mismo clasificador Random Forest que usamos para evaluar el rendimiento de los algoritmos reducidos por PCA.

Ejecuta el siguiente código:

1
2
3
4
5
6
from sklearn.ensemble import RandomForestClassifier

classifier = RandomForestClassifier(max_depth=2, random_state=0)

classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)

Evaluando el Desempeño

Como siempre, el último paso es evaluar el rendimiento del algoritmo con la ayuda de una matriz de confusión y encontrar la precisión de la predicción. Ejecute el siguiente script:

1
2
3
4
5
6
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score

cm = confusion_matrix(y_test, y_pred)
print(cm)
print('Accuracy' + str(accuracy_score(y_test, y_pred)))

La salida del script anterior se ve así:

1
2
3
4
[[11  0  0]
 [ 0 13  0]
 [ 0  0  6]]
Accuracy 1.0

Puede ver que con un discriminante lineal, el algoritmo logró una precisión del 100 %, que es mayor que la precisión lograda con un componente principal, que fue del 93,33 %.

PCA vs LDA: ¿Qué elegir para la reducción de la dimensionalidad?

En el caso de datos distribuidos uniformemente, LDA casi siempre funciona mejor que PCA. Sin embargo, si los datos están muy sesgados (distribuidos de forma irregular), se recomienda utilizar PCA, ya que LDA puede estar sesgado hacia la clase mayoritaria.

Finalmente, es beneficioso que PCA se pueda aplicar a datos etiquetados y no etiquetados, ya que no depende de las etiquetas de salida. Por otro lado, LDA requiere clases de salida para encontrar discriminantes lineales y, por lo tanto, requiere datos etiquetados.

Yendo más lejos: proyecto de extremo a extremo portátil

¿Tu naturaleza inquisitiva te hace querer ir más allá? Recomendamos consultar nuestro Proyecto guiado: ["Predicción práctica del precio de la vivienda: aprendizaje automático en Python"](https://wikihtp.com/courses/hands-on-house- precio-predicción-aprendizaje-máquina-en-python/#cta){target="_blank"}.

[](https://wikihtp.com/ cursos/predicción-de-precio-de-la-casa-práctica-aprendizaje-de-máquina-en-python/#cta)

En este proyecto guiado, aprenderá a crear potentes modelos tradicionales de aprendizaje automático, así como modelos de aprendizaje profundo, utilizar Ensemble Learning y capacitar a los meta-aprendices para predecir los precios de la vivienda a partir de una bolsa de modelos Scikit-Learn y Keras.

Con Keras, la API de aprendizaje profundo creada sobre Tensorflow, experimentaremos con arquitecturas, crearemos un conjunto de modelos apilados y entrenaremos una red neuronal meta-aprendizaje (modelo de nivel 1) para averiguar el precio de un casa.

El aprendizaje profundo es sorprendente, pero antes de recurrir a él, se recomienda intentar resolver el problema con técnicas más simples, como los algoritmos de aprendizaje superficial. Nuestro rendimiento de referencia se basará en un algoritmo de Regresión de bosque aleatorio. Además, exploraremos la creación de conjuntos de modelos a través de Scikit-Learn a través de técnicas como embalaje y votación.

Este es un proyecto integral y, como todos los proyectos de aprendizaje automático, comenzaremos con Análisis exploratorio de datos, seguido de Preprocesamiento de datos y, finalmente, Creación de modelos de aprendizaje superficial y Profundo para ajustarse a los datos que hemos explorado y limpiado previamente. .