Saltar al contenido

Importancia de característica / variable después de un análisis de PCA

Solución:



En primer lugar, supongo que llamas features las variables y not the samples/observations. En este caso, puede hacer algo como lo siguiente creando un biplot función que muestra todo en una parcela. En este ejemplo, estoy usando los datos del iris.

Antes del ejemplo, tenga en cuenta que la idea básica al usar PCA como herramienta para la selección de características es seleccionar variables de acuerdo con la magnitud (de mayor a menor en valores absolutos) de sus coeficientes (cargas). Vea mi último párrafo después de la trama para más detalles.

Buen artículo mío aquí: https://towardsdatascience.com/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e?source= friends_link & sk = 65bf5440e444c24aff192fedf9f8b64f



Visión general:

PARTE 1: Explico cómo comprobar la importancia de las características y cómo trazar un biplot.

PARTE 2: Explico cómo verificar la importancia de las características y cómo guardarlas en un marco de datos de pandas usando los nombres de las características.



PARTE 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()

Visualiza lo que está pasando usando el biplot

ingrese la descripción de la imagen aquí


Ahora, la importancia de cada característica se refleja en la magnitud de los valores correspondientes en los vectores propios (mayor magnitud – mayor importancia)

Veamos primero qué cantidad de variación explica cada PC.

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

PC1 explains 72% y PC2 23%. Juntos, si mantenemos PC1 y PC2 solo, explican 95%.

Ahora, busquemos las características más 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]]

Aquí, pca.components_ tiene forma [n_components, n_features]. Por lo tanto, al mirar el PC1 (Primer componente principal) que es la primera fila: [0.52237162 0.26335492 0.58125401 0.56561105]] podemos concluir que feature 1, 3 and 4 (o Var 1, 3 y 4 en el biplot) son los más importantes.

En resumen, observe los valores absolutos de los componentes de los vectores propios correspondientes a los k valores propios más grandes. En sklearn los componentes están ordenados por explained_variance_. Cuanto mayores sean estos valores absolutos, más una característica específica contribuye a ese componente principal.



PARTE 2:

Las características importantes son las que influyen más en los componentes y, por lo tanto, tienen un gran valor / puntuación absoluta en el componente.

Para obtenga las funciones más importantes en las PC con nombres y guárdelos en un marco de datos de pandas utilizar esta:

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())

Esto imprime:

     0  1
 0  PC0  e
 1  PC1  d

Entonces, en la PC1, la función llamada e es el más importante y en PC2 el d.



la biblioteca pca contiene esta funcionalidad.

pip install pca

Una demostración para extraer la importancia de la característica es la siguiente:

# Import libraries
import numpy as np
import pandas as pd
from pca import pca

# Lets create a dataset with features that have decreasing variance. 
# We want to extract feature f1 as most important, followed by f2 etc
f1=np.random.randint(0,100,250)
f2=np.random.randint(0,50,250)
f3=np.random.randint(0,25,250)
f4=np.random.randint(0,10,250)
f5=np.random.randint(0,5,250)
f6=np.random.randint(0,4,250)
f7=np.random.randint(0,3,250)
f8=np.random.randint(0,2,250)
f9=np.random.randint(0,1,250)

# Combine into dataframe
X = np.c_[f1,f2,f3,f4,f5,f6,f7,f8,f9]
X = pd.DataFrame(data=X, columns=['f1','f2','f3','f4','f5','f6','f7','f8','f9'])

# Initialize
model = pca()
# Fit transform
out = model.fit_transform(X)

# Print the top features. The results show that f1 is best, followed by f2 etc
print(out['topfeat'])

#     PC      feature
# 0  PC1      f1
# 1  PC2      f2
# 2  PC3      f3
# 3  PC4      f4
# 4  PC5      f5
# 5  PC6      f6
# 6  PC7      f7
# 7  PC8      f8
# 8  PC9      f9

Grafica la varianza explicada

model.plot()

Varianza explicada

Haz la biplot. Se puede ver muy bien que la primera característica con más varianza (f1) es casi horizontal en la gráfica, mientras que la segunda más varianza (f2) es casi vertical. Esto se espera porque la mayor parte de la varianza está en f1, seguida de f2, etc.

ax = model.biplot(n_feat=10, legend=False)

biplot

Biplot en 3d. Aquí vemos la buena adición del f3 esperado en la gráfica en la dirección z.

ax = model.biplot3d(n_feat=10, legend=False)

biplot3d

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *