一、PCA降维简单介绍
- PCA(主成分分析,Principal Component Analysis)是一种常用的数据降维技术。
- 它通过线性变换将原始数据转换到新的坐标系统中,使得任何投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依此类推。
- PCA的主要目的是通过保留数据集中对方差贡献最大的特征来降低数据的维度,同时尽可能保留原始数据的信息。
- PCA降维的步骤:
- 1、标准化数据:
由于PCA对数据的尺度非常敏感,因此在进行PCA之前,通常需要先将数据标准化(也称为归一化),即每个特征减去其均值并除以其标准差,使得每个特征的均值为0,方差为1。 - 2、计算协方差矩阵:
协方差矩阵衡量的是数据集中各个特征之间的相关性。对于n维数据,其协方差矩阵是一个n×n的矩阵,其中每个元素C ij是第i个特征和第j个特征的协方差。 - 3、计算协方差矩阵的特征值和特征向量:
特征值表示了每个主成分在数据集中的方差贡献率,而特征向量则定义了新的坐标轴的方向。 - 4、选择主成分:
根据特征值的大小,选择前k个最大的特征值对应的特征向量。这些特征向量将构成新的特征空间,其中k是降维后的维度数。 - 5、将原始数据投影到新的特征空间:
使用选定的特征向量作为基,将原始数据投影到新的特征空间,得到降维后的数据。
- 1、标准化数据:
二、python中实现PCA降维函数的介绍
-
在Python中,使用scikit-learn库来进行PCA分析,其中PCA是通过PCA类来实现的
-
PCA类有以下参数(默认值)
PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)
-
重要参数的介绍:
-
n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。
- 如果为整数,表示要降维到的目标,比如十维的数据,指定n_components=5,表示将十维数据降维到五维;
- 如果为小数,表示累计方差百分比。
-
copy : bool类型,True或者False,缺省时默认为True。 表示是否在运行算法时,将原始训练数据复制一份。
- 若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;
- 若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
-
whiten:判断是否进行白化。
- 所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。
-
svd_solver:即指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。
- randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。
- full则是传统意义上的SVD,使用了scipy库对应的实现。
- arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。
- auto是默认值,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。
-
一些返回值属性
- components_:一个形状为(n_components, n_features)的NumPy数组,包含了定义主成分的特征向量(即每个主成分是原始特征的哪个线性组合)。
- explained_variance_:一个形状为(n_components,)的NumPy数组,包含了每个主成分解释的方差值。方差值越大,则说明越是重要的主成分。
- explained_variance_ratio_:一个形状为(n_components,)的NumPy数组,包含了每个主成分解释的方差占总方差的比例。
三、代码实现
-
数据集介绍
- 此数据集是一份少量的(60+)鸢尾花数据,前四列为特征数据,最后一列为标签数据
- 部分数据如下所示
-
此数据中有四个特征,代表的有4个维度,下面将通过PCA降维方法将其降维至2维,并将降维后的特征数据划分为新的数据集,传入到逻辑回归模型中进行训练与测试
-
并将没有进行PCA降维处理的原数据也传入到回归模型中,得出结果,进行比较
from sklearn.decomposition import PCA import pandas as pd # 读取数据 data = pd.read_excel('hua.xlsx') # 数据划分 x = data.iloc[:, :-1] # 训练数据 y = data.iloc[:, -1] # 标签数据 # 实例化PCA对象 pca = PCA(n_components=2) pca.fit(x) print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_))) print('每个主成分的方差值:{}'.format(pca.explained_variance_)) new_x = pca.transform(x) print('PCA降维后数据:') print(new_x) # 切分降维后的数据集 from sklearn.model_selection import train_test_split x_train_pca, x_test_pca, y_train_pca, y_test_pca = \ train_test_split(new_x, y, test_size=0.2, random_state=0) from sklearn.linear_model import LogisticRegression # 实例一个逻辑回归模型 classifier_pca = LogisticRegression() classifier_pca.fit(x_train_pca, y_train_pca) # 训练数据 from sklearn import metrics # accuracy 值 train_score_pca = classifier_pca.score(x_train_pca, y_train_pca) print("训练集数据测试的accuracy值为:{}".format(train_score_pca)) # 训练集数据评估指标报告 train_predict_pca = classifier_pca.predict(x_train_pca) print("训练集数据评估指标报告") print(metrics.classification_report(y_train_pca, train_predict_pca)) test_score_pca = classifier_pca.score(x_test_pca, y_test_pca) print("测试集数据测试的accuracy值为:{}".format(test_score_pca)) # 测试集数据评估指标报告 test_predict_pca = classifier_pca.predict(x_test_pca) print("测试集数据评估指标报告") print(metrics.classification_report(y_test_pca, test_predict_pca)) print("**************************************************************") # 切分原始数据集 x_train, x_test, y_train, y_test = \ train_test_split(x, y, test_size=0.2, random_state=0) classifier = LogisticRegression() classifier.fit(x_train, y_train) # accuracy 值 train_score = classifier.score(x_train, y_train) print("训练集数据测试的accuracy值为:{}".format(train_score)) # 训练集数据评估指标报告 train_predict = classifier.predict(x_train) print("训练集数据评估指标报告") print(metrics.classification_report(y_train, train_predict)) test_score = classifier.score(x_test, y_test) print("测试集数据测试的accuracy值为:{}".format(train_score)) # 测试集数据评估指标报告 test_predict = classifier.predict(x_test) print("测试集数据评估指标报告") print(metrics.classification_report(y_test, test_predict))
-
结果如下
-
由于此数据集的数据量太少,降维前后的模型训练结果基本差不多,在大的数据集中对比最终的结果可能会更加明显
四、PCA降维的优缺点
- 优点:
- 1.计算方法简单,容易实现。
- 2.可以减少指标筛选的工作量。
- 3.消除变量间的多重共线性。
- 4.在一定程度上能减少噪声数据。
- 缺点:
- 1.特征必须是连续型变量(可以在一定范围内连续取值的变量)。
- 2.无法解释降维后的数据是什么。
- 3.有时候贡献率小的成分有可能更重要,但是会被降维的时候舍弃掉。