数据降维就是降低数据的维度,有两种方式:
1、一种是特征选择:直接选取原有维度的一部分参与后续的计算和建模过程,用选择的维度替代所有维度,整个过程不产生新的维度。
方法:
(1)经验法:根据业务经验选择
(2)测算法:通过不断测试多种维度选择参与计算,通过结果来反复验证和调整并最终找到最佳特征方案
(3)统计分析方法:通过相关性分析不同维度间的线性相关性,在相关性高的维度中进行人工去除或筛选;通过计算不同维度间的互信息,找到具有较高互信息的特征集,然后把其中的一个特征去除或留下
(4)机器学习:通过机器学习算法得到不同特征的特征值或权重,然后再根据权重来选择较大的特征,例用决策树得出不同变量的重要程度。
2、另一种是特征提取:按照一定的数学变换方法,将高维空间的数据点映射到低维空间中,然后利用映射后的变量特征来表示原有的总体特征。
方法:常用算法有独立成分分析(ICA)、主成分分析(PCA)、因子分析(FA)、线性判别分析(LDA)、局部线性嵌入(LLE)、核主成分分析(Kernel PCA)等
主成分分析(PCA):
把给定的一组相关变量(维度)通过线性变换转换成另一组不相关的变量,这些新的变量按照方差依次递减的顺序排序。第一变量具有最大方差,称第一主成分,第二变量的方差次大,称第二主成分。
主成分分析基本步骤:
(1)对原始d维数据做标准化处理
(2)构造样本的协方差矩阵
(3)计算协方差矩阵的特征值和相应的特征向量
(4)选择与前k个最大特征值对应的特征向量,其中k为新特征空间的维度(k<=d)
(5)通过前k个特征向量构建映射矩阵W
(6)通过映射矩阵W将d维的输入数据集X转换到新的k维特征子空间
#导入库
import pandas as pd import numpy as np from sklearn.decomposition import PCA from sklearn import datasets
#导入数据 iris=datasets.load_iris() #加载鸢尾花数据集 x=iris.data print(x[:10])
[[ 5.1 3.5 1.4 0.2]
[ 4.9 3. 1.4 0.2]
[ 4.7 3.2 1.3 0.2]
[ 4.6 3.1 1.5 0.2]
[ 5. 3.6 1.4 0.2]
[ 5.4 3.9 1.7 0.4]
[ 4.6 3.4 1.4 0.3]
[ 5. 3.4 1.5 0.2]
[ 4.4 2.9 1.4 0.2]
[ 4.9 3.1 1.5 0.1]]
#建立模型 pca=PCA(n_components=2) #建立PCA模型对象,n_components是数据要降到的维度 pca.fit(x) #将数据输入模型 x_r=pca.transform(x) #对数据集进行转换映射 print(x_r[:10])
[[-2.68420713 0.32660731]
[-2.71539062 -0.16955685]
[-2.88981954 -0.13734561]
[-2.7464372 -0.31112432]
[-2.72859298 0.33392456]
[-2.27989736 0.74778271]
[-2.82089068 -0.08210451]
[-2.62648199 0.17040535]
[-2.88795857 -0.57079803]
[-2.67384469 -0.1066917 ]]
#输出转换后的主成分 components=pca.components_ #获取转换后的主成分 var=pca.explained_variance_ #获取转换后的主成分的方差 var_ratio=pca.explained_variance_ratio_ #获取转换后的主成分的方差占比 print('components',components) print('variance',var) print('variance ratio',var_ratio)
components [[ 0.36158968 -0.08226889 0.85657211 0.35884393]
[ 0.65653988 0.72971237 -0.1757674 -0.07470647]]
variance [ 4.22484077 0.24224357]
variance ratio [ 0.92461621 0.05301557]
上述输出结果中,主成分的方差占比是选择主成分数量的关键,主成分方差占比之和在70%以上就可以选择该主成分参与后续模型计算。
因子分析(FA):
从变量中提取共性因子。
因子分析要求原有变量间具有较强的相关性,否则,因子分析无法提取变量间的共性特征,如果相关系数小于0.3,则变量间的共线性较小,不适合因子分析;因子分析得到因子和原变量的关系,因此能够对因子进行解释。
import numpy as np import pandas as pd from sklearn import datasets from sklearn.decomposition import FactorAnalysis iris=datasets.load_iris() x=iris.data fa=FactorAnalysis(n_components=3) #指定3个因子作为新变量 fa.fit(x) tran_x=fa.transform(x) print(tran_x[:10]) #输出新因子
[[ -1.31686745e+00 5.97520018e-01 1.11217811e-03]
[ -1.32710651e+00 -3.28650685e-01 -3.88642995e-01]
[ -1.39619171e+00 -2.84417674e-01 1.31593688e-01]
[ -1.33067991e+00 -5.98068260e-01 1.15421214e-03]
[ -1.33261365e+00 6.06424839e-01 2.31749197e-01]
[ -1.11358590e+00 1.37362223e+00 5.32582144e-01]
[ -1.34512235e+00 -1.98028671e-01 6.99463537e-01]
[ -1.28894846e+00 3.10292800e-01 -7.03646521e-02]
[ -1.38762034e+00 -1.09325259e+00 3.50884895e-02]
[ -1.32480883e+00 -1.89272934e-01 -6.00649914e-01]]
线性判别分析(LDA):
线性判别将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维度的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间有最佳的可分离性。线性判别通过一个已知类别的“训练样本”来建立判别准则,并通过预测变量来为未知类别的数据进行分类。
import numpy as np import pandas as pd from sklearn import datasets from sklearn.lda import LDA iris=datasets.load_iris() x=iris.data y=iris.target print(x[:5],y[:5]) lda=LDA() lda.fit(x,y) x_r=lda.transform(x) print(x_r[:5])
参考:
http://www.dataivy.cn/blog/%E5%9B%A0%E5%AD%90%E5%88%86%E6%9E%90factor-analysis/