轻松玩转 Scikit-Learn 系列 —— 你居然不知道 PCA ?

简介: PCA 的全称是 Principal Component Analysis,翻译过来就是主成分分析法,是数据分析中常用的数据降维方法,亦是一种学习数据表示的无监督学习算法。在讨论 PCA 之前,让我们先考虑下机器学习中的数据。

PCA 的全称是 Principal Component Analysis,翻译过来就是主成分分析法,是数据分析中常用的数据降维方法,亦是一种学习数据表示的无监督学习算法。在讨论 PCA 之前,让我们先考虑下机器学习中的数据。


对于一般的机器学习模型,每一种确定的机器学习模型都可以用一个确定的函数或函数族来表示。而我们都知道深度学习与一般的机器学习是有差异的,深度学习是个“能吃能干”的人。如果你不让他吃够,他一般也不会好好给你干活,当然他也特别能干,什么都会干!


翻译过来就是:只要数据集足够大,质量有保障,就会有不错的输出。也就是说,你给了他输入和输出,他就能学习到输入映射到输出的函数(通用近似定律),这就相当于它能够学习到各种一般机器学习所代表的模型。


所以,无论是机器学习,还是深度学习,都需要学习一个训练数据集所表示的模型,先验模型与学习到的模型符合度高的话,当然会有不错的准确率。而这个学习的过程,当然学习的就是各个训练样本的差异,而我们所希望的就是所有训练样本的差异性组合起来能够准确地表示整个模型,这样模型会具有更好的泛化能力。


PCA 在降维时,就是着重保留这种差异性,使得数据在降维后,数据的差异性损失最小化。PCA 常使用的差异性指标是方差。比方说,我们有一组 N 维数据,要将这组数据降到 N-1 维,那我们所要做的就是在一个 N 维空间中找一个 N-1 维子空间,使得该数据集投影到 N-1 维子空间后的方差最大。所以,PCA 降维问题最后又归结为最值优化问题。下图左为原始数据,图右为降维后数据。

66.jpg


scikit-learn 中的 PCA 默认使用奇异值分解将数据降维到低维空间。同时 scikit-learn 也提供了丰富且简洁友好的 API 接口供使用者调用。以下用代码具体展示:

67.jpg

68.png69.jpg70.jpg71.jpg


在上面的代码中,我们创建了一个符合线性趋势带有噪音的数据集,然后使用 PCA 将这个数据集降维,为了便于在坐标系中可视化,使用 scikit-learn 中 PCA 模型的 inverse_transform 方法重新升维成二维,所有在点就很神奇的落在一条直线上。


其实,只要数据发生降维,数据的有效信息就会不可避免的发生丢失,信息一旦丢失就找不回来了。所以,在上图中,我们将降维后的数据重新升维(变成二维),将产生的数据可视化,数据呈现线性关系,全部落在一条直线上,而原始数据则在这条直线附近上下波动, 用 PCA 降维后,的确让原始数据的部分信息丢失,从而让数据更简单,更有规律。


但是,如果数据本来就是线性的,只是因为测量设备精度问题,测量方法原理问题,或者测量人员的马虎大意导致了数据的波动,那么使用PCA处理数据可以使建模更精准,因此 PCA 也广泛用于数据降噪。


当然,有时为了数据的处理或者可视化等目的,就必学做出某种取舍,还是没有免费的午餐定理,每一种算法是完美的,所有优势兼得的。接下来我们介绍下 scikit-learn 中的模型超参数,并换一个稍微正规点的数据集演练下(主要对比训练时间和准确率)。


  • n_components:需要保留成分的个数,默认 n_components = min(n_samples, n_features),这时 n_components 为正整数。如果 n_components 为小数(0<n_components<1),则算法自动确定保留成分个数以确保原数据不少于 n_components="" 的方差被保留下来百分比;<="" n_components<1),则算法自动确定保留成分个数以确保原数据不少于=""></n_components<1),则算法自动确定保留成分个数以确保原数据不少于>
  • copy:默认为 TRUE,如果被设成 False,则被传入 fit() 方法的数据会被复写;
  • svd_solver:用于选择奇异值分解的方法,默认 svd_solver=’auto’;
  • tol:表示由 svd_solver == ‘arpack’ 计算奇异值的容差,默认tol=0.0;
  • random_state:用于播种随机种子;

72.jpg73.png74.jpg


然后我们对手写数字识别数据集使用 PCA 降维,然后创建模型进行训练。

75.jpg


从以上两个模型的对比可知,模型2通过 PCA 数据降维的确加快了模型的训练速度,但是也牺牲了模型的准确度。也可能是我们是我们降维降过头了,已知手写字符识别数据集是 8X8 的灰度图,也就是64维,我们直接只取2维确实有些过分。接下来我们试下超参数 n_components 的另外一种用法:

76.jpg


