sklearn中的随机森林+缺失值填补与乳腺癌实例

文章目录

  • 一、分类型随机森林参数简介
    • n_estimators
    • random_state
    • bootstrap & oob_score
  • 二、决策树填补缺失值
  • 三、随机森林在乳腺癌数据上的调参
    • 1.查看baseline
    • 2.第一步:无论如何先来调n_estimators
    • 3.在确定好的范围内,进一步细化学习曲线
    • 4.开始按照参数对模型整体准确率的影响程度进行调参,首先调整max_depth
    • 5.调整max_features

一、分类型随机森林参数简介

装袋法的核心思想是构建多个相互独立的评估器,然后对其预测进行平均或多数表决原则来决定集成评估器的结果。装袋法的代表模型就是随机森林。sklearn中的集成算法模块ensemble中的RandomForestClassifier 就是随机森林分类。

n_estimators

这是森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。

random_state

假设我们建立了25棵树,对任何一个样本而言,平均或多数表决原则下,当且仅当有13棵以上的树判断错误的时候,随机森林才会判断错误。单独一棵决策树对数据集的分类准确率在0.85上下浮动,假设一棵树判断错误的可能性为0.2(ε),那20棵树以上都判断错误的可能性是:
sklearn中的随机森林+缺失值填补与乳腺癌实例_第1张图片
sklearn中的随机森林+缺失值填补与乳腺癌实例_第2张图片
可见,判断错误的几率非常小,这让随机森林的表现远远好于单棵决策树。

但我们使用了一样的类DecisionTreeClassifier,一样的参数,一样的训练集和测试集,为什么随机森林里的众多树会有不同的判断结果?
1.对于决策树而言,它是从最重要的特征中随机选择出一个特征来进行
分枝,因此每次生成的决策树都不一样,这个功能由参数random_state控制。
2.随机森林中其实也有random_state,用法和分类树中相似,只不过在分类树中,一个random_state只控制生成一棵树,而随机森林中的random_state控制的是生成森林的模式,而非让一个森林中只有一棵树。比如树的深度都是一样的,但是生成每个树的random_state都是不一样的。

bootstrap & oob_score

在一个含有n个样本的原始训练集中,我们进行随机采样,每次采样一个样本,并在抽取下一个样本之前将该样本放回原始训练集,也就是说下次采样时这个样本依然可能被采集到,这样采集n次,最终得到一个和原始训练集一
样大的,n个样本组成的自助集。用这些自助集来训练我们的基分类
器,我们的基分类器自然也就各不相同了。
**bootstrap参数默认True,代表采用这种有放回的随机抽样技术。**通常,这个参数不会被我们设置为False。
当n足够大时,这个概率收敛于1-(1/e),约等于0.632。因此,会有约37%的训练数据被浪费掉,没有参与建模,这些数据被称为袋外数据(out of bag data,简写为oob)。除了我们最开始就划分好的测试集之外,这些数据也可
以被用来作为集成算法的测试集。也就是说,在使用随机森林时,我们可以不划分测试集和训练集,只需要用袋外数据来测试我们的模型即可。当然,这也不是绝对的,当n和n_estimators都不够大的时候,很可能就没有数据掉
落在袋外,自然也就无法使用oob数据来测试模型了。
如果希望用袋外数据来测试,则需要在实例化时就将oob_score这个参数调整为True,训练完毕之后,我们可以用随机森林的另一个重要属性:oob_score_来查看我们的在袋外数据上测试的结果。
sklearn中的随机森林+缺失值填补与乳腺癌实例_第3张图片

二、决策树填补缺失值

1.假设一个数据有n个特征,再加上原本的标签一个n+1个。遍历所有的特征,从缺失最少的开始填补(因为需要的准确信息最少)。
2.填补一个特征时,先将其他特征的缺失值用0代替,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下一个特征。
sklearn中的随机森林+缺失值填补与乳腺癌实例_第4张图片
注:y_full是标签,无缺失。

三、随机森林在乳腺癌数据上的调参

1.查看baseline

sklearn中的随机森林+缺失值填补与乳腺癌实例_第5张图片
0.96已经相当好了

2.第一步:无论如何先来调n_estimators

第一次的学习曲线,可以先用来帮助我们划定范围,我们取每十个数作为一个阶段,来观察n_estimators的变化如何引起模型整体准确率的变化。
sklearn中的随机森林+缺失值填补与乳腺癌实例_第6张图片
41在31到45之间。

3.在确定好的范围内,进一步细化学习曲线

调整n_estimators的效果显著,模型的准确率立刻上升了0.005。接下来就进入网格搜索,我们将使用网格搜索对参数一个个进行调整。为什么我们不同时调整多个参数呢?原因有两个:1)同时调整多个参数会运行非常缓慢,我们没有这么多的时间。2)同时调整多个参数,会让我们无法理解参数的组合是怎么得来的,所以即便网格搜索调出来的结果不好,我们也不知道从哪里去改。

4.开始按照参数对模型整体准确率的影响程度进行调参,首先调整max_depth

sklearn中的随机森林+缺失值填补与乳腺癌实例_第7张图片

在这里,我们注意到,将max_depth设置为有限之后,模型的准确率下降了。限制max_depth,是让模型变得简单,把模型向左推,而模型整体的准确率下降了,即整体的泛化误差上升了,这说明模型现在位于图像左边,即泛化误差最低点的左边(偏差为主导的一边)。通常来说,随机森林应该在泛化误差最低点的右边,树模型应该倾向于过拟合,而不是拟合不足。这和数据集本身有关,但也有可能是我们调整的n_estimators对于数据集来说太大,因此将模型拉到泛化误差最低点去了。然而,既然我们追求最低泛化误差,那我们就保留这个n_estimators,除非有其他的因素,可以帮助我们达到更高的准确率。
当模型位于图像左边时,我们需要的是增加模型复杂度(增加方差,减少偏差)的选项,因此max_depth应该尽量大,min_samples_leaf和min_samples_split都应该尽量小。这几乎是在说明,除了max_features,我们没有任何参数可以调整了,因为max_depth,min_samples_leaf和min_samples_split是剪枝参数,是减小复杂度的参数。
在这里,我们可以预言,我们已经非常接近模型的上限,模型很可能没有办法再进步了。

5.调整max_features

sklearn中的随机森林+缺失值填补与乳腺癌实例_第8张图片

网格搜索返回了max_features的最小值,可见max_features升高之后,模型的准确率降低了。这说明,我们把模型往右推,模型的泛化误差增加了。前面用max_depth往左推,现在用max_features往右推,泛化误差都增加,这说明模型本身已经处于泛化误差最低点,已经达到了模型的预测上限,没有参数可以左右的部分了。剩下的那些误差,是噪声决定的,已经没有方差和偏差的舞台了。
停止调整,如果我们希望模型更进一步,我们会选择更换算法,或者更换做数据预处理的方式。

你可能感兴趣的:(sklearn,随机森林)