天天看点

sklearn 随机森林_机器学习sklearn之随机森林(第二部分:随机森林的调参)

sklearn 随机森林_机器学习sklearn之随机森林(第二部分:随机森林的调参)

本文是机器学习sklearn的系列文章之一,下面是前绪文章:

机器学习sklearn系列之决策树: 飘哥:机器学习sklearn系列之决策树

机器学习sklearn之随机森林(第一部分):飘哥:机器学习sklearn之随机森林

随机森林的调参

前面学到了很多参数和属性,我们来看看调参基本思想,市面上的书基本上是遍历了各种算法编写了各种案例,讲解了各种算法的原理和用途,但是对实践中的调参写的非常少,原因可以想象,一是因为调参方式是跟数据的规模相关,没有办法一概而论,所以书也很难写出来一定要怎么样。二是没有好的调参的办法,主要还是基于经验。

学习曲线和交叉验证,还有网格搜索是可以帮助调参数。网格搜索(Grid Search)名字非常大气,但是用简答的话来说就是你手动的给出一个模型中你想要改动的所用的参数,程序自动的帮你使用穷举法来将所用的参数都运行一遍

,找到一个最佳模型,数据规模特别大,要跑个三天三夜。 工作中高手调参更多依赖于经验。他们比别人强的地方是他们正确的调参思路和方法,以及对评估指标的理解,还有对数据的经验和感觉,以及他们的时间,精力,以及他们的洪荒之力不断的去尝试。

我们也许无法学到高手们多年累积的经验,但我们可以学他们对模型评估指标的理解和调参思路。这两个我们是可以学到的,下面我讲讲什么是正确的调参思路。

sklearn 随机森林_机器学习sklearn之随机森林(第二部分:随机森林的调参)

模型调参,第1步是找目标:我们要做什么?一般来说这个目标是提升模型的某个评估指标,

比如对随机森林来说,我就是想要提升模型在未知数据上的准确率,(由score或oob_score_来衡量)就是让它在测试集上准去率高,找准了这个目标,我们就需要思考:模型在未知数据上的准确率受什么因素影响?我们都知道他是accuracy 在机器学习中,它是什么东西影响了他呢,在机器学习中我们有一个专门用来衡量模型,在未知指标上的准确率的指标叫做泛化误差叫做泛化误差(Genelization error)

1. 泛化误差

当模型在未知数据上表现很糟糕的时候,我们就说模型的泛化程度不够,泛化误差很大,模型的效果不好,意思就是在测试上表现不好。它是受到模型的结构影响,我们来看一下下面的这张图:

sklearn 随机森林_机器学习sklearn之随机森林(第二部分:随机森林的调参)

它准确地描绘了泛化误差与模型复杂度的关系,当模型太复杂,模型就会过拟合,泛化能力就不够,所以泛化误差大。当模型太简单,学习能力不够,模型就会欠拟合,拟合能力就不够,所以误差也会大。只有当模型的复杂度刚刚好这个模型既不是太复杂,我的训练集也不是太简单,就是也没有学习的太草率的时候,我们在能在中间找到一个最佳模型的复杂度。这个最佳模型复杂度能引导我们找到泛化误差的最低点,我们的目标就是找到泛化误差最小的这一个点。

那你说模型的复杂度跟我们的参数有什么关系呢?

我们是要讲调参对不对?对于树模型还有树的集成模型来说,树越茂盛,深度越深,枝叶越多,模型就越复杂,所以树模型是天生位于上图右上角的模型(意思是最大深度越深,就越靠近图的右边,最大深度越浅越靠近图的左边,树模型天生就很复杂,天生就容易过拟合),随机森林是以树模型为基础,所以随机森林也是位于上图的右上角,是天生复杂度高的模型。随机森林的参数,都是向着一个目标去:减少模型的复杂度,把模型往图像的左边移动,防止过拟合。让他的泛化误差慢慢慢慢的降下来到达最优点, 当然了,调参没有绝对,也有天生处于图像左边的随机森林,所以调参之前,我们要先判断,模型现在究竟处于图像的哪一边。

调参是没有绝对的,也有天生就处于左边的这种随机森林,所以调参之前我们要先判断你这模型究竟在图上的哪一边。

上图的背后,泛化误差和模型复杂度的背后的原理其实叫做偏差方差困境。

