轻松玩转 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

相关文章
|
18天前
|
机器学习/深度学习 数据采集 算法
Python机器学习:Scikit-learn库的高效使用技巧
【10月更文挑战第28天】Scikit-learn 是 Python 中最受欢迎的机器学习库之一,以其简洁的 API、丰富的算法和良好的文档支持而受到开发者喜爱。本文介绍了 Scikit-learn 的高效使用技巧,包括数据预处理(如使用 Pipeline 和 ColumnTransformer)、模型选择与评估(如交叉验证和 GridSearchCV)以及模型持久化(如使用 joblib)。通过这些技巧,你可以在机器学习项目中事半功倍。
24 3
|
23天前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
机器学习基础:使用Python和Scikit-learn入门
28 1
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第12天】本文介绍了如何使用Python和Scikit-learn进行机器学习的基础知识和入门实践。首先概述了机器学习的基本概念,包括监督学习、无监督学习和强化学习。接着详细讲解了Python和Scikit-learn的安装、数据处理、模型训练和评估等步骤,并提供了代码示例。通过本文,读者可以掌握机器学习的基本流程,并为深入学习打下坚实基础。
23 1
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习基础:使用Python和Scikit-learn入门
本文介绍了如何使用Python和Scikit-learn进行机器学习的基础知识和实践。首先概述了机器学习的基本概念,包括监督学习、无监督学习和强化学习。接着详细讲解了Python和Scikit-learn的安装、数据处理、模型选择与训练、模型评估及交叉验证等关键步骤。通过本文,初学者可以快速上手并掌握机器学习的基本技能。
53 2
|
1月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
65 1
|
1月前
|
机器学习/深度学习 人工智能 数据挖掘
机器学习基础:使用Python和Scikit-learn入门
【10月更文挑战第6天】在人工智能领域,机器学习已成为核心技术。本文指导初学者使用Python与Scikit-learn入门机器学习,涵盖基本概念、环境搭建、数据处理、模型训练及评估等环节。Python因简洁性及其生态系统成为首选语言,而Scikit-learn则提供了丰富工具,简化数据挖掘与分析流程。通过实践示例,帮助读者快速掌握基础知识,为进一步深入研究奠定坚实基础。
28 4
|
1月前
|
机器学习/深度学习 数据采集 算法
【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用
【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用
38 2
|
2月前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
136 8
|
2月前
|
机器学习/深度学习 Python
9-3|使用Python的scikit-learn库来训练一个逻辑回归模型,检测句子是否含有侮辱性内容:
9-3|使用Python的scikit-learn库来训练一个逻辑回归模型,检测句子是否含有侮辱性内容:
|
2月前
|
机器学习/深度学习 数据采集 算法
机器学习新纪元:用Scikit-learn驾驭Python,精准模型选择全攻略!
在数据爆炸时代,机器学习成为挖掘数据价值的关键技术,而Scikit-learn作为Python中最受欢迎的机器学习库之一,凭借其丰富的算法集、简洁的API和高效性能,引领着机器学习的新纪元。本文通过一个实际案例——识别垃圾邮件,展示了如何使用Scikit-learn进行精准模型选择。从数据预处理、模型训练到交叉验证和性能比较,最后选择最优模型进行部署,详细介绍了每一步的操作方法。通过这个过程,我们不仅可以看到如何利用Scikit-learn的强大功能,还能了解到模型选择与优化的重要性。希望本文能为你的机器学习之旅提供有价值的参考。
53 0