Une introduction douce à l’analyse des composants principaux (PCA) à Python



Image de l’auteur | Idéogramme
Analyse des composants principaux (PCA) est l’une des techniques les plus populaires pour réduire la dimensionnalité des données de haute dimension. Il s’agit d’un processus de transformation des données important dans divers scénarios et industries du monde réel comme le traitement d’image, la finance, la génétique et les applications d’apprentissage automatique où les données contiennent de nombreuses fonctionnalités qui doivent être analysées plus efficacement.
Les raisons de l’importance des techniques de réduction de la dimensionnalité comme l’ACP sont multiples, dont trois se démarquant:
- Efficacité: La réduction du nombre de fonctionnalités dans vos données signifie une réduction du coût de calcul des processus à forte intensité de données comme la formation de modèles d’apprentissage automatique avancées.
- Interprétabilité: En projetant vos données dans un espace de faible dimension, tout en gardant ses modèles et propriétés clés, il est plus facile d’interpréter et de visualiser en 2D et 3D, contribuant parfois à obtenir un aperçu de sa visualisation.
- Réduction du bruit: Souvent, les données de haute dimension peuvent contenir des caractéristiques redondantes ou bruyantes qui, lorsqu’elles sont détectées par des méthodes comme l’ACP, peuvent être éliminées tout en préservant (ou même l’amélioration) de l’efficacité des analyses ultérieures.
J’espère que, à ce stade, je vous ai convaincu de la pertinence pratique de l’ACP lors de la gestion des données complexes. Si tel est le cas, continuez à lire, car nous commencerons à devenir pratiques en apprenant à utiliser PCA dans Python.
Comment appliquer l’analyse des composants principaux dans Python
Grâce à la prise en charge de bibliothèques comme Scikit-Learn qui contiennent des implémentations abstraites de l’algorithme PCA, l’utiliser sur vos données est relativement simple tant que les données sont numériques, précédemment prétraitées et exemptes de valeurs manquantes, les valeurs des fonctionnalités étant standardisées pour éviter les problèmes tels que la dominance de la variance. Ceci est particulièrement important, car l’ACP est une méthode profondément statistique qui s’appuie sur les variances de fonctionnalité pour déterminer principaux composants: Nouvelles fonctionnalités dérivées des autres et orthogonales les unes aux autres.
Nous commencerons notre exemple d’utilisation de PCA à partir de zéro dans Python en important les bibliothèques nécessaires, en chargeant l’ensemble de données MNIST des images à basse résolution des chiffres manuscrits et en les mettant dans un pandas dataframe:
import pandas as pd
from torchvision import datasets
mnist_data = datasets.MNIST(root="./data", train=True, download=True)
data = ()
for img, label in mnist_data:
img_array = list(img.getdata())
data.append((label) + img_array)
columns = ("label") + (f"pixel_{i}" for i in range(28*28))
mnist_data = pd.DataFrame(data, columns=columns)
Dans le Ensemble de données MNISTchaque instance est une image carrée 28×28, avec un total de 784 pixels, chacune contenant un code numérique associé à son niveau de gris, allant de 0 pour le noir (pas d’intensité) à 255 pour le blanc (intensité maximale). Ces données doivent d’abord être réorganisées en un tableau unidimensionnel – plutôt que bidimensionnel selon son arrangement de grille 28×28 d’origine. Ce processus appelé aplatissement a lieu dans le code ci-dessus, avec l’ensemble de données final au format DataFrame contenant un total de 785 variables: une pour chacun des 784 pixels plus l’étiquette, indiquant une valeur entière entre 0 et 9 le chiffre à l’origine écrit dans l’image.