原理十分复杂,无论你翻开哪一本书,你都会看见一页半到两页的数学推导和论证,然后还有很多你不认识的数学符号,可能每个字你都能看懂,但是连在一起就完全不懂了文字解释,在下一节偏差vs方差中,我用最简单易懂的语言为大家解释了泛化误差背后的原理,大家选读,当然如果你能够理解当然是更好,这里面详细的解释了复杂度和我们的总泛化误差形成这样的一种联系的,那如果你不理解或者说你不想去纠结那么多没关系,那我给你总结了,我们通过上图需要记住的4点:

1)模型太复杂或者太简单,都会让泛化误差高,准确率很低,我们追求的是位于中间的平衡点

2)模型太复杂就会过拟合,模型太简单就会欠拟合(模型太复杂右上角就会过拟合,如果模型太简单,左下角就会欠拟合)

3)对树模型和树的集成模型来说,树的深度越深,枝叶越多,模型越复杂

4)树模型和树的集成模型的目标,都是减少模型复杂度,把模型往图像的左边移动

那具体每个参数,都如何影响我们的复杂度和模型呢?我们一直以来调参,都是在学习曲线上轮流找最优值,我们盼望能够将准确率修正到一个比较高的水平。调来调去,这样我们有了一个很明确的方向,然而我们现在了解了随机森林的调参方向:降低复杂度,就是剪枝,我们就可以将那些对复杂度影响巨大的参数挑选出来,研究他们的单调性,然后专注调整那些能最大限度让复杂度降低的参数,是不是就可以把我们的这个准确率最大限度的调上去了?

对于那些不单调的参数,或者反而会让复杂度升高的参数,我们就视情况使用,大多时候甚至可以不调了,因为它会让复杂度升高,。基于经验,我对各个参数对模型的影响程度做了一个排序。在我们调参的时候,大家可以参考这个顺序。影响程度的星星越多代表他对模型的影响越大,要调的时候优先选择影响程度更大的。

sklearn 随机森林_机器学习sklearn之随机森林(第二部分:随机森林的调参)

大家有了这个表哪怕你不是非常理解什么复杂度之类,照着这个表慢慢的去调,你也能够调出一个很好的模型。

我也说了当n_estimateors能将我们的精确性提升到平稳,当n_estimateors越来越大的时候,它不影响单个模型的复杂度,你尽情的调,只要你的电脑能算出来,只要你的计算是OK的,尽情的调n_estimateors是可以越大越好,而且它对树的影响程度非常的大,他可以让我们的泛化误差非常快速的减下来。

Max_depth最大深度,默认是让数无尽的生长的也就是说天生就是最高复杂度,向复杂度降低的方向挑战是怎么样?让最大深度降低,模型更简单,它就像图像的左边移动了,它就移动到上图的左边了。

Min_samples_leaf和min_samples_split是一样的,他们的默认最小限制是1,也是默认最高复杂度,我规定你叶节点里面至少要有一片叶子你才能够存在,这不就相当于是说随便分,你都可以存在这个意思吗?就是会涨到极限,所以这两个参数也是最开始就默认是最高复杂度的。他们的复杂度也是降低的方向调参,这个参数越大,模型越简单,这两个参数越大,模型会向左边移动

Max_features会有一点点不一样,因为它的默认值是auto,auto是什么,特征总数的开平方的值,它是位于中间复杂度,不是说你只可以使用两个特征,也不是说你可以使用全部的特征,他没有让树长到最大也没有限制在最小,他是属于中间的某个位置,所以他的调参方向既可以往复杂度升高的方向调,也可以往复杂度降低的方向去调。Max_features往下的时候模型会更简单,图像往左移,Max_features往上的时候模型会更复杂,图像往右移动,这个参数对模型的影响程度比较低比较低,但是它是唯一能够让树更简单,也能让树更复杂的参数。所以在调这个参数的时候,我们需要考虑我们调参的方向。

Criteion有增有减,用基尼系数,他是看具体情况,有的时候如同神来之笔桥的特别好,有的时候放上去了一点用都没有。

有了以上的知识储备,我们现在也能够通过参数的变化来了解,模型什么时候到达了极限,当复杂度已经不能再降低的时候,我们就不必再调整了,不管你有多少参数备用,你都不需要调了,因为调整大型数据的参数是一件非常费时费力的事。除了学习曲线和网格搜索,我们现在有了一套基于对模型的正确的调参思路的理解,和调参思路的“推测”能力,我知道吧这个参数放进去,我知道调参是上升还是下降,这能够让我们的调参能力更上一层楼。

注:对于大型数据集,

