PCA恢复数据框中的最重要功能

时间:2019-06-21 21:10:22

标签: python-3.x pandas scikit-learn pca

我正在尝试找出如何使用PCA来确定最重要的功能。我想我已经在下面做到了。

那我想知道如何将最重要的功能及其原始列名(来自pandas数据框)传递回我在底部创建的新数据框中-因此我可以将其用作新的“轻量级” '数据集?

这样,如果我将n_components设置为10;我将有10个功能列(带有名称)被传递到新的数据框中。

有什么想法吗?

from sklearn.decomposition import PCA

# PCA (principal component analysis) aims to reduce the number of dimensions in the dataset, without losing those which are very relevant to the model
# it provides a score, you can drop those with poor scores.
X_pc = PCA(n_components=2).fit_transform(train_features)
pd.DataFrame({'PC1': X_pc[:, 0], 'PC2': X_pc[:, 1], 'Y': train_labels.ravel()}).sample(10)

1 个答案:

答案 0 :(得分:1)

PCA通过线性组合初始特征将尺寸减小到2。转换后,输出是一个具有[样本,组件]大小的矩阵,因此无法创建数据框,因为您无法投影回名称/特征。

重要的特征是影响更多组件的特征,因此对组件具有很大的绝对价值。

如果更改代码,则可以获得PC上最重要的功能

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+1): most_important_names[i] for i in range(n_pcs)}

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

打印:

     0  1
 0  PC1  e
 1  PC2  d

因此,在PC1上,名为e的功能最为重要,在PC2上,名为d的功能。