Implementando 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 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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *