使⽤sklearn--RandomForest参数说明,随机森林调参数
资料来源:
ps:他/她写的好好
《机器学习》 周志华:第⼆章偏差与⽅差,第⼋章
0. 前⾔
sklearn提供了ble库,其中包括随机森林模型(分类)。但之前使⽤这个模型的时候,要么使⽤默认参数,要么将调参的⼯作丢给调参算法(grid arch等)。今天想来深究⼀下到底是如何选择参数,如何进⾏调参。
马粉水晶
学会调参是进⾏集成学习⼯作的前提。参数可分为两种,⼀种是影响模型在训练集上的准确度或影响防⽌过拟合能⼒的参数;另⼀种不影响这两者的其他参数。模型的准确度由其在训练集上的准确度及其防⽌过拟合的能⼒所共同决定,所以在调参时,我们主要对第⼀种参数进⾏调整,最终达到的效果是:模型在训练集上的准确度和防⽌过拟合能⼒的平衡。
1. 集成学习是什么
我们还是花⼀点时间来说明⼀下集成学习是什么,如果对此有⼀定基础的同学可以跳过本节。简单来说,集成学习是⼀种技术框架,其按照不同的思路来组合基础模型,从⽽达到其利断⾦的⽬的。
⽬前,有三种常见的集成学习框架:bagging,boosting和stacking。国内,南京⼤学的周志华教授对集成学习有很深⼊的研究,其在09年发表的⼀篇概述性论⽂对这三种集成学习框架有了明确的定义,概括如下:
bagging:从训练集从进⾏⼦抽样组成每个基模型所需要的⼦训练集,对所有基模型预测的结果进⾏综合产⽣最终的预测结果:
boosting:训练过程为阶梯状,基模型按次序⼀⼀进⾏训练(实现上可以做到并⾏),基模型的训练集按照某种策略每次都进⾏⼀定的转化。对所有基模型预测的结果进⾏线性综合产⽣最终的预测结果:
stacking:将训练好的所有基模型对训练基进⾏预测,第j个基模型对第i个训练样本的预测值将作为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进⾏训练。同理,预测的过程也要先经过所有基模型的预测形成新的测试集,最后再对测试集进⾏预测:
有了这些基本概念之后,直觉将告诉我们,由于不再是单⼀的模型进⾏预测,所以模型有了“集思⼴益”的能⼒,也就不容易产⽣过拟合现象。但是,直觉是不可靠的,接下来我们将从模型的偏差和⽅差⼊⼿,彻底搞清楚这⼀问题。
2. 偏差与⽅差
⼴义的偏差(bias)描述的是预测值和真实值之间的差异,⽅差(variance)描述距的是预测值作为随机变量的离散程度。当中有⼀副图形象地向我们展⽰了偏差和⽅差的关系:
2.1 偏差
模型的偏差是⼀个相对来说简单的概念:训练出来的模型在训练集上的准确度。偏差度量了学习算法的期望预测与真实结果的偏离程度,刻画了学习算法的本⾝你和能⼒。
2.2 ⽅差
我们认为⽅差越⼤的模型越容易过拟合:假设有两个训练集A和B,经过A训练的模型Fa与经过B训练的模型Fb差异很⼤,这意味着Fa在类A 的样本集合上有更好的性能,⽽Fb反之,这便是我们所说的过拟合现象。⽅差度量了同样⼤⼩的训练集的变动导致的学习性能的变化,即刻画了数据扰动所造成的影响。
2.3 泛化性能
根据偏差-⽅差分解说明(《机器学习(周志华)第44页),泛化性能是由学习算法的能⼒、数据的充分性以及学习任务本⾝的难度共同决定的。给定的学习任务,为了取得良好的性能,需要使偏差较⼩(充分拟合数据),⽅差较⼩(数据扰动产⽣影响⼩)。
我认为书中第46页⼀段话能解释什么样的参数是我们所需要能得到最优泛化性能的,摘录如下“⼀般来讲,偏差与⽅差是有冲突的,称为偏差-⽅差窘境(bias-varince dilemma)。 给定学习任务,假定我们能控制学习算法的训练程度,则在训练不⾜时,学习器的拟合能⼒不够强,训练数据的扰动不⾜以使学习器产⽣显著变化,此时偏差主导了泛化错误率;随着训练程度的加深,学习器的拟合能⼒逐渐增强,训练数据发⽣的扰动渐渐能被学习器学到,⽅差逐渐主导了泛化错误率;在训练程度充⾜后,学习器的拟合能⼒已⾮常强,训练数据发⽣的轻微扰动都会导致学习器发⽣显著变化,若训练数据⾃⾝的、⾮全局的特性被学习器学习到了,则将发⽣过拟合。”
对于bagging来说,,整体模型的期望近似于基模型的期望,这也就意味着整体模型的偏差和基模型的偏差近似。同时,整体模型的⽅差⼩于等于基模型的⽅差(当相关性为1时取等号),随着基模型数(m)的增多,整体模型的⽅差减少,从⽽防⽌过拟合的能⼒增强,模型的准确度得到提⾼。但是,模型的准确度⼀定会⽆限逼近于1吗?并不⼀定,当基模型数增加到⼀定程度时,⽅差公式第⼆
项的改变对整体⽅差的作⽤很⼩,防⽌过拟合的能⼒达到极限,这便是准确度的极限了。另外,在此我们还知道了为什么bagging中的基模型⼀定要为强模型,否则就会导致整体模型的偏差度低,即准确度低。
3. Random Forest
Random Forest是Bagging的⼀个扩展变体。RF在以决策树为基学习器构建Bagging的基础上,进⼀步在决策树的训练过程中引⼊了随机属性选择。即在树的内部节点分裂过程中,不再是将所有特征,⽽是随机抽样⼀部分特征纳⼊分裂的候选项。这样⼀来,基模型之间的相关性降低,从⽽在⽅差公式中,继续导致整体⽅差仍是减少。
在ble库中,我们可以找到Random Forest分类和回归的实现:RandomForestClassifier和RandomForestRegression。本⽂主要关注分类。
回顾上⽂,参数可分为两种,⼀种是影响模型在训练集上的准确度或影响防⽌过拟合能⼒的参数;另⼀种不影响这两者的其他参数。所以调参的步骤如下:
a:我们的⽬标是找到第⼀种参数,确定对⽬标是正影响还是负影响和影响的⼤⼩
b:通过某些策略提⾼训练效率
c:训练过程的检测
对于a,我们可以把模型的参数分为4类:⽬标类、性能类、效率类和附加类。下表详细地展⽰了RF中这4个模型参数的意义:
注:下表是直接从中copy过来的,所以包含其他三种模型,不过真的好赞~~~
参数类
型
RandomForestClassifier RandomForestRegressor GradientBoostingClassifier GradientBoostingRegressor
loss ⽬
标
损失函数
● exponential:模型等
同AdaBoost
★ deviance:和Logistic
Regression的损失函数⼀
致
损失函数
海伦凯勒的资料
● exponential:模型等同
AdaBoost
★ deviance:和Logistic
Regression的损失函数⼀
致
alpha ⽬
标
损失函数为huber或quantile
的时,alpha为损失函数中的
参数
损失函数为huber或quantile
的时,alpha为损失函数中的参
数
class_weight ⽬
标
类别的权值
n_estimators 性
能
⼦模型的数量
● int:个数
★ 10:默认值
⼦模型的数量
● int:个数
★ 10:默认值
⼦模型的数量
● int:个数
★ 100:默认值
⼦模型的数量
● int:个数
★ 100:默认值
learning_rate 性
能
学习率(缩减)学习率(缩减)
criterion 性
能
判断节点是否继续分裂
采⽤的计算⽅法
● entropy
★ gini
判断节点是否继续分裂
采⽤的计算⽅法
★ m
max_features 性
能
节点分裂时参与判断的
最⼤特征数
● int:个数
● float:占所有特征
的百分⽐
★ auto:所有特征数
的开⽅
节点分裂时参与判断的
最⼤特征数
● int:个数
● float:占所有特征的
百分⽐
★ auto:所有特征数的
开⽅
节点分裂时参与判断的最
⼤特征数
● int:个数
● float:占所有特征的百
分⽐
● auto:所有特征数的开
⽅见仁见什么
节点分裂时参与判断的最⼤
特征数
● int:个数
● float:占所有特征的百
分⽐
● sqrt:所有特征数的开⽅
● log2:所有特征数的log2值
● None:等于所有特征数● sqrt:所有特征数的
开⽅
● log2:所有特征数的
log2值
● None:等于所有特征
数
● sqrt:所有特征数的开
⽅
● log2:所有特征数的
log2值
★ None:等于所有特征
数
● auto:所有特征数的开
⽅
● sqrt:所有特征数的开
⽅
● log2:所有特征数的
log2值
★ None:等于所有特征数
max_depth 性
能
最⼤深度,如果
max_leaf_nodes参数
指定,则忽略
● int:深度
★ None:树会⽣长到
所有叶⼦都分到⼀个
类,或者某节点所代表
的样本数已⼩于
min_samples_split
最⼤深度,如果
max_leaf_nodes参数指
定,则忽略
● int:深度
★ None:树会⽣长到所
有叶⼦都分到⼀个类,
或者某节点所代表的样
本数已⼩于
min_samples_split
最⼤深度,如果
max_leaf_nodes参数指
定,则忽略
● int:深度
★ 3:默认值
最⼤深度,如果
max_leaf_nodes参数指
定,则忽略
● int:深度
★ 3:默认值
min_samples_split 性
能
分裂所需的最⼩样本数
● int:样本数
★ 2:默认值
分裂所需的最⼩样本数
● int:样本数
★ 2:默认值
分裂所需的最⼩样本数
● int:样本数
★ 2:默认值
分裂所需的最⼩样本数
● int:样本数
★ 2:默认值
min_samples_leaf 性
能
叶节点最⼩样本数
● int:样本数
★ 1:默认值
叶节点最⼩样本数
● int:样本数
★ 1:默认值
叶节点最⼩样本数
● int:样本数
★ 1:默认值
叶节点最⼩样本数
● int:样本数
★ 1:默认值
min_weight_fraction_leaf 性
能
叶节点最⼩样本权重总
值
● float:权重总值
★ 0:默认值
叶节点最⼩样本权重总
值
● float:权重总值
★ 0:默认值
叶节点最⼩样本权重总值
● float:权重总值
★ 0:默认值
叶节点最⼩样本权重总值
● float:权重总值
★ 0:默认值
max_leaf_nodes 性
能尼泊尔气候
最⼤叶节点数
● int:个数
★ None:不限制叶节
点数
最⼤叶节点数
● int:个数
★ None:不限制叶节点
数
最⼤叶节点数
● int:个数
★ None:不限制叶节点
数
最⼤叶节点数
● int:个数
★ None:不限制叶节点数
bootstrap 性
能
是否bootstrap对样本
抽样
● Fal:⼦模型的样
本⼀致,⼦模型间强相
关
★ True:默认值
是否bootstrap对样本抽
样
● Fal:⼦模型的样本
⼀致,⼦模型间强相关
★ True:默认值
subsample 性
能
⼦采样率
● float:采样率
★ 1.0:默认值
⼦采样率
● float:采样率
★ 1.0:默认值
init 性
能
初始⼦模型初始⼦模型
n_jobs 效
率
安全小贴士并⾏数
● int:个数
● -1:跟CPU核数⼀
致
★ 1:默认值
并⾏数
● int:个数
● -1:跟CPU核数⼀致
★ 1:默认值电脑主板电池
效
warm_start率是否热启动,如果是,
则下⼀次训练是以追加
树的形式进⾏
● bool:热启动
★ Fal:默认值是否热启动,如果是,
则下⼀次训练是以追加
树的形式进⾏
● bool:热启动
★ Fal:默认值
是否热启动,如果是,则
下⼀次训练是以追加树的
形式进⾏
● bool:热启动
所有反义词★ Fal:默认值
是否热启动,如果是,则下
⼀次训练是以追加树的形式
进⾏
● bool:热启动
★ Fal:默认值
presort 效
率
是否预排序,预排序可以加速
查找最佳分裂点,对于稀疏数
据不管⽤
● Bool
★ auto:⾮稀疏数据则预
排序,若稀疏数据则不预
排序
是否预排序,预排序可以加速查
找最佳分裂点,对于稀疏数据
不管⽤
● Bool
★ auto:⾮稀疏数据则预
排序,若稀疏数据则不预排
序
oob_score 附
加
是否计算
★ Fal:默认值
是否计算
★ Fal:默认值
random_state 附
加
随机器对象随机器对象随机器对象随机器对象
verbo 附
加
⽇志冗长度
● int:冗长度
★ 0:不输出训练过程
● 1:偶尔输出
● >1:对每个⼦模型
都输出
⽇志冗长度
● int:冗长度
★ 0:不输出训练过程
● 1:偶尔输出
● >1:对每个⼦模型都
输出
⽇志冗长度
● int:冗长度
★ 0:不输出训练过程
● 1:偶尔输出
● >1:对每个⼦模型都输
出
⽇志冗长度
● int:冗长度
★ 0:不输出训练过程
● 1:偶尔输出写给孩子的寄语和希望
● >1:对每个⼦模型都输
出
上述第⼀种影响准确度的参数⼜可分为两类:过程影响类及⼦模型影响类。在⼦模型不变的前提下,某些参数可以通过改变训练的过程,从⽽影响模型的性能,诸如:“⼦模型数”(n_estimators)、“学习率”(learning_rate)等。还可以通过改变⼦模型性能来影响整体模型的性能,诸如:“最⼤树深度”(max_depth)、“分裂条件”(criterion)等。现在可以进⼀步明确⽬标了,RF基学习器都拥有较低的偏差,整体模型的训练过程旨在降低⽅差,故其需要较少的⼦模型(n_estimators默认值为10)且⼦模型不为弱模型(max_depth的默认值为None),同时,降低⼦模型间的相关度可以起到减少整体模型的⽅差的效果(max_features的默认值为auto)。
下⼀步就是调参。
调参在中写的⾮常详细,我在具体操作后再来补充说明。