集成学习(含常用案列)

集成学习原理:
工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测
集成学习算法分类:
集成学习算法一般分为:bagging、boosting和Stacking
基学习器注意事项:
1.基础学习器之间要存在差异性。
2.基础学习器的能力不需要很强,只需要比随机猜测 0.5 高一点就行。
Bagging 框架
原理:
Baggging 框架通过有放回的抽样产生不同的训练集,从而训练具有差异性的弱学习器,然后通过平权投票、多数表决的方式决定预测结果。
Bagging 使用 bootstrap 采样, 会存在大约 ⅓ 左右的数据未被选中用于训练弱学习,这部分未被选中的数据被称为 oob(out of bag), 即:包外估计数据集。(也就是随机性体现在随机取样以及随机挑选特征)
随机森林:
算法:
1.用N来表示训练用例(样本)的个数,M表示特征数目。
2.输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
3.从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
4.对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。
5.对每棵树进行平权投票(分类)或者求平均(预测或者回归问题)
随机深林 API:(sklearn.ensemble.RandomForestClassifier())
n_estimators:决策树数量,(default = 10)
Criterion:entropy、或者 gini, (default = gini)
bootstrap:是否采用有放回抽样,如果为 False 将会使用全部训练样本,(default = True)
min_samples_split: 结点分裂所需最小样本数,(default = 2)
min_samples_leaf: 叶子节点的最小样本数,(default = 1)
min_impurity_split: 节点划分最小不纯度
Boosting:
Boosting 体现了提升思想,每一个训练器重点关注前一个训练器不足的地方进行训练,通过加权投票的方式,得出预测结果。
Boosting算法的著名代表就是Adaboost算法,前人栽树后人乘凉就是Ababoost,算法原理如下:
1.首先,初始化训练数据的权值分布。每一个训练样本最开始时都被赋予相同的权值:1/N
2.训练弱分类器:本轮训练中,若某样本分错,则提高它的权值,相反分类正确的样本被降低权值。然后,权值更新过的全体样本被用于训练下一个分类器,使得下一个分类器更关注权重大的难分样本。多次迭代,训练多个弱分类器。
3.加权组合弱分类器:加大分类误差率小的弱分类器的权重,使其在最终表决中起较大作用,而降低分类误差率大的弱分类器的权重,使其在最终表决中起较小作用。
Bagging 与 Boosting区别:
区别一:数据方面
Bagging:有放回采样
Boosting:全部数据集, 重点关注前一个弱学习器不足
区别二:投票方面
Bagging:平权投票
Boosting:加权投票
区别三:学习顺序
Bagging的学习是并行的,每个学习器没有依赖关系
Boosting学习是串行,学习有先后顺序
GBDT:(这个知道原理即可,现在有很多改进版)
GBDT(Gradient Boosting Decision Tree)是一种迭代的决策树算法,由多棵决策树组成,所有树的结论累加起来作为最终答案。
通俗理解:假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。最后将每次拟合的岁数加起来便是模型输出的结果。
若采用平方损失函数,则有:
集成学习(含常用案列)_第1张图片
可以省略倍数和常数项
XGBoost 原理:
XGBoost 是(eXtreme Gradient Boosting)的简称,是优化的分布式梯度提升库:基本原理与GBDT相同,属于Gradient Boosting 类型的机器学习算法,是对GBDT的优化,在训练每一棵树的时候GBDT采用了并行的方式进行训练,提高了模型训练速度。
模型的加法表达式:
集成学习(含常用案列)_第2张图片
值得一提的是,其实算预测结果的时候,前t-1的值实际上是知道的,原表达式右边可以用1到t-1的累加加上ft(Xi)(前向分布算法)
目标函数:
集成学习(含常用案列)_第3张图片
关于损失函数的说明:这里说2点,1、为啥不用梯度,因为大多数的树是局部连续甚至是离散的,不能使用梯度下降。2、损失函数主要受节点值的影响。
关于负责度控制的说明:上图最后一个表达式由2个超参数控制,1个是叶子节点数,1个是平均数求和,这样做是为了防止过拟合。
将目标函数进行二阶泰勒展开(其实GBDT可以使用1阶泰勒展开):
集成学习(含常用案列)_第4张图片
确定树结构的方法:
1.穷举法(特征数少的话使用),求出所有obj的值比较
2.贪心算法:当前树中的每一个叶子节点,用不同特征尝试进行分割,并用下面的函数计算分裂前和分裂后的增益分数,找到最优的分割方案(下图为英文文档的伪代码)
集成学习(含常用案列)_第5张图片
注意:i是样本的集合,d是特征维度(个人感觉是作者笔误,理解有误请指正,我用C++模拟实现的时候,用d的话是对的)
缺失值处理: 在训练过程中,如果特征出现了缺失值,会为该特征计算一个缺失值划分方向(左子树,右子树)

你可能感兴趣的:(机器学习,集成学习,机器学习,算法)