Qu’est-ce que LDA : Linear Discriminant Analysis for Machine Learning
By Priyankur Sarkar
L’analyse discriminante linéaire ou LDA est une technique de réduction de la dimensionnalité. Elle est utilisée comme une étape de prétraitement dans l’apprentissage automatique et les applications de classification de modèles. L’objectif de la LDA est de projeter les caractéristiques d’un espace de dimension supérieure sur un espace de dimension inférieure afin d’éviter la malédiction de la dimension et de réduire les ressources et les coûts liés à la dimension.La technique originale a été développée en 1936 par Ronald A. Fisher et a été nommée analyse discriminante linéaire ou analyse discriminante de Fisher. La technique originale de discrimination linéaire était décrite comme une technique à deux classes. La version multi-classes a ensuite été généralisée par C.R Rao sous le nom d’analyse discriminante multiple. Elles sont toutes simplement désignées sous le nom d’analyse discriminante linéaire.LDA est une technique de classification supervisée qui est considérée comme faisant partie de l’élaboration de modèles d’apprentissage automatique compétitifs. Cette catégorie de réduction de la dimensionnalité est utilisée dans des domaines tels que la reconnaissance d’images et l’analyse prédictive en marketing.Qu’est-ce que la réduction de la dimensionnalité ? Les techniques de réduction de la dimensionnalité sont importantes dans les applications d’apprentissage automatique, d’extraction de données, de bioinformatique et de recherche d’informations. En termes simples, elles réduisent les dimensions (c’est-à-dire les variables) dans un ensemble de données particulier tout en conservant la plupart des données.Les données multidimensionnelles comprennent plusieurs caractéristiques ayant une corrélation entre elles. La réduction de la dimensionnalité permet de représenter des données multidimensionnelles en seulement 2 ou 3 dimensions. La réduction de la dimensionnalité permet de présenter les données d’une manière explicite qui peut être facilement comprise par un profane.Quelles sont les limites de la régression logistique ? La régression logistique est un algorithme de classification linéaire simple et puissant. Cependant, il présente certains inconvénients qui ont conduit à l’utilisation d’autres algorithmes de classification comme le LDA. Certaines des limites de la régression logistique sont les suivantes :Problèmes à deux classes – La régression logistique est traditionnellement utilisée pour les problèmes de classification à deux classes et binaires. Bien qu’elle puisse être extrapolée et utilisée dans la classification multi-classes, cette opération est rarement réalisée. D’autre part, l’analyse linéaire discriminante est considérée comme un meilleur choix lorsque la classification multi-classes est requise et, dans le cas de classifications binaires, la régression logistique et la LDA sont appliquées.instable avec des classes bien séparées – la régression logistique peut manquer de stabilité lorsque les classes sont bien séparées. C’est là que la LDA intervient.Instable avec peu d’exemples – S’il y a peu d’exemples à partir desquels les paramètres doivent être estimés, la régression logistique devient instable. Cependant, l’analyse discriminante linéaire est une meilleure option car elle tend à être stable même dans de tels cas.Comment avoir une approche pratique d’un modèle LDA ? Considérez une situation où vous avez tracé la relation entre deux variables où chaque couleur représente une classe différente. Si vous êtes prêt à réduire le nombre de dimensions à 1, vous pouvez simplement tout projeter sur l’axe des x comme indiqué ci-dessous : Cette approche néglige toute information utile fournie par la deuxième caractéristique. Cependant, vous pouvez utiliser LDA pour la tracer. L’avantage du LDA est qu’il utilise les informations des deux caractéristiques pour créer un nouvel axe qui, à son tour, minimise la variance et maximise la distance de classe des deux variables.Comment fonctionne le LDA ? Le LDA se concentre principalement sur la projection des caractéristiques dans un espace de dimension supérieure vers des dimensions inférieures. Vous pouvez y parvenir en trois étapes : tout d’abord, vous devez calculer la séparabilité entre les classes, c’est-à-dire la distance entre les moyennes des différentes classes. Deuxièmement, calculez la distance entre la moyenne et l’échantillon de chaque classe. Enfin, construisez l’espace de dimension inférieure qui maximise la variance interclasse et minimise la variance intraclasse. P est considéré comme la projection de l’espace de dimension inférieure, également appelée critère de Fisher. Comment les modèles LDA sont-ils représentés ? La représentation de LDA est assez simple. Le modèle est constitué des propriétés statistiques de vos données qui ont été calculées pour chaque classe. Les mêmes propriétés sont calculées sur la gaussienne multivariée dans le cas de variables multiples. Les prédictions sont faites en fournissant les propriétés statistiques dans l’équation LDA. Les propriétés sont estimées à partir de vos données. Les prédictions sont faites en fournissant des propriétés statistiques dans l’équation LDA. Les propriétés sont estimées à partir de vos données. Enfin, les valeurs du modèle sont enregistrées dans un fichier pour créer le modèle LDA. Comment les modèles LDA apprennent-ils ? Les hypothèses faites par un modèle LDA sur vos données : Chaque variable dans les données a la forme d’une courbe en cloche lorsqu’elle est tracée, c’est-à-dire gaussienne.La valeur moyenne de chaque entrée pour chacune des classes peut être calculée en divisant la somme des valeurs par le nombre total de valeurs : Moyenne = Somme(x)/Nk où Moyenne = valeur moyenne de x pour la classe N = nombre de k = nombre de Somme(x) = somme des valeurs de chaque entrée x.La variance est calculée sur toutes les classes comme la moyenne du carré de la différence de chaque valeur par rapport à la moyenne:Σ²=Sum((x – M)²)/(N – k)où Σ² = Variance sur toutes les entrées x. N = nombre d’instances. k = nombre de classes. Sum((x – M)²) = Somme des valeurs de tous les (x – M)². M = moyenne pour l’entrée x. Comment un modèle LDA fait-il des prédictions ? Les modèles LDA utilisent le théorème de Bayes pour estimer les probabilités. Ils font des prédictions basées sur la probabilité qu’un nouvel ensemble de données d’entrée appartienne à chaque classe. La classe qui a la probabilité la plus élevée est considérée comme la classe de sortie, puis le LDA fait une prédiction. La prédiction est faite simplement par l’utilisation du théorème de Bayes qui estime la probabilité de la classe de sortie en fonction de l’entrée. Ils utilisent également la probabilité de chaque classe et la probabilité que les données appartiennent à chaque classe : P(Y=x|X=x) = / Où x = entrée. k = classe de sortie. Plk = Nk/n ou probabilité de base de chaque classe observée dans les données d’apprentissage. Elle est également appelée probabilité antérieure dans le théorème de Bayes. fk(x) = probabilité estimée de l’appartenance de x à la classe k.La f(x) est tracée à l’aide d’une fonction de distribution gaussienne, puis elle est insérée dans l’équation ci-dessus et le résultat que nous obtenons est l’équation suivante :Dk(x) = x∗(mean/Σ²) – (mean²/(2*Σ²)). + ln(PIk)La Dk(x) est appelée la fonction discriminante pour la classe k étant donné l’entrée x, la moyenne, Σ² et Plk sont tous estimés à partir des données et la classe est calculée comme ayant la plus grande valeur, sera considérée dans la classification de sortie. Comment préparer les données pour LDA ? Quelques suggestions à garder à l’esprit lors de la préparation de vos données pour construire votre modèle LDA : LDA est principalement utilisé dans les problèmes de classification où vous avez une variable de sortie catégorique. Il permet à la fois la classification binaire et la classification multi-classes. Le modèle LDA standard utilise la distribution gaussienne des variables d’entrée. Vous devez vérifier les distributions univariées de chaque attribut et les transformer en une distribution d’apparence plus gaussienne. Par exemple, pour la distribution exponentielle, utilisez la fonction logarithme et racine et pour les distributions asymétriques, utilisez BoxCox.Les valeurs aberrantes peuvent fausser les statistiques primitives utilisées pour séparer les classes dans LDA, il est donc préférable de les supprimer.Puisque LDA suppose que chaque variable d’entrée a la même variance, il est toujours préférable de normaliser vos données avant d’utiliser un modèle LDA. La moyenne doit être égale à 0 et l’écart type à 1. Comment implémenter un modèle LDA à partir de zéro ? Vous pouvez implémenter un modèle d’analyse linéaire discriminante à partir de zéro en utilisant Python. Commençons par importer les bibliothèques nécessaires au modèle : 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_matrixPuisque nous allons travailler avec le jeu de données du vin, vous pouvez l’obtenir à partir du dépôt d’apprentissage automatique de l’UCI. La bibliothèque scikit-learn en Python fournit une fonction d’enveloppe pour le télécharger :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)Le jeu de données sur le vin comprend 178 lignes de 13 colonnes chacune :X.shape(178, 13)Les attributs de l’ensemble de données sur le vin comprennent diverses caractéristiques telles que la teneur en alcool du vin, la teneur en magnésium, l’intensité de la couleur, la teinte et bien d’autres encore:X.head()L’ensemble de données sur le vin contient trois types de vin différents:wine_info.target_names array(, dtype='<U7′)Nous créons maintenant un DataFrame qui contiendra à la fois les caractéristiques et le contenu de l’ensemble de données:df = X.join(pd.Series(y, name=’class’))Nous pouvons diviser le processus d’analyse discriminante linéaire en 5 étapes comme suit :Étape 1 – Calcul des matrices de diffusion intra-classe et inter-classe.Étape 2 – Calcul des vecteurs propres et de leurs valeurs propres correspondantes pour les matrices de diffusion.Étape 3 – Tri des valeurs propres et sélection des k premières.Étape 4 – Création d’une nouvelle matrice qui contiendra les vecteurs propres mis en correspondance avec les k valeurs propres.Étape 5 – Obtention de nouvelles caractéristiques en prenant le produit scalaire des données et de la matrice de l’étape 4.Matrice de dispersion intra-classePour calculer la matrice de dispersion intra-classe, vous pouvez utiliser l’expression mathématique suivante :où, c = nombre total de classes distinctes etoù, x = un échantillon (c’est-à-dire une ligne). Nous créons maintenant un vecteur avec les valeurs moyennes de chaque caractéristique :feature_means1 = pd.DataFrame(columns=wine_info.target_names)for c, rows in df.groupby(‘class’):feature_means1 = rows.mean()feature_means1Les vecteurs moyens (mi ) sont maintenant insérés dans les équations ci-dessus pour obtenir la matrice de dispersion intra-classe :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 += sMatrice de diffusion entre classes Nous pouvons calculer la matrice de diffusion entre classes à l’aide de l’expression mathématique suivante :où,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)Nous allons maintenant résoudre le problème des valeurs propres généralisées pour obtenir les discriminants linéaires pour:eigen_values, eigen_vectors = np.linalg.eig(np.linalg.inv(withinclass_scatter_matrix).dot(betweenclass_scatter_matrix))Nous allons trier les valeurs propres de la plus haute à la plus basse puisque les valeurs propres avec les plus hautes valeurs portent le plus d’informations sur la distribution des données est fait. Ensuite, nous allons commencer par les vecteurs propres. Enfin, nous placerons les valeurs propres dans un tableau temporaire pour nous assurer que les valeurs propres correspondent aux mêmes vecteurs propres une fois le tri effectué : 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-16Nous allons maintenant transformer les valeurs en pourcentage car il est difficile de comprendre quelle part de la variance est expliquée par chaque composante.sum_of_eigen_values = sum(eigen_values)print(‘Explained Variance’)for i, pair in enumerate(eigen_pairs) : print(‘Eigenvector {} : {}’.format(i, (paire/somme_des_valeurs_eigen).real))Variance expliquéeVecteur propre 0 : 0.8348256799387275Vecteur propre 1 : 0.1651743200612724Vecteur propre 2 : 5.033396012077518e-17Vecteur propre 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-17Vecteur propre 10 : 1.665567688286435e-17Vecteur propre 11 : 8.696681541121664e-18Vecteur propre 12 : 3.4615924706522496e-18D’abord, nous allons créer une nouvelle matrice W en utilisant les deux premiers vecteurs propres:W_matrix = np.hstack((eigen_pairs.reshape(13,1), eigen_pairs.reshape(13,1))).realPuis, nous allons enregistrer le produit scalaire de X et W dans une nouvelle matrice Y:Y = X∗Woù, X = matrice n x d avec n échantillons et d dimensions. Y = matrice n x k avec n échantillons et k dimensions.en termes simples, Y est la nouvelle matrice ou le nouvel espace caractéristique.X_lda = np.array(X.dot(W_matrix))Notre prochain travail consiste à coder chaque classe en un membre afin d’incorporer les étiquettes de classe dans notre graphique. Enfin, nous traçons les données en fonction des deux composantes LDA en utilisant une couleur différente pour chaque 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>Comment implémenter LDA en utilisant scikit-learn ? Pour implémenter LDA en utilisant scikit-learn, travaillons avec le même jeu de données sur le vin. Vous pouvez également l’obtenir à partir du dépôt d’apprentissage machine de l’UCI. Vous pouvez utiliser la classe prédéfinie LinearDiscriminant Analysis mise à notre disposition par la bibliothèque scikit-learn pour implémenter LDA plutôt que de l’implémenter à chaque fois depuis le début :from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda_model = LinearDiscriminantAnalysis()X_lda = lda_model.fit_transform(X, y)Pour obtenir la variance correspondant à chaque composante, vous pouvez accéder à la propriété suivante :lda.explained_variance_ratio_array()A nouveau, nous allons tracer les deux composantes LDA comme nous l’avons fait précédemment: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 PCAVoici les différences entre LDA et PCA:PCA ignore les étiquettes de classe et se concentre sur la recherche des composantes principales qui maximisent la variance dans des données données. Il s’agit donc d’un algorithme non supervisé. D’autre part, LDA est un algorithme supervisé qui vise à trouver les discriminants linéaires qui représentent les axes qui maximisent la séparation entre les différentes classes.LDA effectue de meilleures tâches de classification multi-classes que PCA. Cependant, l’ACP est plus performante lorsque la taille de l’échantillon est relativement petite. LDA et PCA sont tous deux utilisés dans le cas de la réduction de la dimensionnalité. Créons et ajustons une instance de la classe PCA:from sklearn.decomposition import PCApca_class = PCA(n_components=2)X_pca = pca.fit_transform(X, y)Encore une fois, pour afficher les valeurs en pourcentage pour une meilleure compréhension, nous allons accéder à la propriété explained_variance_ratio_:pca.explained_variance_ratio_array()Clairement, l’ACP a sélectionné les composantes qui pourront retenir le plus d’informations et ignore celles qui maximisent la séparation entre les classes.plt.xlabel(‘PCA1’)plt.ylabel(‘PCA2′)plt.scatter( X_pca, X_pca, c=y, cmap=’rainbow’, alpha=0.7, edgecolors=’bPour créer un modèle de classification en utilisant les composants LDA comme caractéristiques, nous allons diviser les données en ensembles de données d’entraînement et en ensembles de données de test : X_train, X_test, y_train, y_test = train_test_split(X_lda, y, random_state=1)Nous allons ensuite créer un arbre de décision. Ensuite, nous allons prédire la catégorie de chaque échantillon de test et créer une matrice de confusion pour évaluer les performances du modèle LDA : data = DecisionTreeClassifier()data.fit(X_train, y_train)y_pred = data.predict(X_test)confusion_matrix(y_test, y_pred)array(, , ])Il est donc clair que le Decision TreeClassifier a correctement classé tous les éléments de l’ensemble de données de test.Quelles sont les extensions de LDA ? LDA est considéré comme une méthode très simple et efficace, en particulier pour les techniques de classification. Puisqu’elle est simple et bien comprise, elle a beaucoup d’extensions et de variations : l’analyse discriminante quadratique (QDA) – Lorsqu’il y a plusieurs variables d’entrée, chacune des classes utilise sa propre estimation de la variance et de la covariance. l’analyse discriminante flexible (FDA) – Cette technique est réalisée lorsqu’une combinaison non linéaire des entrées est utilisée comme splines.L’analyse discriminante régularisée (RDA) – Elle modère l’influence de diverses variables dans la LDA en régularisant l’estimation de la covariance.Applications réelles de la LDAS Certaines des applications pratiques de la LDA sont énumérées ci-dessous :Reconnaissance des visages – La LDA est utilisée dans la reconnaissance des visages pour réduire le nombre d’attributs à un nombre plus gérable avant la classification proprement dite. Les dimensions qui sont générées sont une combinaison linéaire de pixels qui forme un modèle. On les appelle les visages de Fisher. Médical – Vous pouvez utiliser LDA pour classer la maladie du patient comme légère, modérée ou grave. La classification se fait sur la base des différents paramètres du patient et de sa trajectoire médicale. Identification des clients – Vous pouvez obtenir les caractéristiques des clients en réalisant une simple enquête par questions et réponses. Le LDA permet d’identifier et de sélectionner les caractéristiques d’un groupe de clients les plus susceptibles d’acheter un article particulier dans un centre commercial. RésuméPassons en revue les sujets que nous avons abordés dans cet article : Réduction de la dimensionnalité et besoin de LDA Fonctionnement d’un modèle LDA Représentation, apprentissage, prédiction et préparation des données dans LDA Mise en œuvre d’un modèle LDA Mise en œuvre de LDA à l’aide de scikit-learn LDA vs PCA Extensions et applications de LDA L’analyse discriminante linéaire en Python est une approche très simple et bien comprise de la classification en apprentissage automatique. Bien qu’il existe d’autres techniques de réduction de la dimensionnalité comme la régression logistique ou l’ACP, la LDA est préférée dans de nombreux cas de classification particuliers. Si vous souhaitez devenir un expert en apprentissage automatique, la connaissance de l’analyse discriminante linéaire vous mènera à cette position sans effort. Inscrivez-vous à nos cours de science des données et d’apprentissage automatique pour des options de carrière plus lucratives dans ce paysage et devenez un scientifique de données certifié.