PCA est une technique permettant de réduire les dimensions d’un ensemble de données, qui transforme les caractéristiques de l’ensemble de données de départ en un nouvel ensemble de caractéristiques appelées Principal Components (PCs).
Il ne s’agit pas d’une technique de sélection des caractéristiques, mais plutôt d’une technique de combinaison de caractéristiques. Chaque PC est une combinaison pondérée d’un ensemble de colonnes.
Exemple: On a un ensemble de données de différents logements, qui contient les caractéristiques “m²”, “# pièces”, “# salles de bain”, “ecoles alentour”, “taux de criminalité”.
On peut réduire le nombre de caractéristiques et garder le maximum d’informations en combinant les caractéristiques qui se ressemblent:
“m²”, “# pièces”, “# salles de bain” sont combinés en une caractéristique “Taille”,
et “ecoles alentour”, “taux de criminalité” sont combinés en une caractéristique “emplacement”
Il existe deux manières d’effectuer un PCA: décomposition en eigenvalues de la matrice de covariance (section 1) ou décomposition en valeurs singulières (section 2).
Normaliser les données.
Pour chaque caractéristique, soustraire leur moyenne — ça pour effet de déplacer l’origine au point 0.
Mettre également les données des différentes caractéristiques sur une échelle similaire — sinon, PCA sera biaisé vers les caractéristiques ayant un plus grand intervalle.
Pour ce faire, on divise généralement chaque caractéristique par son écart-type. Une caractéristique avec un large intervalle aura un grand écart-type, on divise donc par un grand nombre. Et inversemment, une caractéristique avec un petit intervalle aura un petit écart-type, on divise par un petit nombre.
On change les données mais ne change pas la position des points les uns par rapport aux autres.
Créer la matrice de covariance des caractéristiques
On peut considérer la matrice de covariance comme une transformation linéaire d’une matrice de rayon 1 vers une approximation de la matrice de données dont on dispose.
Calculer les eigenvalues et eigenvectors de la matrice de covariance.
Pour passer de la matrice de rayon 1 à la matrice de covariance, on a étiré le plan en deux directions:
On a étiré dans la direction [2 1] (2 unités vers la droite, 1 vers le haut) avec une magnitude de 11.
Et dans la direction [-1 2] (1 unité vers la gauche, 2 vers le haut) avec une magnitude de 1.
La direction des étirements sont donnés par les eigenvectors et la magnitude par les eigenvalues.
Notons que les deux eigenvectors sont perpendiculaires: c’est ce qui se produit quand on a une matrice symmétrique (si on réfléchit la matrice sur la diagonale principale, on obtient la même matrice) et c’est le cas de la matrice de covariance puisque Cov(X,Y) = Cov(Y,X).
Ordonner les eigenvectors par ordre descendant des eigenvalues.
Les eigenvalues nous donnent une indication de la variance des données capturées par les eigenvectors associés.
En ordonnant par eigenvalues, on met en premier les eigenvectors qui expliquent le mieux les variations des données.
print(eigenvectors)
# [[-0.70710678, -0.70710678][ 0.70710678, -0.70710678]]
print(eigenvalues)
# [1.84, 0.16]
print(eigenvalues/eigenvalues.sum())
# [0.92, 0.08]
'''
[-0.70710678, -0.70710678]
explique 92% de la variance observée
'''
Sélectionner les k premiers eigenvectors — suivant le nombre de caractéristiques que vous souhaitez garder.
Un critère pour choisir la valeur k peut être la quantité de variance qu’on souhaite conserver: on peut par exemple décider de ne conserver que les éléments nécessaires pour expliquer 95% de la variance observée sur les données.
\[\text{Variance expliquée par } [\lambda_1 .. \lambda_k]:\\ \frac{\sum_{i=1}^k \lambda_i}{\sum_{j=1}^n \lambda_j}\]Utiliser la matrice d’eigenvectors (d×k) pour transformer l’ensemble de données vers le nouveau sous-ensemble. Il suffit pour ce faire d’effectuer une multiplication matricielle de l’ensemble de départ avec la matrice d’eigenvectors sélectionnés — on dit qu’on projete les données.
Le sous-ensemble obtenu est une représentation relativement fidèle à l’ensemble de départ — parce qu’on a réduit les dimensions de la manière la plus intelligente possible. Pour rappel, les caractéristiques de ce sous-ensemble sont appelées Principal Components [PCs] (composantes principales en français). La matrice d’eigenvectors est parfois appelées loadings des principal components.
Les PCs sont des combinaisons linéaires des caractéristiques unitiales, ils n’ont pas de réelle signification — mais peuvent être utilisés pour identifier des clusters, tout en étant assez fidèle aux données d’origine.
# 1. Normaliser
df_norm = (df-df.mean())/df.std()
# 2. Créer la matrice de covariance
cov = np.cov(df_norm.T)
# 3. Calculer les eigenvalues et eigenvectors
eigenvalues, eigenvectors = np.linalg.eig(cov)
eigenvectors = eigenvectors.T
# 4. Ordonner par ordre descendant des eigenvalues
rsort_eigenvalues_idx = eigenvalues.argsort()[::-1]
rsort_eigenvectors = eigenvectors[rsort_eigenvalues_idx]
# 5. Sélectionner k eigenvectors
k = 1
top_eigenvectors = rsort_eigenvectors[:k]
# 6. Réduire l'ensemble de données
df_reduced = np.dot(top_eigenvectors, df_norm.T)
Video: Principal Component Analysis (PCA)
Les valeurs singulières d’une matrice X sont liées mathématiquement aux eigenvalues de sa matrice de covariance (1/n XX^T).
Calculer les eigenvalues [O(p³)] de la matrice de covariance [O(p²n)] a un coût total de O(p³ + p²n).
Calculer les valeurs singulières de la matrice d’origine a un coût total de O(min(p²n, n²p)).
La seconde approche est donc plus efficace et c’est généralement celle qui est implémentée dans les frameworks de machine learning.
Avec décomposition par eigenvalues
2/ calculer la matrice de covariance
3/ calculer les eigenvalues de la matrice de covariance
Avec décomposition par valeurs singulières
2/ calculer les valeurs singulières de la matrice d’origine
3/ calculer le carré des valeurs singulières (nous donne les eigenvalues). Les vecteurs singuliers de droites correspondent aux eigenvectors.