web-dev-qa-db-fra.com

Fonction / importance variable après une analyse PCA

J'ai effectué une analyse PCA sur mon jeu de données d'origine et à partir du jeu de données compressé transformé par le PCA, j'ai également sélectionné le nombre de PC que je veux garder (ils expliquent presque 94% de la variance). Maintenant, j'ai du mal à identifier les caractéristiques originales qui sont importantes dans l'ensemble de données réduit. Comment savoir quelle fonction est importante et laquelle ne figure pas parmi les principaux composants restants après la réduction de dimension? Voici mon code:

from sklearn.decomposition import PCA
pca = PCA(n_components=8)
pca.fit(scaledDataset)
projection = pca.transform(scaledDataset)

De plus, j'ai essayé également de réaliser un algorithme de clustering sur l'ensemble de données réduit, mais étonnamment pour moi, le score est inférieur à celui de l'ensemble de données d'origine. Comment est-ce possible?

10
fbm

Tout d'abord, je suppose que vous appelez features les variables et not the samples/observations. Dans ce cas, vous pouvez faire quelque chose comme ceci en créant une fonction biplot qui montre tout dans un tracé. Dans cet exemple, j'utilise les données de l'iris:

Avant l'exemple, veuillez noter que l'idée de base lors de l'utilisation de PCA comme outil de sélection de caractéristiques est de sélectionner des variables en fonction de la magnitude (du plus grand au plus petit en valeurs absolues) de leurs coefficients (chargements ). Voir mon dernier paragraphe après l'intrigue pour plus de détails.

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:

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

iris = datasets.load_iris()
X = iris.data
y = iris.target
#In general a good idea is to scale the data
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)    

pca = PCA()
x_new = pca.fit_transform(X)

def myplot(score,coeff,labels=None):
    xs = score[:,0]
    ys = score[:,1]
    n = coeff.shape[0]
    scalex = 1.0/(xs.max() - xs.min())
    scaley = 1.0/(ys.max() - ys.min())
    plt.scatter(xs * scalex,ys * scaley, c = y)
    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.xlim(-1,1)
plt.ylim(-1,1)
plt.xlabel("PC{}".format(1))
plt.ylabel("PC{}".format(2))
plt.grid()

#Call the function. Use only the 2 PCs.
myplot(x_new[:,0:2],np.transpose(pca.components_[0:2, :]))
plt.show()

Visualisez ce qui se passe en utilisant le biplot

enter image description here


Maintenant, l'importance de chaque caractéristique est reflétée par la magnitude des valeurs correspondantes dans les vecteurs propres (magnitude plus élevée - importance plus élevée)

Voyons d'abord quelle est la variance expliquée par chaque PC.

pca.explained_variance_ratio_
[0.72770452, 0.23030523, 0.03683832, 0.00515193]

PC1 explains 72% et PC2 23%. Ensemble, si nous gardons PC1 et PC2 uniquement, ils expliquent 95%.

Maintenant, trouvons les fonctionnalités les plus importantes.

print(abs( pca.components_ ))

[[0.52237162 0.26335492 0.58125401 0.56561105]
 [0.37231836 0.92555649 0.02109478 0.06541577]
 [0.72101681 0.24203288 0.14089226 0.6338014 ]
 [0.26199559 0.12413481 0.80115427 0.52354627]]

Ici, pca.components_ a une forme [n_components, n_features]. Ainsi, en regardant le PC1 (Premier composant principal) qui est la première ligne: [0.52237162 0.26335492 0.58125401 0.56561105]] nous pouvons conclure que feature 1, 3 and 4 (ou Var 1, 3 et 4 dans le biplot) sont les plus importants.

Pour résumer, regardez les valeurs absolues des composantes des vecteurs propres correspondant aux k plus grandes valeurs propres. Dans sklearn les composants sont triés par explained_variance_. Plus ces valeurs absolues sont grandes, plus une caractéristique spécifique contribue à cette composante principale.

PARTIE 2:

Les caractéristiques importantes sont celles qui influencent le plus les composants et ont donc une valeur absolue7 élevée 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.

23
makis