max_leaf_nodes

可以尝试从1000来构建,先输入1000,每100个叶子一个区间,再逐渐缩小范围

对于

min_samples_split

min_samples_leaf

,一般是从他们的最小值开始向上增加10或20,面对高维度高样本量数据,如果不放心,也可以直接+50,对于大型数据,可能需要200~300的范围,如果调整的时候发现准确率无论如何都上不来,那可以放心大胆调一个很大的数据,大力限制模型的复杂度

2. 偏差 vs 方差

一个集成模型(f)在未知数据集(D)上的泛化误差E(f;D),由方差(var),偏差(bais)和噪声(ε)共同决定。

sklearn 随机森林_机器学习sklearn之随机森林(第二部分:随机森林的调参)

关键概念:偏差与方差观察下面的图像,每个点就是集成算法中的一个基评估器产生的预测值。红色虚线代表着这些预测值的均值,而蓝色的线代表着数据本来的面貌。

偏差:模型的预测值与真实值之间的差异,即每一个红点到蓝线的距离。在集成算法中,每个基评估器都会有自己的偏差,集成评估器的偏差是所有基评估器偏差的均值。模型越精确,偏差越低。

方差:反映的是模型每一次输出结果与模型预测值的平均水平之间的误差,即每一个红点到红色虚线的距离,衡量模型的稳定性。模型越稳定,方差越低。

sklearn 随机森林_机器学习sklearn之随机森林(第二部分:随机森林的调参)

其中偏差衡量模型是否预测得准确,偏差越小,模型越“准”;而方差衡量模型每次预测的结果是否接近,即是说方差越小,模型越“稳”;噪声是机器学习无法干涉的部分,为了让世界美好一点,我们就不去研究了。一个好的模型,要对大多数未知数据都预测得”准“又”稳“。即是说,当偏差和方差都很低的时候,模型的泛化误差就小,在未知数据上的准确率就高。

偏差大偏差小方差大模型不适合这个数据

换模型过拟合

模型很复杂

对某些数据集预测很准确

对某些数据集预测很糟糕方差小欠拟合

模型相对简单

预测很稳定

但对所有的数据预测都不太准确泛化误差小,我们的目标

通常来说,方差和偏差有一个很大,泛化误差都会很大。然而,方差和偏差是此消彼长的,不可能同时达到最小值。这个要怎么理解呢?来看看下面这张图:

sklearn 随机森林_机器学习sklearn之随机森林(第二部分:随机森林的调参)

从图上可以看出,模型复杂度大的时候,方差高,偏差低。偏差低,就是要求模型要预测得“准”。模型就会更努力去学习更多信息,会具体于训练数据,这会导致,模型在一部分数据上表现很好,在另一部分数据上表现却很糟糕。模型泛化性差,在不同数据上表现不稳定,所以方差就大。而要尽量学习训练集,模型的建立必然更多细节,复杂程度必然上升。所以,复杂度高,方差高,总泛化误差高。

相对的,复杂度低的时候,方差低,偏差高。方差低,要求模型预测得“稳”,泛化性更强,那对于模型来说,它就不需要对数据进行一个太深的学习,只需要建立一个比较简单,判定比较宽泛的模型就可以了。结果就是,模型无法在某一类或者某一组数据上达成很高的准确度,所以偏差就会大。所以,复杂度低,偏差高,总泛化误差高。

我们调参的目标是,达到方差和偏差的完美平衡!虽然方差和偏差不能同时达到最小值,但他们组成的泛化误差却可以有一个最低点,而我们就是要寻找这个最低点。对复杂度大的模型,要降低方差,对相对简单的模型,要降低偏差。随机森林的基评估器都拥有较低的偏差和较高的方差,因为决策树本身是预测比较”准“,比较容易过拟合的模型,装袋法本身也要求基分类器的准确率必须要有50%以上。所以以随机森林为代表的装袋法的训练过程旨在降低方差,即降低模型复杂度,所以随机森林参数的默认设定都是假设模型本身在泛化误差最低点的右边。

所以,我们在降低复杂度的时候,本质其实是在降低随机森林的方差,随机森林所有的参数,也都是朝着降低方差的目标去。有了这一层理解,我们对复杂度和泛化误差的理解就更上一层楼了,对于我们调参,也有了更大的帮助。

关于方差-偏差的更多内容,大家可以参考周志华的《机器学习》。(重点:需要数学基础,数学基础,数学基础,重要的事情说三遍)。