我已经对原始数据集进行了PCA分析,并从PCA转换后的压缩数据集中选择了要保留的PC数量(它们解释了几乎94%的差异)。现在,我正在努力寻找对简化数据集中重要的原始特征。
在缩小尺寸后,我如何找出哪个功能很重要,哪些不属于其余主要组件?
这是我的代码:
from sklearn.decomposition import PCA
pca = PCA(n_components=8)
pca.fit(scaledDataset)
projection = pca.transform(scaledDataset)
此外,我还尝试对精简后的数据集执行聚类算法,但令我惊讶的是,分数低于原始数据集。这怎么可能?
最佳答案
首先,我假设您将features
变量和not the samples/observations
称为。在这种情况下,您可以通过创建biplot
函数以在一个图中显示所有内容的方式来执行以下操作。在此示例中,我使用虹膜数据。
在示例之前,请注意,将PCA用作特征选择工具时,基本思想是根据变量(载荷)的大小(从绝对值的最大到最小)选择变量。有关详细信息,请参见情节之后的最后一段。
我在这里写的好文章: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
概述:
PART1 :我解释了如何检查功能的重要性以及如何绘制双线图。
PART2 :我解释了如何检查功能的重要性以及如何使用功能名称将其保存到pandas数据框中。
第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()
使用双图可视化正在发生的事情
现在,每个特征的重要性都由特征向量中相应值的大小反射(reflect)出来(强度更高-重要性更高)
首先让我们看看每台PC解释了多少差异。
pca.explained_variance_ratio_
[0.72770452, 0.23030523, 0.03683832, 0.00515193]
PC1 explains 72%
和PC2 23%
。在一起,如果我们仅保留PC1和PC2,它们将解释95%
。现在,让我们找到最重要的功能。
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]]
在这里,
pca.components_
具有形状[n_components, n_features]
。因此,通过查看第一行的PC1
(第一主成分):[0.52237162 0.26335492 0.58125401 0.56561105]]
,我们可以得出结论:feature 1, 3 and 4
(或biplot中的Var 1、3和4)是最重要的。 总而言之,请查看对应于k个最大特征值的特征向量分量的绝对值。在
sklearn
中,组件按explained_variance_
排序。这些绝对值越大,特定功能对该主成分的贡献就越大。第2部分:
重要功能是那些影响更多组件的功能,因此,在组件上具有很大的绝对值/分数。
要使获得具有名称的PC 在PC上最重要的功能并将其保存到 Pandas 数据框中,请使用以下命令:
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())
打印:
0 1
0 PC0 e
1 PC1 d
因此,在PC1上,名为
e
的功能是最重要的,而在PC2上,则是d
。 关于python - PCA分析之后的功能/变量重要性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50796024/