随机森林算法梳理

参考:https://www.cnblogs.com/pinard/p/6131423.html

集成学习

集成学习面对的是一个强学习器,由多个个题学习器,通过一定的策略组合而成。

个体学习器

分为两种:
  • 同质学习器(同类算法得到的模型)
    通常使用CART决策树和神经网络等,根据模型之间的关联强度分为两种:
    • 强关联
      串行,例子boosting
    • 弱关联
      并行,例子bagging和随机森林
  • 异质学习器(不同类算法得到的模型)

boosting

训练步骤:

  1. 一个样本集m,m样本集具有初始权重D(1),
  2. 在此基础上训练得到弱学习器L1,
  3. 根据弱学习器L1的学习误差率(e)更新训练样本权重为D(2),此时的样本权重D(2)应当关注于训练出错的样本点
  4. 重复123,直到获取到 T个弱学习器
  5. 按照一定策略组合T个弱学习器为一个强学习器。
    所有的boosting算法都需要解决的问题包括:(参考:https://www.cnblogs.com/pinard/p/6133937.html 包含了具体的公式)
    • 计算学习误差率e
    • 计算弱学习器权重系数alpha
    • 更新样本权重D
    • 采取何种策略
  • adaboost
    参考:https://www.cnblogs.com/pinard/p/6133937.html
    对于任何学习器都可以使用在adaboost上,但adaboost通常挑选了CART决策树,用于分类和回归问题,分别选择CART分类和CART回归。
    为了解决上述问题,在每一步中给出了adaboost解决的公式,看原文公式即可。
    另外加入了正则化项,只在原有公式上加入了参数v,通常成为步长。通过对补偿和弱学习器的迭代次数来共同决定算法的拟合程度。

  • 优缺点
    1.分类精度高. 2.在adaboost框架下,可以使用各种回归分类模型来构建学习器. 3.作为简单的二元分类器,可读性强. 4.不容易发生过拟合.
    -1.由于串行的弱学习器,更新权重的初衷为提高上一轮分类误差率大的样本点,而异常样本分错概率较高,故adaboost对异常样本比较敏感。

  • 提升树(boosting tree)[待补充]

  • 梯度提升树(gradient boosting tree)
    参考:https://www.cnblogs.com/pinard/p/6140514.html
    GBDT很重要,别名有GBT(Gradient Boosting Tree),GTB(Gradient Tree Boosting),GBRT(Gradient Boosting Regression Tree),MART(Multiple Additive Regression Tree)
    GBDT和adaboost相比,也是迭代,使用了前向分布算法,迭代思路不同于adaboost。
    GBDT可用于分类和回归。区别仅在于损失函数不同导致了负梯度不同。
    可以选择很多损失函数,分类和回归使用不同的损失函数,分类主要分为对数损失函数和指数损失函数;回归主要有均方差,绝对损失,huber损失,分位数损失。
    和adaboost一样,也需要加入正则化,不过有三种方式,一种和adaboost相同,控制步长;2.无放回的自采样,取值为(0,1],推荐[0.5,0.8]之间(当使用了自采样的样本之后,可以将采样样本分发出去,类似于bagging,最后形成新的树,可以部分并行计算);3.对弱学习器中的CART树做剪枝。
    GBDT好用的库是xgboost,scikit-learn。

  • 优缺点
    g1. 可以灵活处理各种类型的数据,包括离散值和连续值。
    g2. 调参时间较少,相对于SVM来说。
    g3. 健壮的损失函数对于异常值的鲁棒性比较好,比如huber和quantile。
    b1. 由于boosting的限制,不可以并行,但可以自采样(SGBT),达到部分并行。

bagging

bagging可以用于二分类,多分类,回归。bagging主要关注于降低方差。

  1. 一个样本集m,进行T次随机采样(boostrap sampling,有放回采样)
  2. 对T个随机采样的样本集分别训练,得到T个弱学习器
  3. 按照一定策略组合T个弱学习器为一个强学习器。

结合策略

  • 平均法
    数值回归预测问题:对T个学习器的结果做(加权)平均。
  • 投票法
    分类问题:1.少数服从多数 2.在1的基础上过半数,否则拒识 3.加权投票
  • 学习法
    代表:stacking。使用T个学习器(初级学习器)的输出作为输入,再加一层学习器进行训练。预测时先使用初级学习器预测得到T个结果,再输入到次级学习器(后加的学习器)进行预测得到结果。

随机森林思想

参考: https://blog.csdn.net/qingqingpiaoguo/article/details/53435417
https://blog.csdn.net/yingfengfeixiang/article/details/80210145
随机森林的集成学习方法是上述的bagging。随机森林利用随机的方式将多个决策树组合成一个森林,每个决策树在分类的时候投票共同绝对测试样本的最终结果。
主要包括:

  1. 样本随机选择
    在样本集M上有放回地构建样本
  2. 特征随机选择
    计算特征的ID3或者C4.5,选择一个最大增益的特征作为划分下一个子节点走向的特征。(选择特征为无放回的,即每个特征只选择一次)
  3. 构建一颗决策树
  4. 重复上述三步,构建H次即得到H棵决策树。对一个测试样本做H次预测,得到H个结果,对H个结果做某种组合,得到最终分类结果。

随机森林的推广

  • extra tree
    extra tree是rf(random forest)的一个变种,区别在于:
  1. rf是使用bootstrap有放回地采样构建样本集;extra tree一般采用的是原时训练集。
  2. rf决策树是通过信息增益,基尼系数,均方差等原则选择一个最有的特征值作为划分点;extra tree是随机选择一个特征值来划分决策树。
    由于以上特性,导致extra tree的规模回避rf生成的决策树规模大,

随机森林的优缺点

  • 优点
    g1. 能够处理高纬度数据并且不需要做特征选择
    g2. 由于每次都选择不同的测试集,一定程度上避免了过拟合。
    g3. 解决分类和回归问题,由于是集成学习,方差和偏差都比较低,泛化能力强。
    g4. 对数据缺失,数据不平衡有较好的应对。
    g5. 高度并行化,易于分布式实现。
    g6. 由于树形结构,不需要归一化。
  • 缺点
    b1. 在噪音大的分类或回归问题上过拟合。[不是很清晰]
    b2. 对于不同级别的属性的数据,级别划分多的属性会对随机森林会产生更多的影响,所以在这种情况下不可信。[不是很清晰]
    b3. 忽略了属性间的相关性。
    b4. 分类问题上的表现优于回归。

调参basic

总体上说,由于boosting各个弱学习器串行,而bagging并行,参数之间没有关系,基于bagging的调参要相对容易一些,在时间方面也要少。

AdaBoost

boosting框架参数

  1. base_estimator(共有): AdaBoostClassifier和AdaBoostRegressor都有,通常为CART决策树或者伸进网络,默认为决策树。
  2. algorithm(AdaBoostClassifier): 默认为SAMME.R,速度会更快,但base_estimator必须使用支持概率预测的分类器;可以选择SAMME,没有对base_estimator的限制。
  3. loss(AdaBoostRegressor) : 默认为linear,可选"square",“exponential”,通常线性足够了,看原文有关于三种误差率的计算公式。
  4. n_estimators(共有):最大迭代次数,默认值为50.
  5. learning_rate(共有):每个弱学习器的权重缩减系数v。

adaboost在sklearn中的参数

参考:https://www.cnblogs.com/pinard/p/6136914.html
调参分为两大类,以为adaboost的框架(boosting)参数,以及选择的弱分类器参数。在sklearn中体现为AdaBoostClassifier和AdaBoostRegressor。前者为分类算法,使用了SAMME和SAMME.R,后者为回归算法,使用了Adaboost.R2.
弱学习器的参数会根据使用的弱学习器的不同而变化。默认为决策树弱学习器。参数见rf参数。在本链接中包含了实战代码。https://www.cnblogs.com/pinard/p/6136914.html

bagging框架参数

主要需要关注的参数是n_estimators

  1. n_estimators: 弱学习器的最大迭代次数,或者说是最大的弱学习器个数,过少容易欠拟合,过多提升很小。通常默认100。
  2. oob_score: 是否采用袋外样本做评估模型的好坏。默认为Fasle,推荐设置为True。
  3. criterion: CART树做划分时对特征的评价标准。对于分类问题,默认基尼系数gini,可选信息增益;对于回归问题,默认均方差mse,可选绝对插值mae。

gdbt 在sklearn中的参数

参考: https://www.cnblogs.com/pinard/p/6143927.html

  1. n_estimators 弱学习器的zui’da’die最大迭代次数
  2. learning_rate 不擦汗给你
  3. subsample 取值为(0,1],但推荐[0.5,0,8],默认为1,即不采用自采样
    4.init 没懂
  4. loss gdbt中提到的损失函数(http://www.cnblogs.com/pinard/p/6140514.html),具体区别看当前博客

gdbt弱学习器参数

采用了rf中的CART树。

rf参数

参考:https://blog.csdn.net/Kaiyuan_sjtu/article/details/80173417
在bagging框架下完成的rf,主要包括两大类参数,bagging框架参数和CART决策树参数。
CART决策树的重要的参数包括: max_features, max_depth, min_samples_split, min_samples_leaf.

  1. max_features: 决策树划分时最大特征数,默认为auto。当特征很多时,采用文中提到的技巧。
  2. max_depth: 决策树最大深度,数据或特征少的情况下,不需要修改。反之设置最大深度,具体取决于数据分布,常用10-100。
  3. min_samples_split: 内部节点再划分所需要的最小样本树,默认为2,如果特征或数据量很大,推荐增大该值。
  4. min_samples_leaf: 叶子节点最少样本树,如果叶子节点数目小于该值,则会被剪枝。默认为1,如果样本量很大,推荐增大该值。
  5. min_weight_fraction_leaf: 叶子节点所有样本的权重和的最小样本值,当某个节点下的所有叶子节点的权重和小于该值,则会被剪枝。默认为0,当有较多样本缺失值时,引入样本权重,则需要注意改值,可以有效去除缺失值的影响。
  6. max_leaf_nodes: 最大叶子节点数,可以防止过拟合,默认值为None,即不限制。当特征很多时,可以通过交叉验证获取该值。
  7. min_impurity_split: 最小不纯度,限制了决策树的增长,如果某个节点的不纯度小于该值,则不会继续生长。默认值为1e-7。

rf的方法函数

  • apply(X) 预测
    返回每棵树预测的叶子节点,结果为二维矩阵,行为样本的第几个样本,列为每棵树预测的叶子节点。
  • decesion_path(X)
    返回决策中的路劲
  • fit(X,y[,sample_weight])
    用训练数据来构造森林(训练)
  • get_params([deep])
    获得分类器的参数
  • predict(X)
    预测X的类别
  • predict_log_proba(X)
    预测X的类别的概率,类似于predict_proba,多了一个对数。
  • score(X,y[,sample_weight])
    返回给定数据集的预测准确度。
    还有常用属性以及titanic实列,参考链接https://blog.csdn.net/Kaiyuan_sjtu/article/details/80173417

应用场景

参考:https://blog.csdn.net/qq_39842017/article/details/88990831
金融风控,通过对获取到的用户特征建模,进行分类或回归预测,包括信用欺诈,违约概率,风险定价等。

解惑

  • adaboost和gbdt在迭代思想上的区别
    参考:https://blog.csdn.net/chengfulukou/article/details/76906710
    adaboost和gdbt在迭代思想上的区别,adaboost通过对样本的权重进行调整,而gdbt通过改变损失函数。

几句话说完

分为两大阵营,boosting和bagging,前者是串行的弱学习器组成,后者是并行的弱学习器组成。
boosting的代表作有adaboost和gdbt,bagging的代表作有bagging+rf

你可能感兴趣的:(训练)