onde X é uma matriz n×d com n amostras e d dimensões, e Y é uma matriz n×k com n amostras e k ( k<n) dimensões. Em outras palavras, Y é composto pelos componentes LDA, ou dito de outra forma, o novo espaço de características.
X_lda = np.array(X.dot(w_matrix))
matplotlib
não pode lidar diretamente com variáveis categóricas. Assim, codificamos cada classe como um número para que possamos incorporar as etiquetas de classe em nosso gráfico.
le = LabelEncoder()y = le.fit_transform(df)
Então, plotamos os dados como uma função dos dois componentes LDA e usamos uma cor diferente para cada classe.
plt.xlabel('LD1')
plt.ylabel('LD2')plt.scatter(
X_lda,
X_lda,
c=y,
cmap='rainbow',
alpha=0.7,
edgecolors='b'
)
Reino do que implementar o algoritmo de Análise Discriminatória Linear a partir do zero, podemos usar a classe predefinida LinearDiscriminantAnalysis
classe disponibilizada pela biblioteca scikit-learn
.
Possibilidade de acessar a seguinte propriedade para obter a variância explicada por cada componente.
lda.explained_variance_ratio_
Apenas como antes, plotamos os dois componentes LDA.
plt.xlabel('LD1')
plt.ylabel('LD2')plt.scatter(
X_lda,
X_lda,
c=y,
cmap='rainbow',
alpha=0.7,
edgecolors='b'
)
Próximo, vejamos como o LDA se compara à Análise de Componentes Principais ou PCA. Começamos criando e encaixando uma instância da classe PCA
classe.
from sklearn.decomposition import PCApca = PCA(n_components=2)X_pca = pca.fit_transform(X, y)
Podemos acessar a propriedade explained_variance_ratio_
para ver a porcentagem da variância explicada por cada componente.
pca.explained_variance_ratio_
Como podemos ver, o PCA selecionou os componentes que resultariam na maior dispersão (retém a maior quantidade de informação) e não necessariamente os que maximizam a separação entre classes.
plt.xlabel('PC1')
plt.ylabel('PC2')plt.scatter(
X_pca,
X_pca,
c=y,
cmap='rainbow',
alpha=0.7,
edgecolors='b'
)
Próximo, vamos ver se podemos criar um modelo para classificar o uso dos componentes LDA como características. Primeiro, dividimos os dados em conjuntos de treinamento e testes.
X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)
Então, construímos e treinamos uma Árvore de Decisão. Após prever a categoria de cada amostra no conjunto de teste, criamos uma matriz de confusão para avaliar o desempenho do modelo.
dt = DecisionTreeClassifier()dt.fit(X_train, y_train)y_pred = dt.predict(X_test)confusion_matrix(y_test, y_pred)
Como podemos ver, o classificador da Árvore de Decisão classificou corretamente tudo no conjunto de teste.