Linear Discriminant Analysis

Linear Discriminant Analysis

El análisis discriminante es una técnica predictiva de clasificación ad hoc y se denomina así por que se conocen previamente los grupos o clases antes de realizar la clasificación, que a diferencia de los árboles de decisión (post hoc) donde los grupos de clasificación se derivan de la ejecución de la técnica misma sin conocerse previamente.

Siquieres verlo en video:

Es una técnica ideal para construir un modelo predictivo y pronosticar al grupo o clase a la que pertenece una observación a partir de determinadas características que delimitan su perfil.

Como su nombre lo indica, el análisis discriminante ayuda a identificar las características que diferencian (discriminan) a dos o más grupos y a crear una función capaz de distinguir con la mayor precisión posible a los miembros de un grupo u otro.

Por otro lado, LDA tambiés es un método de reducción de dimensión, dado que tomando n variables independientes del conjunto de datos, el método estrae p <= n nuevas variables independientes que más contribuyen a la separación de clases de la variable dependiente.

la interpretación de las diferencias entre grupos consiste en determinar:

  • En qué medida un conjunto de características permite extraer dimensiones que diferencian a los grupos y
  • Cuáles de estas características son las que en mayor medida contribuyen a tales dimensiones, es decir, cuáles presentan el mayor poder de discriminación.

En resumen, podemos decir que el Análisis Discriminante Lineal – LDA tiene las siguientes aplicaciones:

  • Es muy utilizado como técnica de reducción de la dimensión
  • Es utilizado como un paso en el pre-procesamiento de datos para la clasificación de patrones
  • Tiene el objetivo de proyectar un conjunto de datos en un espacio de menor dimensión

El objetivo del LDA es proyectar el espacio de una característica (conjunto de datos de n dimensiones) en un subespacio pequeño k donde k <= n – 1, manteniendo la información discriminatoria de clases.

Tanto PCA (Análisis del Componente Principal) y el LDA (Análisis Discriminante Lineal) son técnicas lineales de transformación utilizadas para la reducción de la dimensión, sin embargo, PCA es no supervisado y LDA es supervisado dada su relación con la variable dependiente.

fuente: https://sebastianraschka.com/Articles/2014_python_lda.html

Los 5 pasos generales para el análisis discriminante lineal son:

  1. Calcular los vectores medios d-dimensionales para las diferentes clases del conjunto de datos.
  2. Calcular las matrices de dispersión (entre clases y dentro de las clases).
  3. Calcular los vectores propios (e1, e2, …ed) y sus correspondientes valores propios (l1, l2, …, ld) para las matrices de dispersión
  4. Ordenar los vectores propios de forma decreciente en relación a los valores propios y seleccionar lo k vectores propios con los valores propios más grandes para formar una matriz de dimensión d x k llamada W (donde cada columna representa un vector propio).
  5. Utilizar la matriz d x k de vectores propios para transformar las muestras en un nuevo sub espacio. Esta se puede sumarizar por la multiplicación de matrices Y = X x W (donde X es una matriz n x d que representa las n muestras y y es la transformada n x k de las muestras en el nuevo sub espacio).

Si el objetivo es reducir la dimensión de un conjunto de datos d-dimensional para proyectarlo en un sub espacio k-dimensional (donde k ˂ d), cómo saber que tamaño seleccionar para k (donde k es el número o la dimensión del nuevo sub espacio) y cómo saber si tenemos un sub espacio que representa correctamente los datos.

Calcular los vectores propios para el conjunto de datos y concentrarlos para formar las matrices de dispersión, donde cada uno de estos vectores está asociado a un valor propio el cual nos indica el tamaño o magnitud de los vectores.

Si se observa que todos los valores propios tiene magnitudes similares, entonces esto es un buen indicador de que los datos ya están proyectados a un buen sub espacio.

Pero, si alguno de los valores propios es mucho más grande que otros, lo que interesa es mantener solo aquellos vectores que tengan los valores propios más grandes, dado que ellos contiene más información relacionada con la distribución de los datos. Los valores que estén más cercarnos a cero son menos informativos y no deben tomarse para la creación del nuevo sub espacio.

Implementación de LDA con Python

Para el ejercicio con python vamos a considerar un conjunto de datos con características de tres categorías de vinos. Las características están conformadas con 13 variables que van desde el grado de alcohol, la acidez, el aroma, etc. Para conformar tres segmentos de clientes que representan las clases o grupos. En total se tiene 179 registro o muestras.

AlcoholMalic AcidAshAsh AlcanityMagnesiumTotal PhenolsFlavanoidsNonflavanoid PhenolsProanthocyaninsColor_IntensityHueOD280ProlineCustomer Segment
14.231.712.4315.61272.83.060.282.295.641.043.9210651
13.21.782.1411.21002.652.760.261.284.381.053.410501
13.162.362.6718.61012.83.240.32.815.681.033.1711851
14.371.952.516.81133.853.490.242.187.80.863.4514801
13.242.592.87211182.82.690.391.824.321.042.937351
14.21.762.4515.21123.273.390.341.976.751.052.8514501
14.391.872.4514.6962.52.520.31.985.251.023.5812901
14.062.152.6117.61212.62.510.311.255.051.063.5812951
14.831.642.1714972.82.980.291.985.21.082.8510451
13.861.352.2716982.983.150.221.857.221.013.5510451
14.12.162.3181052.953.320.222.385.751.253.1715101
14.121.482.3216.8952.22.430.261.5751.172.8212801
13.751.732.4116892.62.760.291.815.61.152.913201
14.751.732.3911.4913.13.690.432.815.41.252.7311501

Para iniciar con el modelo, cargamos el archivo con los datos y separamos en X la variable independiente las columnas 1 a 13 y en Y la variable dependiente la columna 14 con la segmentación de clientes.

# LDA

# Importacion de librerias
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importacion del dataset
dataset = pd.read_csv('Vinos.csv')
X = dataset.iloc[:, 0:13].values
y = dataset.iloc[:, 13].values

Dividimos el conjunto de datos en conjunto de entrenamiento y conjunto de pruebas para entrenar al modelo LDA, posteriormente hacemos un ajuste de escalas y creamos el modelo LDA para reducir la dimensión a 2 variables.

Para probar que con 2 de 13 variables podemos hacer una predicción o clasificación de los 3 grupos de vinos, utilizamos la regresión logística y checamos la matriz de confusión

Untitled
In [1]:
# Importacion de librerias
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
In [3]:
# Importacion del dataset
dataset = pd.read_csv('Vinos.csv')
X = dataset.iloc[:, 0:13].values
y = dataset.iloc[:, 13].values
In [4]:
# Dividivmos el conjunto de datos en muestra de entrenamiento y 
# muestra de prueba
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)
In [5]:
# Ajuste de Escalas
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
In [6]:
# Aplicando LDA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
lda = LDA(n_components = 2)
X_train = lda.fit_transform(X_train, y_train)
X_test = lda.transform(X_test)
In [7]:
# Comprobamos las variables independientes resultantes con 
# una regresion Logistica para determinar que con solo dos
# variables obtenemos la predicción adecuada
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(X_train, y_train)
Out[7]:
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
          penalty='l2', random_state=0, solver='liblinear', tol=0.0001,
          verbose=0, warm_start=False)
In [8]:
# Prediccion del conjunto de prueba para 
# comprar los resultados
y_pred = classifier.predict(X_test)
In [9]:
# Creamos la matriz de confusion
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
In [10]:
# Visualizacion de los datos de entrenamiento
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green', 'blue')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green', 'blue'))(i), label = j)
plt.title('Regresion Logistica (Conjunto de Entrenamiento)')
plt.xlabel('LD1')
plt.ylabel('LD2')
plt.legend()
plt.show()
In [11]:
# Visualizacion de los resultados de prueba
from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green', 'blue')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green', 'blue'))(i), label = j)
plt.title('Regresion Logistica (Conjunto de Prueba)')
plt.xlabel('LD1')
plt.ylabel('LD2')
plt.legend()
plt.show()

Observamos que la matriz de confusión para la predicción del grupo con la regresión logística para las nuevas variables con la dimensión reducida es muy acertada y no existen errores

Matriz de confusión

0 0 votes
Article Rating
Subscribe
Notify of
guest
2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
juan
juan
4 years ago

hola hola, muy buena tu explicación, yo estoy haciendo un ejercicio usando scikit learn pero los datos que estoy usando solo son dos variables con 4 clases y usar el algoritmo de analisis lineal discriminante, podrías ayudarme?

2
0
Would love your thoughts, please comment.x
()
x

JacobSoft

Recibe notificaciones de los nuevos artículos y tutoriales cada vez que se incorpore uno nuevo

Gracias, te has suscrito al blog y al newsletter

There was an error while trying to send your request. Please try again.

JacobSoft utilizará la información que proporcionas para estar encontacto contigo y enviarte actualizaciones.