Qué es el LDA: Análisis Discriminante Lineal para el Aprendizaje Automático
Por Priyankur Sarkar
El Análisis Discriminante Lineal o LDA es una técnica de reducción de la dimensionalidad. Se utiliza como un paso de preprocesamiento en el Aprendizaje Automático y aplicaciones de clasificación de patrones. El objetivo de LDA es proyectar las características en un espacio de mayor dimensión en un espacio de menor dimensión con el fin de evitar la maldición de la dimensionalidad y también reducir los recursos y los costos dimensionales.La técnica original fue desarrollada en el año 1936 por Ronald A. Fisher y fue llamada Discriminante Lineal o Análisis Discriminante de Fisher. El Discriminante Lineal original fue descrito como una técnica de dos clases. La versión multiclase fue posteriormente generalizada por C.R Rao como Análisis Discriminante Múltiple. El LDA es una técnica de clasificación supervisada que se considera parte de la elaboración de modelos de aprendizaje automático competitivos. Esta categoría de reducción de la dimensionalidad se utiliza en áreas como el reconocimiento de imágenes y el análisis predictivo en marketing.¿Qué es la reducción de la dimensionalidad? Las técnicas de reducción de la dimensionalidad son importantes en aplicaciones de aprendizaje automático, minería de datos, bioinformática y recuperación de información. El objetivo principal es eliminar las características redundantes y dependientes cambiando el conjunto de datos a un espacio de menor dimensión. Los datos multidimensionales comprenden múltiples características que se correlacionan entre sí. La regresión logística es un algoritmo de clasificación lineal sencillo y potente. Sin embargo, tiene algunas desventajas que han dado lugar a algoritmos de clasificación alternativos como el LDA. Algunas de las limitaciones de la regresión logística son las siguientes: Problemas de dos clases: la regresión logística se utiliza tradicionalmente para problemas de clasificación binaria y de dos clases. Aunque puede extrapolarse y utilizarse en la clasificación multiclase, rara vez se hace. Por otro lado, el análisis discriminante lineal se considera una mejor opción cuando se requiere una clasificación multiclase y, en el caso de clasificaciones binarias, se aplican tanto la regresión logística como el LDA.Inestable con clases bien separadas – La regresión logística puede carecer de estabilidad cuando las clases están bien separadas. Aquí es donde entra el LDA.Inestable con pocos ejemplos – Si hay pocos ejemplos a partir de los cuales se van a estimar los parámetros, la regresión logística se vuelve inestable. Sin embargo, el Análisis Discriminante Lineal es una mejor opción porque tiende a ser estable incluso en esos casos.¿Cómo tener una aproximación práctica a un modelo LDA? Considere una situación en la que ha trazado la relación entre dos variables donde cada color representa una clase diferente. Si está dispuesto a reducir el número de dimensiones a 1, puede simplemente proyectar todo en el eje x, como se muestra a continuación: Este enfoque descuida cualquier información útil proporcionada por la segunda característica. Sin embargo, puede utilizar el LDA para trazarla. La ventaja del LDA es que utiliza la información de ambas características para crear un nuevo eje que, a su vez, minimiza la varianza y maximiza la distancia de clase de las dos variables. Esto se consigue en tres pasos:En primer lugar, hay que calcular la separabilidad entre clases, que es la distancia entre la media de las diferentes clases. En segundo lugar, hay que calcular la distancia entre la media y la muestra de cada clase. Por último, construya el espacio de dimensión inferior que maximiza la varianza entre clases y minimiza la varianza dentro de la clase. P se considera como la proyección del espacio de baja dimensión, también llamado criterio de Fisher.¿Cómo se representan los modelos LDA? La representación de LDA es bastante sencilla. El modelo consiste en las propiedades estadísticas de los datos que se han calculado para cada clase. Las mismas propiedades se calculan sobre la gaussiana multivariante en el caso de múltiples variables. Las multivariantes son las medias y la matriz de covariantes. Las predicciones se realizan introduciendo las propiedades estadísticas en la ecuación del LDA. Las propiedades se estiman a partir de los datos. Por último, los valores del modelo se guardan en un archivo para crear el modelo LDA.¿Cómo aprenden los modelos LDA? Las suposiciones que hace un modelo LDA sobre sus datos:Cada variable de los datos tiene la forma de una curva de campana cuando se traza, es decir, es gaussiana.Los valores de cada variable varían alrededor de la media en la misma cantidad en la media, es decir, cada atributo tiene la misma varianza.El modelo LDA es capaz de estimar la media y la varianza de sus datos para cada clase con la ayuda de estas suposiciones.El valor medio de cada entrada para cada una de las clases puede calcularse dividiendo la suma de valores por el número total de valores:Media =Suma(x)/Nkwhere Media = valor medio de x para la clase N = número de k = número de Suma(x) = suma de valores de cada entrada x.La varianza se calcula en todas las clases como la media del cuadrado de la diferencia de cada valor respecto a la media:Σ²=Suma((x – M)²)/(N – k)donde Σ² = Varianza en todas las entradas x. N = número de instancias. k = número de clases. Sum((x – M)²) = Suma de los valores de todos los (x – M)². M = media de la entrada x. ¿Cómo hace predicciones un modelo LDA? Los modelos LDA utilizan el Teorema de Bayes para estimar las probabilidades. Hacen predicciones basadas en la probabilidad de que un nuevo conjunto de datos de entrada pertenezca a cada clase. La clase que tiene la mayor probabilidad se considera la clase de salida y entonces el LDA hace una predicción. La predicción se realiza simplemente mediante el uso del Teorema de Bayes, que estima la probabilidad de la clase de salida dada la entrada. También hacen uso de la probabilidad de cada clase y la probabilidad de que los datos pertenezcan a cada clase:P(Y=x|X=x) = / Donde x = entrada. k = clase de salida. Plk = Nk/n o probabilidad base de cada clase observada en los datos de entrenamiento. También se denomina probabilidad a priori en el Teorema de Bayes. fk(x) = probabilidad estimada de que x pertenezca a la clase k.La f(x) se representa mediante una función de distribución gaussiana y luego se introduce en la ecuación anterior y el resultado que obtenemos es la ecuación siguiente:Dk(x) = x∗(media/Σ²) – (media²/(2*Σ²)) + ln(PIk)La Dk(x) se llama la función discriminante para la clase k dada la entrada x, la media, Σ² y Plk se estiman a partir de los datos y la clase se calcula como la que tiene el mayor valor, se considerará en la clasificación de salida. ¿Cómo preparar los datos de LDA? Algunas sugerencias que deberías tener en cuenta mientras preparas tus datos para construir tu modelo LDA:LDA se utiliza principalmente en problemas de clasificación donde tienes una variable de salida categórica. El modelo LDA estándar utiliza la distribución gaussiana de las variables de entrada. Debe comprobar las distribuciones univariantes de cada atributo y transformarlas en una distribución de aspecto más gaussiano. Por ejemplo, para la distribución exponencial, utilice la función log y root y para las distribuciones sesgadas utilice BoxCox.Los valores atípicos pueden sesgar los estadísticos primitivos utilizados para separar las clases en LDA, por lo que es preferible eliminarlos.Dado que LDA asume que cada variable de entrada tiene la misma varianza, siempre es mejor estandarizar sus datos antes de utilizar un modelo LDA. Mantenga la media en 0 y la desviación estándar en 1. ¿Cómo implementar un modelo LDA desde cero? Puede implementar un modelo de Análisis Discriminante Lineal desde cero usando Python. Empecemos por importar las librerías necesarias para el modelo:from sklearn.datasets import load_wineimport pandas as pdimport numpy as npnp.set_printoptions(precision=4)from matplotlib import pyplot as pltimport seaborn as snssns.set()from sklearn.preprocessing import LabelEncoderfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import confusion_matrixComo vamos a trabajar con el conjunto de datos de wine, puedes obtenerlo del repositorio de aprendizaje automático de la UCI. La biblioteca scikit-learn en Python proporciona una función envolvente para descargarlo:wine_info = load_wine()X = pd.DataFrame(wine_info.data, columns=wine_info.feature_names)y = pd.Categorical.from_codes(wine_info.target, wine_info.target_names)El conjunto de datos del vino consta de 178 filas de 13 columnas cada una:X.shape(178, 13)Los atributos del conjunto de datos del vino comprenden varias características como el contenido de alcohol del vino, el contenido de magnesio, la intensidad del color, el tono y muchas más:X.head()El conjunto de datos del vino contiene tres clases diferentes de vino:wine_info.target_names array(, dtype='<U7′)Ahora creamos un DataFrame que contendrá tanto las características como el contenido del conjunto de datos:df = X.join(pd.Series(y, name=’class’))Podemos dividir el proceso de Análisis Discriminante Lineal en 5 pasos como sigue:Paso 1 – Calcular las matrices de dispersión dentro de la clase y entre las clases.Paso 2 – Calcular los vectores propios y sus correspondientes valores propios para las matrices de dispersión.Paso 3 – Ordenar los valores propios y seleccionar los k más importantes.Paso 4 – Crear una nueva matriz que contenga los vectores propios asignados a los k valores propios.Paso 5 – Obtener nuevas características tomando el producto punto de los datos y la matriz del Paso 4.Matriz de dispersión dentro de la clasePara calcular la matriz de dispersión dentro de la clase, puede utilizar la siguiente expresión matemática:donde, c = número total de clases distintas ydonde, x = una muestra (es decir, una fila). n = número total de muestras dentro de una clase determinada.Ahora creamos un vector con los valores medios de cada característica:feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(‘class’):feature_means1 = rows.mean()feature_means1Los vectores medios (mi ) se introducen ahora en las ecuaciones anteriores para obtener la matriz de dispersión dentro de la clase:withinclass_scatter_matrix = np.zeros((13,13))for c, rows in df.groupby(‘class’):rows = rows.drop(, axis=1)s = np.zeros((13,13))for index, row in rows.iterrows():x, mc = row.values.reshape(13,1),feature_means1.values.reshape(13,1)s += (x – mc).dot((x – mc).T)withinclass_scatter_matrix += sMatriz de dispersión entre clasesPodemos calcular la matriz de dispersión entre clases utilizando la siguiente expresión matemática:where,andfeature_means2 = df.mean()betweenclass_scatter_matrix = np.zeros((13,13))for c in feature_means1: n = len(df.loc == c].index) mc, m = feature_means1.values.reshape(13,1), feature_means2.values.reshape(13,1)betweenclass_scatter_matrix += n * (mc – m).dot((mc – m).T)Ahora resolveremos el problema de valores propios generalizado para obtener los discriminantes lineales para:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Ordenaremos los eigenvalores de mayor a menor ya que los eigenvalores con los valores más altos son los que más información aportan sobre la distribución de los datos. A continuación, primero k vectores propios. Por último, colocaremos los valores propios en una matriz temporal para asegurarnos de que los valores propios se asignan a los mismos vectores propios una vez realizada la ordenación:eigen_pairs = ), eigen_vectors) for i in range(len(eigen_values))]eigen_pairs = sorted(eigen_pairs, key=lambda x: x, reverse=True)for pair in eigen_pairs:print(pair)237.4612319830225146.982859387586841.4317197551638386e-141.2141209883217706e-141.2141209883217706e-148.279823065850476e-157.105427357601002e-156.0293733655173466e-156.0293733655173466e-154.737608877108813e-154.737608877108813e-152.4737196789039026e-159.84629525010022e-16Ahora transformaremos los valores en porcentaje ya que es difícil entender qué parte de la varianza es explicada por cada componente.sum_of_eigen_values = sum(eigen_values)print(‘Explained Variance’)for i, pair in enumerate(eigen_pairs): print(‘Eigenvector {}: {}’.format(i, (par/suma_de_valores_propios).real))Varianza explicadaVariante propia 0: 0,8348256799387275Variante propia 1: 0,1651743200612724Variante propia 2: 5,033396012077518e-17Variante propia 3: 4.268399397827047e-17Eigenvector 4: 4,268399397827047e-17Eigenvector 5: 2,9108789097898625e-17Eigenvector 6: 2,498004906118145e-17Eigenvector 7: 2,119704204950956e-17Eigenvector 8: 2,119704204950956e-17Eigenvector 9: 1.665567688286435e-17Vector propio 10: 1,665567688286435e-17Vector propio 11: 8,696681541121664e-18Vector propio 12: 3,4615924706522496e-18En primer lugar, crearemos una nueva matriz W utilizando los dos primeros vectores propios:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1)).realA continuación, guardaremos el producto punto de X y W en una nueva matriz Y:Y = X∗Wdonde, X = n x d matriz con n muestra y d dimensiones. Y = n x k matriz con n muestra y k dimensiones.En términos simples, Y es la nueva matriz o el nuevo espacio de características.X_lda = np.array(X.dot(W_matrix))Nuestro siguiente trabajo es codificar cada clase un miembro con el fin de incorporar las etiquetas de clase en nuestro gráfico. Por último, trazamos los datos en función de los dos componentes del LDA utilizando un color diferente para cada clase: plt.xlabel(‘LDA1’)plt.ylabel(‘LDA2′)plt.scatter(X_lda,X_lda,c=y,cmap=’rainbow’,alpha=0.7,edgecolors=’b’)<matplotlib.collections.PathCollection at 0x7fd08a20e908>¿Cómo implementar el LDA con scikit-learn? También puedes obtenerlo del repositorio de aprendizaje automático de la UCI. Puedes utilizar la clase predefinida LinearDiscriminant Analysis que pone a nuestra disposición la librería scikit-learn para implementar el LDA en lugar de implementarlo desde cero cada vez:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Para obtener la varianza correspondiente a cada componente, puedes acceder a la siguiente propiedad:lda.explained_variance_ratio_array()De nuevo, trazaremos los dos componentes del LDA igual que hicimos antes:plt.xlabel(‘LDA1’)plt.ylabel(‘LDA2′)plt.scatter(X_lda,X_lda, c=y,cmap=’rainbow’, alpha=0.7,edgecolors=’b’)<matplotlib.collections.PathCollection at 0x7fd089f60358>Análisis discriminante lineal frente a PCABa continuación se exponen las diferencias entre LDA y PCA:PCA ignora las etiquetas de clase y se centra en encontrar los componentes principales que maximizan la varianza en unos datos determinados. Por lo tanto, es un algoritmo no supervisado. Por otro lado, el LDA es un algoritmo supervisado que pretende encontrar los discriminantes lineales que representan aquellos ejes que maximizan la separación entre las diferentes clases.El LDA realiza mejor las tareas de clasificación multiclase que el PCA. Sin embargo, el PCA funciona mejor cuando el tamaño de la muestra es comparativamente pequeño. Un ejemplo sería la comparación entre las precisiones de clasificación que se utilizan en la clasificación de imágenes.Tanto LDA como PCA se utilizan en el caso de la reducción de la dimensionalidad. Vamos a crear y ajustar una instancia de la clase PCA:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)De nuevo, para ver los valores en porcentaje para una mejor comprensión, accederemos a la propiedad explained_variance_ratio_:pca.explained_variance_ratio_array()Claramente, PCA seleccionó los componentes que podrán retener la mayor cantidad de información e ignora los que maximizan la separación entre clases.plt.xlabel(‘PCA1’)plt.ylabel(‘PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bAhora, para crear un modelo de clasificación utilizando los componentes LDA como características, dividiremos los datos en conjuntos de datos de entrenamiento y conjuntos de datos de prueba:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Lo siguiente que haremos será crear un árbol de decisión. A continuación, predeciremos la categoría de cada prueba de muestra y crearemos una matriz de confusión para evaluar el rendimiento del modelo LDA:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predecir(X_prueba)matriz_de_confusión(y_prueba, y_pred)array(, , ])Por lo tanto, está claro que el clasificador de árbol de decisiones ha clasificado correctamente todo el conjunto de datos de prueba.¿Cuáles son las extensiones de LDA? LDA se considera un método muy simple y eficaz, especialmente para las técnicas de clasificación. Dado que es simple y bien entendido, tiene muchas extensiones y variaciones: Análisis discriminante cuadrático (QDA) – Cuando hay múltiples variables de entrada, cada clase utiliza su propia estimación de varianza y covarianza.Análisis discriminante regularizado (RDA): modera la influencia de diversas variables en el LDA mediante la regularización de la estimación de la covarianza.Aplicaciones reales del LDA Algunas de las aplicaciones prácticas del LDA se enumeran a continuación:Reconocimiento facial: el LDA se utiliza en el reconocimiento facial para reducir el número de atributos a un número más manejable antes de la clasificación real. Las dimensiones que se generan son una combinación lineal de píxeles que forman una plantilla. Se denominan caras de Fisher.Médico – Se puede utilizar LDA para clasificar la enfermedad del paciente como leve, moderada o grave. La clasificación se realiza en función de los distintos parámetros del paciente y de su trayectoria médica. Identificación de clientes – Se pueden obtener las características de los clientes realizando una simple encuesta de preguntas y respuestas. LDA ayuda a identificar y seleccionar lo que describe las propiedades de un grupo de clientes que tienen más probabilidades de comprar un artículo concreto en un centro comercial. ResumenVeamos los temas que hemos tratado en este artículo: Reducción de dimensionalidad y necesidad de LDA Funcionamiento de un modelo LDA Representación, aprendizaje, predicción y preparación de datos en LDA Implementación de un modelo LDA Implementación de LDA usando scikit-learn LDA vs PCA Extensiones y aplicaciones de LDA El Análisis Discriminante Lineal en Python es un enfoque muy simple y bien entendido de clasificación en el aprendizaje automático. Aunque hay otras técnicas de reducción de la dimensionalidad como la Regresión Logística o el PCA, pero LDA es preferido en muchos casos especiales de clasificación. Si quieres ser un experto en aprendizaje automático, el conocimiento del Análisis Discriminante Lineal te llevará a esa posición sin esfuerzo. Inscríbase en nuestros cursos de ciencia de datos y aprendizaje automático para obtener más opciones de carrera lucrativas en este panorama y conviértase en un científico de datos certificado.