Implementando LDA en Python con Scikit-Learn

I

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 artículo estudiaremos otra técnica de reducción de dimensionalidad muy importante: análisis discriminante lineal (o LDA). Pero primero analicemos brevemente en qué se diferencian PCA y LDA.

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

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

PCA no se preocupa por las etiquetas de clase. En palabras simples, PCA resume el conjunto de características sin depender de la salida. PCA intenta encontrar las direcciones de la varianza máxima en el conjunto de datos. En un conjunto de características grande, hay muchas características que son simplemente duplicadas de las otras características o tienen una alta correlación con las otras características. Estas características son básicamente redundantes y pueden ignorarse. La función de PCA es encontrar características tan 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 características mientras retiene 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 tan separados entre sí como sea posible y los elementos individuales dentro de un grupo estén lo más cerca posible del centroide del grupo. Las nuevas dimensiones se clasifican en función de 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

Como PCA, el Scikit-Learn La biblioteca contiene clases integradas para realizar LDA en el conjunto de datos. En esta sección, aplicaremos LDA en el conjunto de datos 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 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 Machine Learning:

Importación de bibliotecas

import numpy as np
import pandas as pd

Importar el conjunto de datos

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

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:

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 X variable mientras que los valores en la quinta columna (etiquetas) se asignan a la y variable.

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

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)

Escala de funciones

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

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. los LinearDiscriminantAnalysis clase de la sklearn.discriminant_analysis La biblioteca se puede utilizar para realizar LDA en Python. Eche un vistazo al siguiente guión:

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 guión sobre el LinearDiscriminantAnalysis la clase se importa como LDA. Como PCA, tenemos que pasar el valor de la n_components parámetro de la LDA, que se refiere al número de discrimina lineales que queremos recuperar. En este caso configuramos el n_components a 1, ya que primero queremos verificar el desempeño de nuestro clasificador con un solo discriminante lineal. Finalmente ejecutamos el fit y transform métodos para recuperar realmente los discriminantes lineales.

Note, en el caso de LDA, el transform El método toma dos parámetros: el X_train y el y_train. Sin embargo, en el caso de PCA, el transform El método 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.

Entrenando y haciendo predicciones

Dado que queremos comparar el rendimiento de LDA con un discriminante lineal con el rendimiento de PCA con un componente principal, usaremos el mismo clasificador de bosque aleatorio que usamos para evaluar el rendimiento de los algoritmos reducidos de PCA.

Ejecute el siguiente código:

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)

Evaluación del 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:

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í:

[[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 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 manera irregular), se recomienda utilizar PCA ya que LDA puede estar sesgado hacia la clase mayoritaria.

Finalmente, es beneficioso que PCA se pueda aplicar tanto a datos etiquetados como 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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad