web-dev-qa-db-fra.com

Python scikit learn pca.explained_variance_ratio_ cutoff

Gourou,

Lors du choix du nombre de composants principaux (k), nous choisissons k comme étant la plus petite valeur de sorte que, par exemple, 99% de la variance soit conservée.

Cependant, dans le Python Scikit learn, je ne suis pas sûr à 100% pca.explained_variance_ratio_ = 0.99 est égal à "99% de la variance est conservée"? Quelqu'un pourrait-il éclairer? Merci.

  • Le manuel Python Scikit learn PCA est ici

http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA

23
Chubaka

Oui, vous avez presque raison. Le paramètre pca.explained_variance_ratio_ Renvoie un vecteur de la variance expliquée par chaque dimension. Ainsi pca.explained_variance_ratio_[i] Donne la variance expliquée uniquement par la i + 1ère dimension.

Vous voulez probablement faire pca.explained_variance_ratio_.cumsum(). Cela renverra un vecteur x tel que x[i] Renvoie la variance cumulative expliquée par les premières dimensions i + 1.

import numpy as np
from sklearn.decomposition import PCA

np.random.seed(0)
my_matrix = np.random.randn(20, 5)

my_model = PCA(n_components=5)
my_model.fit_transform(my_matrix)

print my_model.explained_variance_
print my_model.explained_variance_ratio_
print my_model.explained_variance_ratio_.cumsum()

[ 1.50756565  1.29374452  0.97042041  0.61712667  0.31529082]
[ 0.32047581  0.27502207  0.20629036  0.13118776  0.067024  ]
[ 0.32047581  0.59549787  0.80178824  0.932976    1.        ]

Donc, dans mes données aléatoires sur les jouets, si je choisissais k=4, Je conserverais 93,3% de la variance.

51
Curt F.

Bien que cette question date de plus de 2 ans, je souhaite fournir une mise à jour à ce sujet. Je voulais faire de même et il semble que sklearn propose désormais cette fonctionnalité hors de la boîte.

Comme indiqué dans le docs

si 0 <n_components <1 et svd_solver == ‘full’, sélectionnez le nombre de composants de telle sorte que la quantité de variance qui doit être expliquée soit supérieure au pourcentage spécifié par n_components

Donc, le code requis est maintenant

my_model = PCA(n_components=0.99, svd_solver='full')
my_model.fit_transform(my_matrix)
22
Yannic Klem