由 n_components 所代表的超参数含义可知,以上两个实例化的 PCA 模型分别表示:当要保留90%的方差时,则至少要保留21维主成分的数据;当要保留80%的方差时,至少要保留13维主成分的数据。


其实,在 scikit-learn 的 PCA 类中,还封存了一些比较逆天的方法—— explained_variance,实例化一个 PCA 类后,直接调用它可以返回每一个成分对应可代表的方差的数量;explained_variance_ratio 可以直接返回各个方差所可表示的方差的百分比。


例如,我们下面直接令 n_components=X.shape[1],即保留数据集的所有维度,然后调用 explained_variance_ratio_ 方法就可以得到手写数字识别数据集变形后的主成分每一维可解释的方差的比率。可以看到,经过 PCA 计算之后的各个主成分所能够表示的方差所占的比率是降序的。

77.jpg


最后可视化下 scikit-learn 中手写数字识别数据集 PCA 降维后的二维分类结果来结束今天的分享。

77.jpg78.jpg

相关文章
|
10天前
|
机器学习/深度学习 算法 数据挖掘
|
12天前
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。
|
28天前
|
机器学习/深度学习 人工智能 算法
如何使用Scikit-learn在Python中构建一个机器学习分类器
如何使用Scikit-learn在Python中构建一个机器学习分类器
17 3
|
14天前
|
机器学习/深度学习 运维 数据挖掘
scikit-learn 1.0 版本重要新特性一览
scikit-learn 1.0 版本重要新特性一览
|
15天前
|
机器学习/深度学习 数据挖掘 Python
简单几步,教你使用scikit-learn做分类和回归预测
简单几步,教你使用scikit-learn做分类和回归预测
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
智能决策新引擎:Python+Scikit-learn,打造高效数据分析与机器学习解决方案!
【7月更文挑战第26天】在数据驱动时代,企业需从大数据中提取价值以精准决策。Python凭借丰富的库成为数据分析利器,而Scikit-learn作为核心工具备受青睐。本文通过电商案例展示如何预测潜在买家以实施精准营销。首先进行数据预处理,包括清洗、特征选择与转换;接着采用逻辑回归模型进行训练与预测;最后评估模型并优化。此方案显著提升了营销效率和企业决策能力,预示着智能决策系统的广阔前景。
54 2
|
30天前
|
机器学习/深度学习 算法 数据挖掘
机器学习新手也能飞:Python+Scikit-learn让你轻松入门!
在数据驱动的时代,机器学习是推动科技进步和智能化生活的关键。Python以简洁的语法和强大的库支持,成为机器学习的理想语言。Scikit-learn作为Python的开源机器学习库,提供简单易用的API和丰富的算法,降低了学习门槛。通过Python结合Scikit-learn,即使是初学者也能快速上手,如使用鸢尾花数据集进行分类任务,体验从数据预处理到模型训练和评估的全过程,进而探索更多机器学习的可能性。
34 0
|
2月前
|
机器学习/深度学习 数据采集 算法
告别盲目试错!Scikit-learn助你科学评估模型,精准定位性能瓶颈!
【7月更文挑战第27天】在机器学习项目中, Scikit-learn提供了一套强大的工具来优化模型性能。首先, 利用`StandardScaler`等工具进行数据预处理确保一致性。接着, 选择合适的模型进行训练, 如`RandomForestClassifier`。之后, 采用交叉验证评估模型性能, 减少过拟合风险。最后, 使用`GridSearchCV`等工具精确定位性能瓶颈并优化模型参数。这种方法科学高效, 大幅提升了模型性能, 推动项目成功实施。
22 0
|
2月前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
【7月更文挑战第27天】在数据驱动时代,Python以丰富的库成为数据科学首选。Scikit-learn因简洁高效而备受青睐,引领数据分析革命。本文引导您使用Scikit-learn简化机器学习流程。首先通过`pip install scikit-learn`安装库。接着使用内置数据集简化数据准备步骤,例如加载Iris数据集。选择合适的模型,如逻辑回归,并初始化与训练模型。利用交叉验证评估模型性能,获取准确率等指标。最后,应用训练好的模型进行新数据预测。Scikit-learn为各阶段提供一站式支持,助力数据分析项目成功。
39 0
|
2月前
|
机器学习/深度学习 数据采集 算法
数据驱动的未来已来:利用Scikit-learn,解锁Python数据分析与机器学习新境界!
【7月更文挑战第26天】在信息爆炸时代,数据成为核心驱动力,Python以其强大的库如Scikit-learn在数据分析与机器学习中扮演重要角色。Scikit-learn简化了数据预处理、模型选择与训练及评估流程。数据预处理涉及清洗、特征选择和缩放;模型训练推荐使用如随机森林等算法;模型评估则可通过准确性、报告和网格搜索优化参数。借助Scikit-learn,开发者能更专注业务逻辑和数据洞察,有效推进数据驱动决策。
19 0