数据挖掘:特征工程——特征提取与选择( 二 )


接下来按照线性和非线性降维方法进行说明 。主要在.中 。
三、线性降维方法
假设数据集采样来自高维空间的一个全局线性的子空间,即构成数据的各变量之间是独立无关的 。通过特征的线性组合来降维,本质上是把数据投影到低维线性子空间 。线性方法相对比较简单且容易计算,适用于具有全局线性结构的数据集 。
3.1 主成分分析(PCA)
PCA方法是一种无监督学习方法,把原始n维数据x变换到一个新的坐标系统中,找到第一个坐标,数据集在该坐标的方差最大(方差最大也就是我们在这个数据维度上能更好的区分不同类型的数据),然后找到第二个坐标,该坐标与原来的坐标正交 。该过程会一直重复,直到新坐标的数目与原来的特征个数相同,这时候我们会发现数据打大部分方差都在前面几个坐标上表示,这些新的维度就是我们所说的主成分 。
只保留前k个主成分,这前k个主成分的方差是最大的,因此对模型的贡献最大 。而抛弃的n-k个维度对于模型的影响很有限,这样我们就降低了运算量 。
PCA工作其实是在寻找最大方差所属的方向 。其中PCA中特征缩放是必须的,因为必须保证变量在同一个数量级,否则,数值大的贡献很大,导致我们可能忽略了数值小却很至关重要的特征 。
基本思想:构造原变量的一系列线性组合形成几个综合指标,以去除数据的相关性,并使低维数据最大程度保持原始高维数据的方差信息 。
PCA基本工作步骤:
将X记为包含了m个自变量的矩阵,对x进行特征缩放计算x的方差矩阵,记作A计算矩阵A的特征值和特征向量,对特征值进行自大到小排序选择需要解释方差的百分比P,借此进行特征选择p个(这里的特征是我们提取到的,区别于m中的任意一个变量)
这里的p个特征就是我们留下的新特征了
主成分个数P的确定:
from sklearn.preprocessing import StandardScalerss = StandardScaler()x = ss.fit_transform(x)from sklearn.model_selection import train_test_splitx_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25,random_state = 0)from sklearn.decomposition import PCApca = PCA(n_components=None)#当为None时我们只是取p = m,并没有进行取舍,展示所有的结果 。x_train = pca.fit_transform(x_train)x_test = pca.transform(x_test)print('各个变量的解释方差能力:'+str(pca.explained_variance_))#这个步骤会自动得出每个变量的解释方差的能力,并自大到小排序 。方便我们进行取舍 。----------------------------------------------------------------------#假设我们的P设置为85%,则我们需要用到上述代码的结果的p个变量解释方差达到85% 。这里就确定了p的取值 。pca = PCA(n_components=p)#这里的p时上个代码片得出的px_train = pca.fit_transform(x_train)x_test = pca.transform(x_test)
3.2 线性判别分析(LDA)
LDA 是一种有监督学习算法,相比较 PCA,它考虑到数据的类别信息,而 PCA 没有考虑,只是将数据映射到方差比较大的方向上而已 。
因为考虑数据类别信息,所以 LDA 的目的不仅仅是降维,还需要找到一个投影方向,使得投影后的样本尽可能按照原始类别分开,即寻找一个可以最大化类间距离以及最小化类内距离的方向 。(通过将数据在低纬度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大)
LDA的算法步骤:
计算类内散度矩阵Sw计算类间散度矩阵Sb计算矩阵Sw^?1*Sb计算Sw^?1*Sb的最大的d个特征值和对应的d个特征向量(w1,w2,…wd),得到投影矩阵W对样本集中的每一个样本特征xi,转化为新的样本zi=WT*xi得到输出样本集相应的,也有如下缺点: