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?
Contenido
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.
Te puede interesar:Accediendo a la API de Twitter con PythonA 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:
Te puede interesar:Crear y eliminar directorios con Pythonhttps://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:
Te puede interesar:Mejora de Python con extensiones de C personalizadasX = 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:
Te puede interesar:Introducción a las redes neuronales con Scikit-Learnfrom 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:
Te puede interesar:Tutorial de red neuronal de TensorFlowfrom 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.