| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> sklearn实战之降维算法PCA与SVD -> 正文阅读 |
|
[人工智能]sklearn实战之降维算法PCA与SVD |
sklearn实战系列: 四、sklearn中的降维算法PCA和SVD1、sklearn中的降维算法sklearn中降维算法都被包括在模块decomposition中,这个模块本质是一个矩阵分解模块。在过去的十年中,如果要讨论算法进步的先锋,矩阵分解可以说是独树一帜。矩阵分解可以用在降维,深度学习,聚类分析,数据预处理,低纬度特征学习,推荐系统,大数据分析风领域中。在2006年,Netflix举办了一个奖金为100万美元的推荐系统算法的比赛,最后的获奖者就使用了矩阵分解中的明星:SVD分解(奇异值分解)。
SVD和主成分分析PAce都属于矩阵分解算法中断的入门算法,都是通过分解特征矩阵来进行降维,他们也是我们要学习的重点! 2、PCA与SVD在降维过程中,我们会减少特征的数量,这意味着删除数据,数据亮变少则表示模型可以获取的信息就会变少,模型的表现可能因此受影响。同时,在高维数据中,必然有一些特征是不带有效信息的(比如噪声),或者,有些特征带有的信息和其他一些特征是重读的(比如一些特征可能会线性相关)。我们希望能够找出一种办法来帮助我们衡量特特征上所带的信息量,让我们在降维的过程中,能够既减少特征的数量,又保留大部分有效信息——将那些带有重复信息的特征合并,并删除那些无效信息的特征等等——组件创造出能够代表原特征矩阵大部分信息的,特征更少的,新特征矩阵。 上周的特征工程课中,我们提到过一种重要的特征选择方法:方差过滤。如果一个特征的方差很小,则意味这这个特征可能很大程度上有大量取值都相同(比如90%是1,甚至100%是1),那这个特征的取值对样本而言就没有区分度,这种特征就不带有有效信息。从方差的这种应用就可以推断出,如果一个特征的方差很大,则说明这个特征上带大量的信息。因此,在降维中,PCA使用的信息量衡量指标就是样本方差,又可称为可解释性方差,方差越大,特征所带的信息也就越多。 面试高危问题 方差计算公式中为什么除数是n-1? 这是为了得到样本的无偏估计,更多的大家自己去探索吧~ 2.1 降维究竟是怎样实现?2.2 重要参数n_componentsn_components是我们降维后需要的维度,即降维后需要保留的特征数量,降维流程中第二步里需要确认的K值,一般输入[0,min(X.shape)]范围中的证书。一说到K,大家可能都会想到,类似于KNN中的K和随机森林中的n_estimators。这是一个需要我们认为去确定的超参数,并且我们设定的数字会影响到模型的表现。如果留下的特征太多,就达不到降维的效果,如果留下的特征太小,那新特征可能无法容纳原始数据集中的大部分信息,因此,n_components既不能太大也不能太小。那应该怎么选择呢? 可以先从我们的降维目标开始说起:如果我们希望可视化一组数据来观察数据分布,我们往往将数据降到三维以下,很多时候是二维,即n_components的取值是2。 2.2.1 迷你案例:高维数据的可视化1、调用库和模块
2、提取数据集
3、建模
4、可视化
鸢尾花的分布被展现在我们眼前了,明显这是一个分簇的分布,并且每个簇之间的分布相对比较明显,也许 versicolor和virginia这两种花之间会有一些分类错误,但setosa肯定不会被分错。这样的数据很容易分类,可以遇 见,KNN,随机森林,神经网络,朴素贝叶斯,Adaboost这些分类器在鸢尾花数据集上,未调整的时候都可以有 95%上下的准确率。 6、探索降维后的数据
7、选择最好的n_components:积累可解释方差贡献率曲线 当参数n_components中不填写任何值,则默认返回min(X.shape)个特征,一般来说,样本量都会大于特征数目,所以什么都不填就相当于转换了新特征孔家,但没有减少特征的个数。一般来说,不会使用这种输入方式。但我们却可以使用这种输入方式画出累计可解释方差贡献率曲线,以此选择最好的n_components的整数取值。 累计可解释方差贡献曲线是一条以降维后新特征矩阵捕捉到的可解释方差贡献率为纵坐标,能够帮助我们解决n_components最好的取值。
2.2.2 最大似然估计自选超参数除了输入证书,n_components还有哪些选择呢?矩阵分解的理论发展在业界独树一帜,勤奋智 慧的数学大神Minka, T.P.在麻省理工学院媒体实验室做研究时找出了让PCA用最大似然估计(maximum likelihood estimation)自选超参数的方法,输入“mle”作为n_components的参数输入,就可以调用这种方法。
2.2.3 按信息量占比选超参数输入[0,1]之间的浮点数,并且让参数svd_slover==“full”,表示希望降维后的总解释性方差占比大于n_components指定的百分比,即是说,希望保留百分之多少的信息量。比如说,如果我们希望暴力流97%的信息量,就可以输入n_components=0.97,PCA就会自动选出能够让保留的信息量超过97%的特征数量。
2.3 PCA中的SVD2.3.1 PCA中的SCD哪里来的?细心的同学可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有关奇异值分解的参数?不是两种算法吗?我们之前曾经提及过,PCA和SVD设计了大量的矩阵计算,两者都是计算量很大的模型,但是其实,SVD有一种惊人的数学性质,即是它可以跳过数学神秘的宇宙,不计算协方差矩阵,直接找出一个新特征向量组成的n维空间,而这个n维空间就是奇异值分解后的右矩阵 V T V^T VT(所以一开始讲解降维过程中,我们说到的“生成新特征向量组成的空间V“,并非巧合,而是指奇异值分解后的矩阵 V T V^T VT)。 右奇异值矩阵
V
T
V^T
VT有着如下性质: 简而言之,SVD在矩阵分解中的过程比PCA简单快速,虽然两个算法都走一样的分解流程,但SVD可以作弊耍赖直接算出V。但遗憾的是,SVD的信息量衡量指标比较复杂,要理解”奇异值”比理解方差来的容易,因此sklearn将降维流程拆成了两部分:一部分似乎计算特征空间V,由于奇异值分解完成,另一部分是映射数据和求解新特征矩阵,有主成分分析完成,实现了有用SVD的性质减少计算量,却让信息量的评估指标是方差,具体流程如下图: 讲到这里,相信大家就能理解,为什么PCA的类里会包含控制SVD分解器的参数了。通过SVD和PCA的合作,sklearn实现了一种计算更快更简单,但效果却很好的“合作降维”。很多人理解SVD,是把SVD当作是PCA的一种求解方法,但在sklearn中,矩阵U和Σ虽然会被计算出来(童颜也是一种比起PCA来说简化非常多的数学过程,不产生协方差矩阵),但完全不会被用到,也无法调取查看或者使用,因此我们可以认为,U和Σ在fit过后就被遗弃了。奇异值分解追求的仅仅是V,只要有了V,就可以计算出降维后的特征矩阵。在transform过程之后,fit中奇异值分解的结果除了V(k,n)以外,都会被舍弃,而V(k,n)会被保留在属性components_当中,可以调用查看。
输出:
2.3.2 重要参数svd_solver与random_state参数svd_solver是在降维过程中,用来控制矩阵分解的一些细节的参数。有四种模式可以选:“auto”,“full”,“arapck”,“randomized”,默认"auto"。
U ( m , m ) , Σ ( m , n ) , V ( n , n ) T U_{(m,m)},Σ_{(m,n)},V_{(n,n)}^T U(m,m)?,Σ(m,n)?,V(n,n)T?
U ( m , k ) , Σ ( k , k ) , V ( n , n ) T U_{(m,k)},Σ_{(k,k)},V_{(n,n)}^T U(m,k)?,Σ(k,k)?,V(n,n)T?
而参数random_state在参数svd_solver的值为"arpack" or "randomized"的时候生效,可以控制这两种SVD模式中 的随机模式。通常我们就选用”auto“,不必对这个参数纠结太多。 2.3.3 重要属性components_现在我们了解了,V(k,n)是新特征空间,是我们要将原始数据进行映射的那些新特征向量组成的矩阵,我们用它来计算新的特征矩阵,但我们希望获取的是X_dr,为什么我们要把V(k,n)这个矩阵保存在n_components这个属性当中来让大家调取查看呢? 我们之前谈过PCA和特征选择的区别,即特征选择后的特征矩阵是可解读的,而PC啊降维后的特征矩阵是不可解读的:PCA是将已经存在的特征进行压缩,降维完毕后的特征已经不是原本特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征,通常来说,在新的特征矩阵生成之前,我们都无法知晓PCA都建立了怎样的新特征向量,新特征矩阵生成之后也不具有可读性,我们就无法判断新特征矩阵的特征是从原数据中的什么特征组合而来的,新特征虽然带有原始数据的信息,却已经不是原数据上代表的含义了。 但是其实,在矩阵分解时,PCA时有目标的:在原特征的基础上,找出能够让信息尽量聚集的新特征向量。在 sklearn使用的PCA和SVD联合的降维方法中,这些新特征向量组成的新特征空间其实就是V(k,n)。当V(k,n)是数字 时,我们无法判断V(k,n)和原有的特征究竟有着怎样千丝万缕的数学联系。但是,如果原特征矩阵是图像,V(k,n)这 个空间矩阵也可以被可视化的话,我们就可以通过两张图来比较,就可以看出新特征空间究竟从原始数据里提取了 什么重要的信息。 让我们来看一个,人脸识别中属性components_的运用。 1、导入需要的库和模块
2、实例化数据集,探索数据
3、看看图像什么样?将原特征矩阵进行可视化
输出: 4、建模降维,提取新特征空间矩阵
输出(150,2914) 5、将新特征空间矩阵可视化
输出: 这张图稍稍有一些恐怖,但可以看出,比起降维前的数据,新特征空间可视化后的人脸非常模糊,这是因为原始数据还没有被映射到特征空间中。但可以看出,整体比较亮的图片,获取的信息较多,整体较暗的图片,却智能看到漆黑的一片。在比较亮的图片中,眼睛,鼻子,嘴巴等五官都相对清晰,脸的轮廓,头发之类的比较模糊。 这说明,新特征空间里的特征向量们,大部分是”五官“和”亮度“相关的向量,所以新特征向量上的信息肯定大部分是由原数据中的”五官“和”亮度“相关的特征中提取出来的。到这里,我们通过可视化新特征空间X,解释了一部分降维后的特征:虽然显示出来的数字看着不知所云,但画出来的图表示,这些特征是和”无关“以及”亮度“相关的。这也再次证明了,PCA能够啊将原始数据集中重要的数据进行聚集。 2.4 重要接口inverse_transform在上篇的特征工程中,我们学到了神奇的接口inverse_transform,可以将我们归一化,标准化,甚至做过哑变量的特征矩阵还原回原始数据中的特征矩阵,这几乎向我们暗示,任何有inverse_transform这个接口的过储层都是可逆的。PCA应该也是如此。在sklearn中,我们通过让原特征矩阵X右乘新特征空间矩阵V(k,n)来生成新特征矩阵X_dr,那理论上来说,让新特征矩阵X_dr右乘V(k,n)的逆矩阵 V ( k , n ) ? 1 V_{(k,n)}^{-1} V(k,n)?1?,就可以将新特征矩阵X_dr还原为X。那sklearn是否这样做了呢?让我们来看看下面的案例。 2.4.1 迷你案例:用人脸识别看PCA降维后的信息保存量人脸识别是容易的,用来探索inverse_transform功能的数据。我们先调用一组人脸数据X(m,n),对人脸图像进行绘制,然后我们对人脸数据进行降维得到X_dr,zhi后再使用inverse_transform(X_dr)返回一个X_transform(m,n),并对这个新矩阵中的人脸图像也进行绘制。如果PCA的降维过程是可逆的,我们应当期待X(m,n)和X_transform(m,n)返回一摸一样的图像,即携带一摸一样的信息。 1、导入需要的模块和库
2、导入数据并探索
3、渐浓降维,获取降维后的新特征矩阵X_dr
4、将降维后的矩阵用inverse_transform返回原空间
5、将特征矩阵X和X_inverse可视化
可以明显看出,这两组数据可视化后,由降维后再通过inverse_transform转换回原维度的数据画出的图像和原数 据画的图像大致相似,但原数据的图像明显更加清晰。这说明,inverse_transform并没有实现数据的完全逆转。 这是因为,在降维的时候,部分信息已经被舍弃了,X_dr中往往不会包含原数据100%的信息,所以在逆转的时 候,即便维度升高,原数据中已经被舍弃的信息也不可能再回来了。所以,降维不是完全可逆的。 Inverse_transform的功能,是基于X_dr中的数据进行升维,将数据重新映射到原数据所在的特征空间中,而并非 恢复所有原有的数据。但同时,我们也可以看出,降维到300以后的数据,的确保留了原数据的大部分信息,所以 图像看起来,才会和原数据高度相似,只是稍稍模糊罢了。 2.4.2 迷你案例:用PCA做噪音过滤降维的目的之一就是希望抛弃掉对模型带来负面影响的特征,而我们相信,带有效信息的特征的方差应该是远大于 噪音的,所以相比噪音,有效的特征所带的信息应该不会在PCA过程中被大量抛弃。inverse_transform能够在不 恢复原始数据的情况下,将降维后的数据返回到原本的高维空间,即是说能够实现”保证维度,但去掉方差很小特 征所带的信息“。利用inverse_transform的这个性质,我们能够实现噪音过滤。 1、导入所需要的库和模块
2、导入数据,探索数据
3、自定义画图函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fys0hIpY-1629554113021)(D:typora/picture/噪声前.jpg)] 4、为数据加上噪音
5、降维
6、逆转降维结果,实现降噪
2.5 重要接口,参数和属性总结到现在,我们已经完成了对PCA的讲解。我们讲解了重要参数参数n_components,svd_solver,random_state, 讲解了三个重要属性:components_, explained_variance_以及explained_variance_ratio_,无数次用到了接口 fit,transform,fit_transform,还讲解了与众不同的重要接口inverse_transform。所有的这些内容都可以被总结 在这张图中: 3、案例:PCA对手写数字数据集的降维还记得我们上次在介绍特征工程时,使用的手写数字的数据集吗?数据集结构为(42000, 784),用KNN跑一次半小 时,得到准确率在96.6%上下,用随机森林跑一次12秒,准确率在93.8%,虽然KNN效果好,但由于数据量太大, KNN计算太缓慢,所以我们不得不选用随机森林。我们使用了各种技术对手写数据集进行特征选择,最后使用嵌入 法SelectFromModel选出了324个特征,将随机森林的效果也调到了96%以上。但是,因为数据量依然巨大,还是 有300多个特征。今天,我们就来试着用PCA处理一下这个数据,看看效果如何。 1、导模块和库
2、导入数据
3、画累计方差贡献曲线,找最佳降维后维度的范围
4、降维后的学习曲线,继续缩小最佳的范围
5、细化学习曲线,找出降维后的最佳维度
6、导入找出最佳的维度进行降维,并查看模型效果
模型效果还好,跑出了94.49%的水平,但还是没有我们使用嵌入法特征选择过后的96%高,有没有什么办法能够 提高模型的表现呢? 7、 突发奇想,特征数量已经不足原来的3%,换模型怎么样? 在之前的建模过程中,因为计算量太大,所以我们一直使用随机森林,但事实上,我们知道KNN的效果比随机森林 更好,KNN在未调参的状况下已经达到96%的准确率,而随机森林在未调参前只能达到93%,这是模型本身的限制 带来的,这个数据使用KNN效果就是会更好。现在我们的特征数量已经降到不足原来的3%,可以使用KNN了吗?
8、KNN的K值得学习曲线
9、定下超参数后,模型效果如何,模型运行时间如何?
可以发现,原本785列的特征被我们缩减到23列之后,用KNN跑出了目前位置这个数据集上最好的结果。再进行更 细致的调整,我们也许可以将KNN的效果调整到98%以上。PCA为我们提供了无限的可能,终于不用再因为数据量 太庞大而被迫选择更加复杂的模型了! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 18:43:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |