一、sklearn中的降维算法
sklearn中降维算法都被包括在模块decomposition中,这个模块本质是一个矩阵分解模块。矩阵分解可以用在降维,深度学习,聚类分析,数据预处理,低纬度特征学习,推荐系统,大数据分析等领域。
SVD和主成分分析PCA都属于矩阵分解算法中的入门算法,都是通过分解特征矩阵来进行降维
PCA使用的信息量衡量指标,就是样本方差,又称可解释性方差,方差越大,特征所带的信息量越多。方差计算公式中为什么除数是n-1?这是为了得到样本方差的无偏估计
2.降维究竟是怎样实现?
找出n个新特征向量,让数据能够被压缩到少数特征上并且总信息量不损失太多的技术就是矩阵分解。PCA和SVD是两种不同的降维算法,但他们都遵从上面的过程来实现降维,只是两种算法中矩阵分解的方法不同,信息量的衡量指标不同罢了。
思考:PCA和特征选择技术都是特征工程的一部分,它们有什么不同? 特征工程中有三种方式:特征提取,特征创造和特征选择。仔细观察上面的降维例子和上周我们讲解过的特征选择,你发现有什么不同了吗?特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,我们依然知道这个特征在原数据的哪个位置,代表着原数据上的什么含义。而PCA,是将已存在的特征进行压缩,降维完毕后的特征不是原本的特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。通常来说,在新的特征矩阵生成之前,我们无法知晓PCA都建立了怎样的新特征向量,新特征矩阵生成之后也不具有可读性,我们无法判断新特征矩阵的特征是从原数据中的什么特征组合而来,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。以PCA为代表的降维算法因此是特征创造(feature creation,或feature construction)的一种。可以想,PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归),因为无法解释的新特征和标签之间的关系不具有意义。在线性回归模型中,我们使用特征选择。3.sklearn中的PCA
PCA参数列表
1 import matplotlib.pyplot as plt 2 from sklearn.datasets import load_iris 3 from sklearn.decomposition import PCA 4 import pandas as pd 5 iris = load_iris() 6 y = iris.target 7 X = iris.data 8 pd.DataFrame(X) 9 pca = PCA(n_components= 2)#降低成2维 10 pca = pca.fit(x) 11 X_dr = pca.transform(x)
对降维后的数据进行可视化
1 plt.figure() 2 plt.scatter(X_dr[y==0, 0], X_dr[y==0, 1], c="red", label=iris.target_names[0]) 3 plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1]) 4 plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2]) 5 plt.legend() 6 plt.title('PCA of IRIS dataset') 7 plt.show()
探索降维后的数据
1 #属性explained_variance_,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小) 2 pca.explained_variance_ 3 #属性explained_variance_ratio,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比 4 #又叫做可解释方差贡献率 5 pca.explained_variance_ratio_ 6 #大部分信息都被有效地集中在了第一个特征上 7 pca.explained_variance_ratio_.sum()选择最好的n_components:累积可解释方差贡献率曲线
1 import numpy as np 2 pca_line = PCA().fit(x) 3 plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_)) 4 plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数 5 plt.xlabel("number of components after dimension reduction") 6 plt.ylabel("cumulative explained variance ratio") 7 plt.show()
4.n_components的选择
4.1最大似然估计自选超参数
1 pca_mle = PCA(n_components="mle")#让PCA用最大似然估计(maximum likelihood 2 estimation)自选超参数的方法 3 pca_mle = pca_mle.fit(X) 4 X_mle = pca_mle.transform(X) 5 X_mle 6 #可以发现,mle为我们自动选择了3个特征 7 pca_mle.explained_variance_ratio_.sum() 8 #得到了比设定2个特征时更高的信息含量,对于鸢尾花这个很小的数据集来说,3个特征对应这么高的信息含量,并不 9 需要去纠结于只保留2个特征,毕竟三个特征也可以可视化
4.2按信息量占比选超参数
1 #输入[0,1]之间的浮点数,并且让参数svd_solver =='full',表示希望降维后的总解释性方差占比大于n_components指定的百分比,即是说,希望保留百分之多少的信息量。比如说,如果我们希望保留97%的信息量,就可以输入
n_components = 0.97,PCA会自动选出能够让保留的信息量超过97%的特征数量。 4 pca_f = PCA(n_components=0.97,svd_solver="full") 5 pca_f = pca_f.fit(X) 6 X_f = pca_f.transform(X) 7 pca_f.explained_variance_ratio_
(资料来源:菜菜老师)
待更新···