数据降维
1. 基于特征选择的降维
这种降维方法的好处是,在保留了原有维度特征的基础上进行降维。
例如通过决策树得到的特征规则,可以作为选择用户样本的基础条件,而这些特征规则便是基于输入的维度产生。假如在决策树之前将原有维度表达式(例如PCA的主成分)方法进行转换,那么即使得到了决策树规则,也无法直接应用于业务。
2. 基于维度转换的降维
基于维度的降维是通过数学模型将高维空间的数据点映射到低维空间中,然后用低维特征代表总体特征。
PCA适用场景:
- 非监督式的数据集。是一种非监督式的降维方法,因此适用不带标签的数据集;带标签的数据集可用LDA。
- 根据方差自主控制特征数量。最大的主成分的数量会小于或等于特征的数量,这意味,PCA可以输出完全相同数量的特征,具体取决于选择特征中解释的方差比例。
- 更少的正则化处理。选择较多的主成分将导致较少的平滑,因为我们将能够保留更多的数据特征,从而减少正则化。
- 数据集较大。数据记录多或数据维度多。PCA对大型数据集处理效率较高。
- 数据分布位于相同平面(非曲面),数据中存在线性结构。
代码实操
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.decomposition import PCA
data = np.loadtxt('data1.txt')
X = data[:, :-1]
y = data[:, -1]
# print(X[0], y[0])
# 用sklearn的DecisionTreeClassifier判断变量重要性
model_tree = DecisionTreeClassifier(random_state=0) # 建立分类决策树模型对象
model_tree.fit(X, y)
feature_importance = model_tree.feature_importances_ # 获得所有变量的重要性得分
# print(feature_importance)
# 用sklearn的PCA进行维度转换
model_pca = PCA()
model_pca.fit(X)
model_pca.transform(X)
components = model_pca.components_ # 获得转换后的所有主成分
components_var = model_pca.explained_variance_ # 获取各主成分的方差
components_var_ratio = model_pca.explained_variance_ratio_ # 各主成分的方差占比
print(components[:2])
print(components_var[:2])
print(components_var_ratio)
第一部分导入库。
第二部分导入数据。
第三部分使用Sklearn的 DecisionTreeClassifier
判断变量的重要性。首先建立分类决策树模型对象,在参数中通过 random_state
来控制随机种子,如果不设置则会导致模型结果有微小差异;然后通过fit方法输入 X 和 y 进行训练,在训练模型中通过 feature_importances_
方法得到变量重要性得分。
输出结果:
[0.03331054 0.01513967 0.02199713 0.119727 0.47930312 0.04776297
0.17111746 0.02585441 0.02012725 0.06566044]
从结果看出,第4/5/7三个变量重要性最高。分别为0.12,0.48,0.17。三者得分总和77%。
注意:一般重要性得分接近80%,基本可以解释大部分的特征变化。
第四部分使用Sklearn的PCA进行维度转换。该部分的实现思路与 DecisionTreeClassifier
类似,不同之处在于创建模型对象之后,我们使用 fit
方法仅输入 X 进行 PCA 训练(y不需要转换),然后通过 transform 进行转换,可以合并为一步 fit_transform(X)。但是考虑到 PCA 通过 fit 方法得到的映射关系在后续会用到,因此这里单独使用 transform 实现对数据集的降维转换。在得到 PCA 训练模型后,通过模型 conponents_
、 explained_variance_
、 explained_variance_ratio_
属性分别获取转换后的所有主成分、各主成分的方差和各主成分的方差占比。
输出结果:
(1)前2个主成分:
[[ 7.18818316e-03 1.41619205e-02 1.00543847e-02 3.65097575e-01
6.38944537e-01 -1.95750380e-02 -1.73413378e-01 -3.80829974e-02
-2.87413113e-03 -6.52829504e-01]
[ 1.01307710e-02 -1.95270201e-04 -2.33689543e-02 -6.12915216e-01
5.08983971e-01 -2.23429533e-02 6.02958940e-01 -1.49061329e-02
-1.81362216e-02 -3.41623971e-03]]
(2)前2个主成分对应的方差:
[4.22602937 2.21149972]
(3)所有主成分的方差占比:
[3.38339364e-01 1.77054475e-01 8.92753857e-02 8.73655166e-02
8.23542686e-02 8.03329836e-02 7.38094896e-02 7.14685179e-02
3.31291533e-32 4.66241032e-33]
上述结果中,前6项主成分的方差占比之和 components_var_ratio[:5].sum()
约等于77%,可以作为转换后的主成分参与后续模型计算。因为 PCA 降维的基本思想是根据方差占比来选择主成分的数量。
注意:在建立 PCA 模型时,可通过 n_components 指定要获得的主成分数量,但通常不建议采用这种方式,原因是无法根据各主成分的方差占比判断到底指定多少个主成分最合适。