Ensemble de données MNIST | Source: Tensorflow
Dans cet exemple, nous n’aurons pas besoin de l’étiquette – utile pour d’autres cas d’utilisation comme la classification de l’image – mais nous supposerons que nous devrons peut-être le garder à portée de main pour une analyse future, donc nous le séparerons des autres fonctionnalités associées aux pixels d’image dans une nouvelle variable: nous le séparerons:
X = mnist_data.drop('label', axis=1)
y = mnist_data.label
Bien que nous n’appliquerons pas de technique d’apprentissage supervisé après l’ACP, nous supposerons que nous devrons peut-être le faire dans les analyses futures, nous allons donc diviser l’ensemble de données en sous-ensembles de formation (80%) et de tests (20%). Il y a une autre raison pour laquelle nous faisons cela, permettez-moi de le clarifier un peu plus tard.
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=42)
Prétraitement des données Et le rendre adapté à l’algorithme PCA est aussi important que d’appliquer l’algorithme lui-même. Dans notre exemple, le prétraitement implique la mise à l’échelle des intensités de pixels d’origine dans l’ensemble de données MNIST à une plage standardisée avec une moyenne de 0 et un écart-type de 1 afin que toutes les fonctionnalités aient une contribution égale aux calculs de variance, en évitant les problèmes de dominance dans certaines caractéristiques. Pour ce faire, nous utiliserons la classe StandardsCaler de Sklearn.Preprocessing, qui standardise les fonctionnalités numériques:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
Remarquez l’utilisation de fit_transform
pour les données de formation, alors que pour les données de test que nous avons utilisées transform
plutôt. C’est l’autre raison pour laquelle nous avons précédemment divisé les données en données de formation et de test, pour avoir la possibilité d’en discuter: dans les transformations de données comme la normalisation des attributs numériques, les transformations à travers les ensembles de formation et de test doivent être cohérents. Le fit_transform
La méthode est utilisée sur les données de formation car elle calcule les statistiques nécessaires qui guideront le processus de transformation des données à partir de l’ensemble de formation (ajustement), puis applique la transformation. Pendant ce temps, la méthode de transformation est utilisée sur les données de test, qui applique la même transformation « apprise » des données de formation à l’ensemble de tests. Cela garantit que le modèle voit les données de test dans la même échelle cible que celle utilisée pour les données de formation, préservant la cohérence et évitant des problèmes tels que la fuite de données ou le biais.
Nous pouvons maintenant appliquer l’algorithme PCA. Dans l’implémentation de Scikit-Learn, PCA prend un argument important: n_components
. Cet hyperparamètre détermine la proportion de composants principaux à conserver. Des valeurs plus importantes de 1 signifient de conserver plus de composants et de capturer plus de variance dans les données d’origine, tandis que des valeurs plus faibles de 0 signifient gardant moins de composants et appliquant une stratégie de réduction de dimensionnalité plus agressive. Par exemple, définir n_components
à 0,95 implique de conserver suffisamment de composants pour capturer 95% de la variance des données d’origine, ce qui peut être approprié pour réduire la dimensionnalité des données tout en préservant la plupart de ses informations. Si après avoir appliqué ce paramètre, la dimensionnalité des données est considérablement réduite, cela signifie que de nombreuses caractéristiques d’origine ne contenaient pas beaucoup d’informations statistiquement pertinentes.
from sklearn.decomposition import PCA
pca = PCA(n_components = 0.95)
X_train_reduced = pca.fit_transform(X_train_scaled)
X_train_reduced.shape
En utilisant le shape
Attribut de l’ensemble de données résultant après application de l’ACP, nous pouvons voir que la dimensionnalité des données a été considérablement réduite de 784 fonctionnalités à seulement 325, tout en conservant 95% des informations importantes.
Est-ce un bon résultat? Répondre à cette question dépend en grande partie de l’application ou du type d’analyse ultérieure que vous souhaitez effectuer avec vos données réduites. Par exemple, si vous souhaitez construire un classificateur d’images d’images de chiffres, vous voudrez peut-être créer deux modèles de classification: un ensemble formé avec l’ensemble de données original et haute dimension et une formée avec l’ensemble de données réduit. S’il n’y a pas de perte significative de précision de classification dans votre deuxième classificateur, une bonne nouvelle: vous avez obtenu un classificateur plus rapide (la réduction de la dimensionnalité implique normalement une plus grande efficacité dans la formation et l’inférence), et des performances de classification similaires comme si vous utilisiez les données d’origine.
Emballage
Cet article illustré via un tutoriel Python étape par étape Comment appliquer l’algorithme PCA à partir de zéro, à partir d’un ensemble de données d’images de chiffres manuscrites avec une dimensionnalité élevée.
Iván Palomares Carrascosa est un leader, écrivain, conférencier et conseiller dans l’IA, l’apprentissage automatique, le Deep Learning & LLMS. Il entraîne et guide les autres à exploiter l’IA dans le monde réel.
Source link