python - 使用 sklearn 在 PCA 中恢复解释变量比率的特征名称

标签 python machine-learning scikit-learn pca

我正在尝试从使用 scikit-learn 完成的 PCA 中恢复,哪些特征被选择为相关

IRIS 数据集的经典示例。

import pandas as pd
import pylab as pl
from sklearn import datasets
from sklearn.decomposition import PCA

# load dataset
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# normalize data
df_norm = (df - df.mean()) / df.std()

# PCA
pca = PCA(n_components=2)
pca.fit_transform(df_norm.values)
print pca.explained_variance_ratio_

返回

In [42]: pca.explained_variance_ratio_
Out[42]: array([ 0.72770452,  0.23030523])

如何恢复哪两个特征允许数据集中这两个解释的差异? 换一种说法,如何在 iris.feature_names 中获取此功能的索引?

In [47]: print iris.feature_names
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

提前感谢您的帮助。

最佳答案

此信息包含在 pca 属性中:components_。如 documentation 中所述, pca.components_ 输出一个 [n_components, n_features] 数组,因此要了解码件如何与不同特征线性相关,您必须:

注意:每个系数代表了一对特定的组件和特征之间的相关性

import pandas as pd
import pylab as pl
from sklearn import datasets
from sklearn.decomposition import PCA

# load dataset
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# normalize data
from sklearn import preprocessing
data_scaled = pd.DataFrame(preprocessing.scale(df),columns = df.columns) 

# PCA
pca = PCA(n_components=2)
pca.fit_transform(data_scaled)

# Dump components relations with features:
print(pd.DataFrame(pca.components_,columns=data_scaled.columns,index = ['PC-1','PC-2']))

      sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
PC-1           0.522372         -0.263355           0.581254          0.565611
PC-2          -0.372318         -0.925556          -0.021095         -0.065416

重要提示:作为旁注,请注意 PCA 符号不会影响其解释,因为该符号不会影响每个组件中包含的方差。只有形成 PCA 维度的特征的相对符号很重要。事实上,如果您再次运行 PCA 代码,您可能会得到带有反转符号的 PCA 尺寸。关于这一点的直觉,想想一个向量和它在 3-D 空间中的负数——两者本质上都表示空间中的相同方向。 查看 this post供进一步引用。

关于python - 使用 sklearn 在 PCA 中恢复解释变量比率的特征名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22984335/

相关文章:

python - 在 python 存储库名称和包名称中使用连字符/破折号

python - pydev 导入请求给出错误 unresolved import : requests

python - 如何将 PyQt5 .ui 与 PyOpenGL 一起使用

python - 用 celery 运行 "unique"任务

machine-learning - 如何使用机器学习从数据序列计算状态图?

python - Python sklearn 中的训练集

python - 在one-hot编码期间/之后,是否可以使用另一列的值而不是二进制标志?

python - SymPy "solves"它不应该求解的微分方程

python-3.x - 当输出标签是3D数组时如何使用SVM?

python - 比较 Scikit-learn (Python) 和 glm (R) 中的逻辑回归