PCA降维
主成分分析(Principal Component Analysis,PCA)降维是一种广泛使用的无监督机器学习技术,主要用于数据预处理阶段,其目的是在尽量保留数据重要信息的前提下,减少数据的维度。
PCA 的原理
PCA 的核心思想是通过线性变换将原始数据投影到一组新的正交基上,这些新的基被称为主成分。主成分的选择遵循以下原则:第一个主成分方向是数据方差最大的方向,第二个主成分方向是与第一个主成分正交且方差次大的方向,以此类推。通过这种方式,我们可以用较少的主成分来近似表示原始数据,从而达到降维的目的。
代码实战:用 PCA 优化逻辑回归模型
1. 数据准备
首先,我们使用pandas库读取鸢尾花数据集。鸢尾花数据集包含 4 个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和 1 个标签(鸢尾花的品种),共 150 条数据。
import pandas as pddata = pd.read_csv('iris.csv')
数据划分
X = data.iloc[:, :-1]y = data.iloc[:, -1]
2. PCA 降维
接下来,使用sklearn库中的PCA模块进行降维操作。这里我们设置n_components=0.90,表示保留能够解释 90% 方差的主成分数量。
from sklearn.decomposition import PCApca = PCA(n_components=0.90) # 实例化PCA对象pca.fit(X) # 进行训练,不需要传入yprint('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))print(pca.explained_variance_ratio_)print('PCA降维后数据:')new_x = pca.transform(X)print(new_x) # 数据X在主成分空间中的表示,具体来说,这个方法将数据X从原始特征空间转换到主成分空间
通过上述代码,我们可以得到降维后保留的主成分所解释的方差比例,以及降维后的数据。
3. 模型训练与评估
为了对比降维前后模型的性能,我们分别使用降维后的数据和原始数据训练逻辑回归模型,并进行评估。
from sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn import metricsfrom sklearn.metrics import classification_reportxtrain, xtest, ytrain, ytest = train_test_split(new_x, y, test_size=0.2, random_state=0)xtrain1, xtest1, ytrain1, ytest1 = train_test_split(X, y, test_size=0.2, random_state=0)# 导入逻辑回归分类器classifier = LogisticRegression()classifier1 = LogisticRegression()classifier.fit(xtrain, ytrain)classifier1.fit(xtrain1, ytrain1)# 训练测试集train_pred = classifier.predict(xtrain)print(classification_report(ytrain, train_pred))test_pred = classifier.predict(xtest)print(classification_report(ytest, test_pred))print(classifier.score(xtest, ytest))train1_pred = classifier1.predict(xtrain1)print(classification_report(ytrain1, train1_pred))test1_pred = classifier1.predict(xtest1)print(classification_report(ytest1, test1_pred))print(classifier1.score(xtest1, ytest1))
通过对比分类报告和模型得分,我们可以直观地看到 PCA 降维对模型性能的影响。在这个例子中,降维后的数据虽然减少了特征维度,但模型依然保持了较高的准确率和召回率,说明 PCA 在保留数据关键信息的同时,还能简化模型结构,提高训练效率。
PCA降维参数
n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。简单来说:指定整数,表示要降维到的目标,【比如十维的数据,指定n_components=5,表示将十维数据降维到五维】如果为小数,表示累计方差百分比。0.9 copy : 类型:bool,True或者False,缺省时默认为True。 意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。 【按默认为True】 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算法来降维。一般来说,使用默认值就够了。【按默认设置即可】 Attributes属性: components_:array, shape (n_components, n_features) 指表示主成分系数矩阵 explained_variance_:降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。 explained_variance_ratio_:降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。【一般看比例即可 >90%】
总结与思考
PCA 降维是一种强大而有效的数据预处理技术,尤其适用于数据维度较高、存在冗余信息的场景。通过本文的实战案例,我们不仅了解了 PCA 的原理,还通过代码验证了其在实际应用中的效果。
然而,PCA 也并非完美无缺。它是一种无监督学习方法,在降维过程中没有考虑数据的标签信息,可能会丢失一些对分类任务至关重要的特征。此外,PCA 的结果依赖于数据的分布,对于非线性数据,降维效果可能不理想。
在实际应用中,我们需要根据数据特点和任务需求,合理选择降维方法,灵活运用 PCA 等技术,为机器学习模型的优化提供有力支持。希望本文能帮助你更好地理解和应用 PCA 降维技术,在数据科学的道路上更进一步!
以上代码展示了 PCA 降维在鸢尾花数据集上的应用效果。你若想尝试其他数据集,或调整模型参数,都能探索出更多有趣的结果,欢迎和我分享你的想法