O que é LDA: Análise Discriminatória Linear para Aprendizagem Mecânica
Por Priyankur Sarkar
Análise Discriminatória Linear ou LDA é uma técnica de redução da dimensionalidade. É utilizada como uma etapa de pré-processamento na Aprendizagem de Máquina e aplicações de classificação de padrões. O objetivo do LDA é projetar as características em um espaço dimensional superior em um espaço dimensional inferior a fim de evitar a maldição da dimensionalidade e também reduzir recursos e custos dimensionais. A técnica original foi desenvolvida no ano de 1936 por Ronald A. Fisher e foi denominada Análise Discriminatória Linear ou Fisher’s Discriminant Analysis. A técnica original de Discriminação Linear foi descrita como uma técnica de duas classes. A versão multiclasse foi mais tarde generalizada por C.Rao como Análise de Discriminantes Múltiplos. Todos eles são simplesmente referidos como Análise Discriminatória Linear.LDA é uma técnica de classificação supervisionada que é considerada como parte de modelos de aprendizagem de máquinas competitivas. Esta categoria de redução de dimensionalidade é utilizada em áreas como reconhecimento de imagem e análise preditiva em marketing. O que é a Redução de Dimensionalidade? As técnicas de redução de dimensionalidade são importantes em aplicações de Machine Learning, Data Mining, Bioinformática e Recuperação de Informação. Em termos simples, elas reduzem as dimensões (ou seja, variáveis) em um determinado conjunto de dados, enquanto retêm a maioria dos dados. Você pode traçar dados multidimensionais em apenas 2 ou 3 dimensões com redução de dimensionalidade. Quais são as limitações da Regressão Logística? A Regressão Logística é um algoritmo de classificação linear simples e poderoso. No entanto, tem algumas desvantagens que têm levado a algoritmos de classificação alternativos como o LDA. Algumas das limitações da Regressão Logística são as seguintes:Problemas de duas classes – A Regressão Logística é tradicionalmente usada para problemas de classificação de duas classes e binários. Embora possa ser extrapolada e usada na classificação multiclasse, isso raramente é feito. Por outro lado, a Análise Discriminatória Linear é considerada uma melhor escolha sempre que a classificação multiclasse é necessária e, no caso das classificações binárias, tanto a regressão logística como a LDA são aplicadas. Instável com Classes Bem Separadas – A Regressão Logística pode não ter estabilidade quando as classes estão bem separadas. É aqui que entra o LDA.Unstable com poucos exemplos – Se há poucos exemplos de onde os parâmetros devem ser estimados, a regressão logística torna-se instável. No entanto, a Análise Linear Discriminatória é uma opção melhor porque tende a ser estável mesmo nesses casos. Como ter uma abordagem prática para um modelo LDA? Considere uma situação onde você traçou a relação entre duas variáveis onde cada cor representa uma classe diferente. Uma é mostrada com uma cor vermelha e a outra com azul. Se você estiver disposto a reduzir o número de dimensões para 1, você pode apenas projetar tudo para o eixo x, como mostrado abaixo: Esta abordagem negligencia qualquer informação útil fornecida pela segunda característica. No entanto, você pode usar LDA para plotá-la. A vantagem do LDA é que ele usa informações de ambas as características para criar um novo eixo que, por sua vez, minimiza a variância e maximiza a distância de classe das duas variáveis. Como funciona o LDA? O LDA se concentra principalmente em projetar as características em um espaço de dimensão superior para dimensões inferiores. Você pode conseguir isso em três passos: Primeiro, você precisa calcular a separabilidade entre as classes que é a distância entre a média das diferentes classes. Em segundo lugar, calcular a distância entre a média e a amostra de cada classe. Finalmente, construa o espaço inferior dimensional que maximiza a variância entre classes e minimiza a variância dentro da classe. P é considerado como a projeção do espaço de menor dimensão, também chamado de critério de Fisher. Como são representados os modelos LDA? A representação do LDA é bastante direta. O modelo consiste nas propriedades estatísticas dos seus dados que foram calculados para cada classe. As mesmas propriedades são calculadas sobre o Gaussiano multivariado no caso de múltiplas variáveis. As multivariadas são meios e matriz covariada. As previsões são feitas fornecendo as propriedades estatísticas na equação de LDA. As propriedades são estimadas a partir dos seus dados. Finalmente, os valores do modelo são salvos em arquivo para criar o modelo LDA. Como os modelos LDA aprendem? As suposições feitas por um modelo LDA sobre seus dados:Cada variável nos dados é moldada na forma de uma curva de sino quando plotada, ou seja, Gaussian. Os valores de cada variável variam em torno da média pelo mesmo valor na média, ou seja, cada atributo tem a mesma variância.O valor médio de cada input para cada uma das classes pode ser calculado dividindo a soma dos valores pelo número total de valores:Média =Soma(x)/Nkwhere Média = valor médio de x para a classe N = número de k = número de Soma(x) = soma dos valores de cada input x.A variância é computada em todas as classes como a média do quadrado da diferença de cada valor da média:Σ²=Soma((x – M)²)/(N – k)onde Σ² = Variância em todos os inputs x. N = número de instâncias. k = número de classes. Soma((x – M)²) = soma de valores de todos (x – M)². M = média para entrada x.Como um modelo LDA faz previsões? Os modelos LDA utilizam o Teorema de Bayes para estimar probabilidades. Eles fazem previsões com base na probabilidade de um novo conjunto de dados de entrada pertencer a cada classe. A classe que tem a probabilidade mais alta é considerada a classe de saída e, em seguida, o LDA faz uma previsão. A previsão é feita simplesmente pelo uso do Teorema de Bayes, que estima a probabilidade da classe de output dada a entrada. Eles também fazem uso da probabilidade de cada classe e da probabilidade dos dados pertencentes a cada classe:P(Y=x|X=x) = / Onde x = entrada. k = classe de saída. Plk = Nk/n ou probabilidade de base de cada classe observada nos dados de treinamento. Também é chamada probabilidade anterior no Teorema de Bayes. fk(x) = probabilidade estimada de x pertencente à classe k. A f(x) é plotada usando uma função de Distribuição Gaussiana e depois é plugada na equação acima e o resultado que obtemos é a seguinte equação:Dk(x) = x∗(mean/Σ²) – (mean²/(2*Σ²)) + ln(PIk)O Dk(x) é chamado de função discriminante para a classe k dada entrada x, média, Σ² e Plk são todos estimados a partir dos dados e a classe é calculada como tendo o maior valor, será considerada na classificação da saída. Como preparar dados de LDA?Algumas sugestões que você deve ter em mente enquanto prepara seus dados para construir seu modelo LDA:LDA é usado principalmente em problemas de classificação onde você tem uma variável de saída categórica. Ele permite tanto a classificação binária quanto a classificação multiclasse. O modelo padrão de LDA faz uso da Distribuição Gaussiana das variáveis de entrada. Você deve verificar as distribuições univariadas de cada atributo e transformá-las em uma distribuição mais parecida com a gaussiana. Por exemplo, para a distribuição exponencial, use a função log e raiz e para distribuições distorcidas use o BoxCox.Outliers pode distorcer as estatísticas primitivas usadas para separar classes em LDA, então é preferível removê-las. Como LDA assume que cada variável de entrada tem a mesma variância, é sempre melhor padronizar seus dados antes de usar um modelo LDA. Mantenha a média em 0 e o desvio padrão em 1. Como implementar um modelo LDA a partir do zero? Você pode implementar um modelo de Análise Discriminatória Linear a partir do zero usando Python. Vamos começar importando as bibliotecas que são necessárias para o 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_matrixSince we will work with the wine dataet, you can obtain it from the UCI machine learning repository. A biblioteca scikit-learn em Python fornece uma função de wrapper para baixá-lo: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)O conjunto de dados do wine é composto de 178 linhas de 13 colunas cada:X.shape(178, 13)Os atributos do conjunto de dados do vinho compreendem várias características tais como teor alcoólico do vinho, teor de magnésio, intensidade da cor, tonalidade e muito mais:X.head()O conjunto de dados do vinho contém três tipos diferentes de vinho:wine_info.target_names array(, dtype='<U7′)Agora criamos um DataFrame que conterá tanto as características como o conteúdo do conjunto de dados:df = X.join(pd.Series(y, name=’class’))Podemos dividir o processo de Análise Discriminatória Linear em 5 passos como segue:Passo 1 – Computando as matrizes de dispersão dentro da classe e entre classes.Passo 2 – Computando os vetores próprios e seus correspondentes valores próprios para as matrizes de dispersão.Passo 3 – Ordenando os valores próprios e selecionando o k superior.Etapa 4 – Criar uma nova matriz que conterá os auto-vectores mapeados para os k auto-valores.Etapa 5 – Obter novas características, tomando o produto de pontos dos dados e da matriz a partir da Etapa 4.Dentro da matriz de dispersão da classePara calcular a matriz de dispersão dentro da classe, você pode usar a seguinte expressão matemática: onde, c = número total de classes distintas e onde, x = uma amostra (ou seja, uma linha). n = número total de amostras dentro de uma determinada classe. Agora criamos um vector com os valores médios 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_means1Os vectores médios (mi ) estão agora ligados às equações acima para obter a matriz de dispersão dentro da classe:within class scatter matrix: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)dentro da classe_scatter_matrix += sBetween-class scatter matrixPodemos calcular a matriz de dispersão entre classes usando a seguinte expressão 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)Agora vamos resolver o problema do autovalor generalizado para obter os discriminantes lineares para:autovalores, autovectores = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Vamos ordenar os autovalores do mais alto para o mais baixo já que os autovalores com os valores mais altos carregam a maior quantidade de informação sobre a distribuição dos dados é feita. A seguir, vamos primeiro os k eigenvectores. Finalmente, vamos colocar os autovalores em um array temporário para ter certeza que os autovalores mapeiem para os mesmos autovetores após a ordenação ser feita:auto_pares = ), auto_vetores) para i no intervalo(len(auto_valores))]auto-pares = ordenados(auto_pares, chave=lambda x: x, reverse=True)para par em auto_pares:print(par)237.4612319830225146.982859387586841.4317197551638386e-141.2141209883217706e-141.2141209883217706e-148.279823065850476e-157.105427357601002e-156.0293733655173466e-156.0293733655173466e-154.737608877108813e-154.737608877108813e-152.4737196789039026e-159.84629525010022e-16Agora vamos transformar os valores em percentagem uma vez que é difícil entender quanto da variância é explicada por cada componente.sum_of_eigen_values = sum(eigen_values)print(‘Variância Explicada’)para i, par em enumerate(eigen_pairs): print(‘Eigenvector {}: {}’.format(i, (par/soma_de_valores_próprios).real))Variância ExplicadaEigenvector 0: 0,8348256799387275Eigenvector 1: 0,1651743200612724Eigenvector 2: 5,033396012077518e-17Eigenvector 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.66556767688286435e-17Eigenvector 10: 1.665567688286435e-17Eigenvector 11: 8.696681541121664e-18Eigenvector 12: 3.4615924706522496e-18First, vamos criar uma nova matriz W usando os dois primeiros eigenvectores:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realNext, vamos salvar o produto de pontos de X e W em uma nova matriz Y:Y = X∗Wwhere, X = n x d matriz com n amostra e d dimensões. Y = n x k matrix com n sample e k dimensões. Em termos simples, Y é a nova matriz ou o novo espaço de recursos.X_lda = np.array(X.dot(W_matrix))Nosso próximo trabalho é codificar cada classe de um membro para incorporar as etiquetas de classe em nosso gráfico. Finalmente, plotamos os dados como uma função dos dois componentes LDA usando cores diferentes para cada classe: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>Como implementar LDA usando scikit-learn? Para implementar LDA usando scikit-learn, vamos trabalhar com o mesmo conjunto de dados do vinho. Você também pode obtê-lo a partir do repositório de aprendizagem da máquina UCI. Você pode usar a classe predefinida LinearDiscriminant Analysis disponibilizada pela biblioteca scikit-learn para implementar LDA ao invés de implementar do zero toda vez:from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Para obter a variância correspondente a cada componente, você pode acessar a seguinte propriedade:lda.explained_variance_ratio_array()Mais uma vez, vamos plotar os dois componentes LDA tal como fizemos 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>Linear Discriminant Analysis vs PCABelow são as diferenças entre LDA e PCA:PCA ignora rótulos de classe e concentra-se em encontrar os componentes principais que maximizam a variância em um dado determinado. Portanto, é um algoritmo não supervisionado. Por outro lado, o LDA é um algoritmo supervisionado que pretende encontrar os discriminantes lineares que representam aqueles eixos que maximizam a separação entre diferentes classes. O LDA realiza melhores tarefas de classificação multiclasse do que o PCA. No entanto, o PCA tem um melhor desempenho quando o tamanho da amostra é comparativamente pequeno. Um exemplo seria a comparação entre as precisões de classificação que são usadas na classificação de imagens. Tanto o LDA como o PCA são usados em caso de redução da dimensionalidade. O PCA é primeiro seguido pelo LDA. Vamos criar e ajustar uma instância da classe PCA:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Novamente, para ver os valores em porcentagem para uma melhor compreensão, vamos acessar a propriedade explained_variance_ratio_ property:pca.explained_variance_ratio_array()Claramente, o PCA selecionou os componentes que serão capazes de reter a maior parte da informação e ignora os que maximizam a separação entre classes.plt.xlabel(‘PCA1’)plt.ylabel(‘PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bNow to create a classification model using the LDA components as features, we will divide the dataets into training dataets and testing dataets:X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)A próxima coisa que faremos é criar uma árvore de decisão. Em seguida, vamos prever a categoria de cada teste de amostra e criar uma matriz de confusão para avaliar o desempenho do modelo LDA:data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Então é claro que o Decision Tree Classifier classificou corretamente tudo no conjunto de dados do teste. Quais são as extensões do LDA?LDA é considerado um método muito simples e eficaz, especialmente para técnicas de classificação. Como é simples e bem compreendido, por isso tem muitas extensões e variações:Análise Discriminatória Quadrática(QDA) – Quando há múltiplas variáveis de entrada, cada classe usa sua própria estimativa de variância e covariância.Análise Discriminatória Flexível(FDA) – Esta técnica é realizada quando uma combinação não linear de entradas é usada como splines.Análise Discriminatória Regularizada(RDA) – Modera a influência de várias variáveis no LDA através da regularização da estimativa da covariância. Aplicações reais do LDASome das aplicações práticas do LDA são listadas abaixo:Reconhecimento de Face – O LDA é usado no reconhecimento de face para reduzir o número de atributos para um número mais manejável antes da classificação real. As dimensões que são geradas são uma combinação linear de pixels que forma um modelo. Estes são chamados Fisher’s faces.Medical – Você pode usar o LDA para classificar a doença do paciente como leve, moderada ou grave. A classificação é feita sobre os vários parâmetros do paciente e sua trajetória médica. Identificação do cliente – Você pode obter as características dos clientes através de uma simples pesquisa de perguntas e respostas. A LDA ajuda na identificação e selecção que descreve as propriedades de um grupo de clientes que têm maior probabilidade de comprar um determinado artigo num centro comercial. ResumoDeixe-nos dar uma vista de olhos aos tópicos que abordámos neste artigo: Redução da Dimensionalidade e necessidade de LDA Trabalho de um modelo LDA Representação, Aprendizagem, Previsão e preparação de dados em LDA Implementação de um modelo LDA Implementação de um modelo LDA usando LDA Scikit-learn versus Extensões e Aplicações de LDA A Análise Linear Discriminatória em Python é uma abordagem muito simples e bem compreendida de classificação na aprendizagem de máquinas. Embora existam outras técnicas de redução de dimensionalidade como Regressão Logística ou PCA, mas a LDA é preferida em muitos casos especiais de classificação. Se você quer ser um especialista em aprendizagem de máquinas, o conhecimento da Análise Discriminatória Linear o levaria a essa posição sem esforço. Inscreva-se em nossos cursos de Data Science e Machine Learning para opções de carreira mais lucrativas neste cenário e torne-se um Data Scientist certificado.