| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> sklearn实战之随机森林 -> 正文阅读 |
|
[人工智能]sklearn实战之随机森林 |
sklearn实战系列: 二、随机森林0、概述0.1集成算法概述集成学习是时下非常流行的机器学习算法,它本身不是一个单独的机器学习模型,而是在以往的数据上构建多个模型,集成所有模型的建模结果,基本上所有机器学习领域都可以看到集成学习的身影,在显示中集成学习也有相当大的作用,它可以用来做市场营销模拟的建模,统计客户俩元,保留和损失,也可以用来预测疾病的风险和患病者的易感性。在现在的各种算法竞赛中,随机森林,梯度提升树,XGBoost等集成算法的身影也随处可见,可见其效果之好,应用之广。 集成算法的目标:集成算法会考虑多个评估器的建模效果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现。 多个模型集成成为的模型叫做集成评估其(ensemble estimator),组成的集成评估器的每个模型都叫做基评估器(base estimator)。通常来说,有三类集成算法:袋装(bagging),提升法(Boosting),和Stacking。 装袋法的核心思想是构建多个相互独立的评估器,然后对其预测进行平均或者多数表决原则来决定集成评估其的结果,装袋法的代表模型是随机森林。 提升法中,基评估其是相关的, 是按照顺序一一构建的,其核心思想是结合弱评估其的力量一次次对难以评估的样本进行预测,从而构成一个强评估器。其典型模型是 1、Sklearn中的集成算法
2、RandomForestClassifier
随机森林是非常具有代表性的Bagging集成算法,它所有的基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树组成的森林就叫做随机森林回归器。这一讲主要是讲解RandomForestClassifier,随机森林分类器。 2.1 重要参数2.2.1 控制基评估器的参数
2.1.2 n_estimator这是森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimator越大,模型的效果越好。但相应的,任何模型都有决策边界,n_estimator达到一定程度后,随机森林的精确性往往不再上升或开始波动,并且,n_estimator越大,需要的计算量和内存也就越大,训练的时间也会越来越长,对于这个参数,我们是渴望在训练难度和模型效果之间取得 平衡。
树模型的有点是简单易懂,可视化后的树人人都能看懂,可惜随机森林是无法可视化的。所以为了更加直观地让大家体会到随机森林的效果,我们来进行一个随机森林和当个决策树的效益的对比,我们依然使用红酒数据集。 1、导入我们需要的包
2、导入需要的数据集
3、复习sklearn建模的基本流程
4、画出随机森林和决策树在一组交叉验证下的效果对比
5、画出随机森林和决策树在10组交叉验证下的效果比较
6、n_estimators学习曲线
思考:随机森林用了什么方法,来保证集成的效果一定好于单个分类器? 2.1.3 random_state随机森林的本质是一种袋装集成算法(Bagging),袋装集成算法是对基评估器的预测结果进行平均或用多数表决原则来决定集成评估器的结果。在刚才的红酒例子中,我们建了25棵树,对于任何一个样本而言,平均或多数表决原则下,当且仅当有13课树以上的树判断错误的时候,随机森林才会判断错误。单独一颗决策树对红酒数据集的分类准确率在0.85上下浮动,假设一颗树判断错误的可能性为0.2(ε),那20棵树以上都判断错误的可能性是: 其中,i是判断错误的次数,也是判错的树的数量,ε是一棵树判断错误的概率,(1-ε)是判断正确的概率,共判对 25-i次。采用组合,是因为25棵树中,有任意i棵都判断错误。 可见,判断错误的几率非常小,这让随机森林在红酒数据集上的表现远远好于单颗决策树。 那现在就有一个问题了:我们说袋装法服从少数服从多数原则或对基分类器结果取平均,这即是说,我们默认森林中的每棵树应该是不同的,并且会返回不同的结果,设想以下,如果随机森林里所有的树的判断结果都一致(全判对或全判错),那随机森林无论应用何种集成原则来求结果,都应该无法比单颗决策树取得更好的效果才对,但我们使用了一样的类,一样的参数,一样的训练集和测试集,为什么随机森林里的众多树会有不同的判断结果呢? 问到这个问题,我们或许就可以想到了:sklearn中的分类树DecisionTreeClassifier自带随机性,所以随机森林中的树天生就是不一样的,我们在讲解分类树的时曾提到,决策树从最重要的特征中随机选择出一个特征来进行分支,因此每次生成的决策树都是不一样的,这个功能便是由random_state控制。 随机森林中也有random_state,用法和分类树相似。只不过在分类树中,一个random_state只能控制生成一棵树,而随机森林的random_state控制的是生成森林的模式,并非是让森林中只有一棵树。
输出:
我们可以观察到,当random_state固定时,随机森林中生成是一组固定的树,但每棵树依然是不一致的,这是 用”随机挑选特征进行分枝“的方法得到的随机性。并且我们可以证明,当这种随机性越大的时候,袋装法的效果一 般会越来越好。用袋装法集成时,基分类器应当是相互独立的,是不相同的。 但这种做法的局限性是很强的,当我们需要成千上万棵树的时候,数据不一定能够提供成千上万的特征来让我们构 筑尽量多尽量不同的树。因此,除了random_state。我们还需要其他的随机性。 2.1.4 boostrap & oob_score要让基分类器尽量都不一样,一种很容易理解的方法是使用不同的训练集来进行训练,而袋装法正是通过有放回的随机抽样技术来形成不同的训练数据,boostrap就是用来控制抽样技术的参数。 在一个含有n个样本的原始训练集中,我们进行随机采样,每采一个样本,并在抽取下一个样本之前讲将该样本放回原始训练集,也就是说,在下次采样时,这个样本依然有可能被采集到,这样采集n次,最终得到一个和原始训练集一样大,n个样本组成的自助集。由于随机采样,使得每次的自助集和原始数据集不同,和其他的采样集也不同。这样我们就可以自由地创造取之不尽用之不竭,并且互不相同的自助集,用这些自助集来训练我们的基分类器,我们的基分类器也就各不相同了。 boostrap参数默认True,代表采用又放回的随机抽样技术。通常,这个参数不会被我们设置为False。 然而Boostrap也会有自己的问题。由于有放回,一些样本可能在同一个自助集中出现多次,而其他一些却可能被忽略。一般来说,自助集大约平均会包含63%的原始数据。因为每一个样本被抽到某一个自助集的概率为: 如果希望用袋外数据来测试,则在实例化时需要将oob_score这个参数调整为True,训练完毕时,我们可以用随机森林的另外一个重要属性哦:oob_score_来查看我们的模型在袋外数据上测试的结果。
2.2 重要属性和接口至此,我们已经讲完了所有随机森林中的重要参数,并通过n_estimators, random_state,boostrap和oob_score这四个参数帮助大家了解了袋装法的基本流程和重要概念。同时,我们还 介绍了.estimators_ 和 .oob_score_ 这两个重要属性。除了这两个属性之外,作为树模型的集成算法,随机森林 自然也有.feature_importances_这个属性。 随机森林的接口和决策树完全一致,因此依然有四个常用接口:apply(apply返回每个测试样本所在的叶子节点的索引),fit,predict,score。除此之外,还需要注意随机森林内的predict_proba接口,这个接口返回每个测试样本对应被分到每一类标签的概率,标签有几个分类就返回几个概率,如果是二分类问题,则predict_proba返回的数值大于0.5的,被分为1,小于的被分为0。传统的随机森林是利用袋装法中的规则,平均或少数服从多数来决定集成的结果,而sklearn中的随机森林是平均每个样本对应的predict_praba返回的概率,得到一个平均概率,从而决定测试样本的分类。 掌握了上面的知识,基本上要实现随机森林分类已经是没问题了。从红酒数据集的表现上来看,随机森林的效用比 单纯的决策树要强上不少。 Bonus:Bagging的另一个必要条件之前我们说过,在使用袋装法时应要求基评估器要尽量独立,其实,袋装法还有另外一个必要条件:基分类器的判断准确率至少要超过随机分类器。即说:基分类器的判断准确率至少要超过50%,之前我们展示过的随机森林的准确率公式,基于这个公式,我们画出了基分类器的准确率率ε和随机森林的误差率之间的图像。大家可以自己运行一 下这段代码,看看图像呈什么样的分布。
可以从图像上看出,当基分类器的误差率小于0.5,即准确率大于0.5时,集成的效果是比基分类器要好的。相反, 当基分类器的误差率大于0.5,袋装的集成算法就失效了。所以在使用随机森林之前,一定要检查,用来组成随机 森林的分类树们是否都有至少50%的预测正确率。 3、RandomForestRegressor
所有的参数,属性与接口,全部和随机森林分类器一致。仅有的不同就是回归树与分类树的不同,不纯度的指标, 参数Criterion不一致。 3.1 重要参数,属性和接口3.1.1 重要参数
回归树衡量分支质量的指标,支持的指标有以下三种: (1)输入"mse"均方误差(mean squared error)。父节点和叶节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过对叶子节点的均值来最小化L2损失。 (2)输入”fredman_mse“使用费尔德曼均方误差,这种指标使用福利费尔德曼针对潜在分支中的问题改进后的均方误差 (3)输入”mae“使用绝对平均误差MAE(mean absolute error),这指标使用叶节点的中值来最小化 L1损失。
R方定义如下:
值得一提的是,虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算”负均方误 差“(neg_mean_squared_error)。这是因为sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均 方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss),因此在sklearn当中,都以负数表示。真正的 均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字。 3.1.2 重要属性和接口最重要的属性和接口,都与随机森林的分类器相一致,还是apply, fit, predict和score最为核心。值得一提的是,随机森林回归并没有predict_proba这个接口,因为对于回归来说,并不存在一个样本要被分到某个类别的概率问题,因此没有predict_proba这个接口。
和决策树完全相同,多了参数n_estimators
返回十次交叉验证的结果,注意在这里,如果不填写scoring = “neg_mean_squared_error”,交叉验证默认的模型 衡量指标是R平方,因此交叉验证的结果可能有正也可能有负。而如果写上scoring,则衡量标准是负MSE,交叉验 证的结果只可能为负。 3.2 实例:用随机森林回归填补缺失值我们从现实中收集的数据,几乎不可能是完美无缺的,往往都会有一些缺失值。面对缺失值,很多人选择的方式是 直接将含有缺失值的样本删除,这是一种有效的方法,但是有时候填补缺失值会比直接丢弃样本效果更好,即便我 们其实并不知道缺失值的真实样貌。在sklearn中,我们可以使用sklearn.impute.SimpleImputer来轻松地将均 值,中值,或者其他最常用的数值填补到数据中,在这个案例中,我们将使用均值,0,和随机森林回归来填补缺 失值,并验证四种状况下的拟合状况,找出对使用的数据集来说最佳的缺失值填补方法。 1、导入需要的库
2、以波士顿数据集为例,导入完整的数据集并探索
3、**为完整数据集放入缺失值 **
4、使用0和均值填补缺失值
5、使用随机森林填补缺失值 任何回归都是从特征矩阵中学习,然后求解连续型标签y的过程,之所以能够实现这个过程,是因为回归算法认为,特征 矩阵和标签之前存在着某种联系。实际上,标签和特征是可以相互转换的,比如说,在一个“用地区,环境,附近学校数 量”预测“房价”的问题中,我们既可以用“地区”,“环境”,“附近学校数量”的数据来预测“房价”,也可以反过来, 用“环境”,“附近学校数量”和“房价”来预测“地区”。 而回归填补缺失值,正是利用了这种思想。 对于一个有n个特征的数据来说,其中特征T有缺失值,我们就把特征T当作标签,其他的n-1个特征和原本的标签组成新 的特征矩阵。 那对于T来说,它没有缺失的部分,就是我们的Y_test,这部分数据既有标签也有特征,而它缺失的部 分,只有特征没有标签,就是我们需要预测的部分。 特征T不缺失的值对应的其他n-1个特征 + 本来的标签:X_train 特征T不缺失的值:Y_train 特征T缺失的值对应的其他n-1个特征 + 本来的标签:X_test 特征T缺失的值:未知,我们需要预测的Y_test 这种做法,对于某一个特征大量缺失,其他特征却很完整的情况,非常适用。 那如果数据中除了特征T之外,其他特征也有缺失值怎么办? 答案是遍历所有的特征,从缺失最少的开始进行填补(因为填补缺失最少的特征所需要的准确信息最少)。 填补一个特征时,先将其他特征的缺失值用0代替,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填 补下一个特征。每一次填补完毕,有缺失值的特征会减少一个,所以每次循环后,需要用0来填补的特征就越来越少。当 进行到最后一个特征时(这个特征应该是所有特征中缺失值最多的),已经没有任何的其他特征需要用0来进行填补了, 而我们已经使用回归为其他特征填补了大量有效信息,可以用来填补缺失最多的特征。 遍历所有的特征后,数据就完整,不再有缺失值了。
6、对填补好的数据进行建模
7、用所得结果画出条形图
结果: 4、机器学习中调参的基本思想我发现大多数的机器学习相关的书都是遍历各种算法和案例,为大家讲解各种各样算法 的原理和用途,但却对调参探究甚少。 这中间有许多原因,其一是因为,调参的方式总是根据数据的状况而定,所 以没有办法一概而论;其二是因为,其实大家也都没有特别好的办法。 通过画学习曲线,或者网格搜索,我们能够探索到调参边缘(代价可能是训练一次模型要跑三天三夜),但是在现实中,高手调参恐怕还是多依赖于经验,而这些经验,来源于:1)非常正确的调参思路和方法,2)对模型评估指 标的理解,3)对数据的感觉和经验,4)用洪荒之力去不断地尝试。 我们也许无法学到高手们多年累积的经验,但我们可以学习他们对模型评估指标的理解和调参的思路。 那我们首先来讲讲正确的调参思路。 模型调参,第一步是要找准目标:我们要做什么?一般来说,这个目标是提升 某个模型评估指标,比如对于随机森林来说,我们想要提升的是模型在未知数据上的准确率(由score或 oob_score_来衡量)。找准了这个目标,我们就需要思考:模型在未知数据上的准确率受什么因素影响?在机器学习中,我们用来衡量模型在未知数据上的准确率的指标,叫做泛化误差(Genelization error)。
当模型在未知数据(测试集或者袋外数据)上表现糟糕时,我们说模型的泛化程度不够,泛化误差大,模型的效果不好。泛化误差受到模型的结构(复杂度)影响。 看下面这张图,它准确地描绘了泛化误差与模型复杂度的关系, 当模型太复杂,模型就会过拟合,泛化能力就不够,所以泛化误差大。当模型太简单,模型就会欠拟合,拟合能力 就不够,所以误差也会大。只有当模型的复杂度刚刚好的才能够达到泛化误差最小的目标。 那模型的复杂度与我们的参数有什么关系呢?对树模型来说,树越茂盛,深度越深,枝叶越多,模型就越复杂。所 以树模型是天生位于图的右上角的模型,随机森林是以树模型为基础,所以随机森林也是天生复杂度高的模型。随 机森林的参数,都是向着一个目标去:减少模型的复杂度,把模型往图像的左边移动,防止过拟合。当然了,调参 没有绝对,也有天生处于图像左边的随机森林,所以调参之前,我们要先判断,模型现在究竟处于图像的哪一边。 泛化误差的背后其实是“偏差-方差困境”,原理十分复杂,无论你翻开哪一本书,你都会看见长篇的数学论证和每个 字都能看懂但是连在一起就看不懂的文字解释。在下一节偏差vs方差中,我用最简单易懂的语言为大家解释了泛化 误差背后的原理,大家选读。那我们只需要记住这四点: 1)模型太复杂或者太简单,都会让泛化误差高,我们追求的是位于中间的平衡点 2)模型太复杂就会过拟合,模型太简单就会欠拟合 3)对树模型和树的集成模型来说,树的深度越深,枝叶越多,模型越复杂 4)树模型和树的集成模型的目标,都是减少模型复杂度,把模型往图像的左边移动 那具体每个参数,都如何影响我们的复杂度和模型呢?我们一直以来调参,都是在学习曲线上轮流找最优值,盼望 能够将准确率修正到一个比较高的水平。然而我们现在了解了随机森林的调参方向:降低复杂度,我们就可以将那 些对复杂度影响巨大的参数挑选出来,研究他们的单调性,然后专注调整那些能最大限度让复杂度降低的参数。对 于那些不单调的参数,或者反而会让复杂度升高的参数,我们就视情况使用,大多时候甚至可以退避。基于经验, 我对各个参数对模型的影响程度做了一个排序。在我们调参的时候,大家可以参考这个顺序:
有了以上的知识储备,我们现在也能够通过参数的变化来了解,模型什么时候到达了极限,当复杂度已经不能再降 低的时候,我们就不必再调整了,因为调整大型数据的参数是一件非常费时费力的事。除了学习曲线和网格搜索, 我们现在有了基于对模型和正确的调参思路的“推测”能力,这能够让我们的调参能力更上一层楼。 5、方差 VS 偏差(选读)待补充… |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 20:27:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |