web-dev-qa-db-fra.com

PCA sur sklearn - comment interpréter pca.components_

J'ai exécuté PCA sur une trame de données avec 10 fonctionnalités en utilisant ce code simple:

pca = PCA()
fit = pca.fit(dfPca)

Le résultat de pca.explained_variance_ratio_ spectacles:

array([  5.01173322e-01,   2.98421951e-01,   1.00968655e-01,
         4.28813755e-02,   2.46887288e-02,   1.40976609e-02,
         1.24905823e-02,   3.43255532e-03,   1.84516942e-03,
         4.50314168e-16])

Je crois que cela signifie que le premier PC explique 52% de la variance, le deuxième composant explique 29% et ainsi de suite ...

Ce que je ne comprends pas, c'est la sortie de pca.components_. Si je fais ce qui suit:

df = pd.DataFrame(pca.components_, columns=list(dfPca.columns))

J'obtiens le bloc de données ci-dessous où chaque ligne est un composant principal. Ce que j'aimerais comprendre, c'est comment interpréter ce tableau. Je sais que si je mets en carré toutes les fonctionnalités de chaque composant et que je les additionne, j'obtiens 1, mais que signifie le -0,56 sur PC1? Est-ce que cela dit quelque chose sur la "caractéristique E", car c'est la plus grande ampleur sur un composant qui explique 52% de la variance?

enter image description here

Merci

12
Diego

Terminologie: Tout d'abord, les résultats d'une ACP sont généralement discutés en termes de scores de composants, parfois appelés scores de facteurs (les valeurs variables transformées correspondant à un point de données particulier) et les charges (le poids par lequel chaque variable d'origine normalisée doit être multipliée pour obtenir le score du composant).

PART1 : J'explique comment vérifier l'importance des fonctionnalités et comment tracer un biplot.

PART2 : J'explique comment vérifier l'importance des fonctionnalités et comment les enregistrer dans un pandas dataframe utilisant le noms de fonction.


PARTIE 1:

Dans votre cas, la valeur -0,56 pour la fonctionnalité E est le score de cette fonctionnalité sur le PC1. Cette valeur nous indique `` dans quelle mesure '' la fonction influence le PC (dans notre cas le PC1).

Ainsi, plus la valeur en valeur absolue est élevée, plus l'influence sur la composante principale est élevée.

Après avoir effectué l'analyse PCA, les gens tracent généralement le "biplot" connu pour voir les caractéristiques transformées dans les dimensions N (2 dans notre cas) et les variables originales (caractéristiques).

J'ai écrit une fonction pour tracer cela.


Exemple utilisant des données d'iris:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

iris = datasets.load_iris()
X = iris.data
y = iris.target

#In general it is a good idea to scale the data
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)

pca = PCA()
pca.fit(X,y)
x_new = pca.transform(X)   

def myplot(score,coeff,labels=None):
    xs = score[:,0]
    ys = score[:,1]
    n = coeff.shape[0]

    plt.scatter(xs ,ys, c = y) #without scaling
    for i in range(n):
        plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = 'r',alpha = 0.5)
        if labels is None:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = 'g', ha = 'center', va = 'center')
        else:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = 'g', ha = 'center', va = 'center')

plt.xlabel("PC{}".format(1))
plt.ylabel("PC{}".format(2))
plt.grid()

#Call the function. 
myplot(x_new[:,0:2], pca. components_) 
plt.show()

Résultats

enter image description here

PARTIE 2:

Les caractéristiques importantes sont celles qui influencent le plus les composants et ont donc une grande valeur absolue sur le composant.

POUR obtenir les fonctionnalités les plus importantes sur les PC avec des noms et les enregistrer dans un cadre de données pandas utilisez ceci:

from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
np.random.seed(0)

# 10 samples with 5 features
train_features = np.random.Rand(10,5)

model = PCA(n_components=2).fit(train_features)
X_pc = model.transform(train_features)

# number of components
n_pcs= model.components_.shape[0]

# get the index of the most important feature on EACH component
# LIST COMPREHENSION HERE
most_important = [np.abs(model.components_[i]).argmax() for i in range(n_pcs)]

initial_feature_names = ['a','b','c','d','e']
# get the names
most_important_names = [initial_feature_names[most_important[i]] for i in range(n_pcs)]

# LIST COMPREHENSION HERE AGAIN
dic = {'PC{}'.format(i): most_important_names[i] for i in range(n_pcs)}

# build the dataframe
df = pd.DataFrame(dic.items())

Ceci imprime:

     0  1
 0  PC0  e
 1  PC1  d

Ainsi, sur le PC1, la fonction nommée e est la plus importante et sur PC2 la d.

13
makis

Idée de base

La répartition des composants principaux par caractéristiques que vous avez là-bas vous indique essentiellement la "direction" vers laquelle chaque composant principal pointe en termes de direction des fonctionnalités.

Dans chaque composant principal, les entités qui ont un poids absolu supérieur "tirent" davantage le composant principal vers la direction de cette entité.

Par exemple, nous pouvons dire que dans PC1, puisque la fonction A, la fonction B, la fonction I et la fonction J ont des poids relativement faibles (en valeur absolue), PC1 ne pointe pas autant dans la direction de ces fonctionnalités dans l'espace des fonctionnalités. PC1 pointera le plus vers la direction de la fonction E par rapport à d'autres directions.

Visualisation dans les dimensions inférieures

Pour une visualisation de ceci, regardez les figures suivantes tirées de ici et ici :

Voici un exemple d'exécution de PCA sur des données corrélées. enter image description here

Nous pouvons voir visuellement que les deux vecteurs propres dérivés de l'ACP sont "tirés" à la fois dans les directions Feature 1 et Feature 2. Ainsi, si nous devions faire un tableau de répartition des composants principaux comme vous l'avez fait, nous nous attendrions à voir un certain poids à la fois des fonctionnalités 1 et 2 expliquant PC1 et PC2.

Ensuite, nous avons un exemple avec des données non corrélées.

enter image description here

Appelons le composant de principe vert PC1 et le rose PC2. Il est clair que PC1 n'est pas tiré dans le sens de la fonction x ', et pas plus que PC2 dans le sens de la fonction y'. Ainsi, dans notre tableau, nous devons avoir un poids de 0 pour la caractéristique x 'dans PC1 et un poids de 0 pour la caractéristique y' dans PC2.

J'espère que cela donne une idée de ce que vous voyez dans votre table.

8
Tatsuya Yokota