集成学习
决策树模型虽然简单明了,但单独使用时效果并不理想。因此决策树和逻辑回归配合使用。将两种模型联结成为一个整体后,模型的效果得到了明显的提升。但由于其中涉及两种完全不同的模型,在数学上很难给这种联结方式一个比较理想的抽象,因此在工程实现上,很难做到自动寻找最优的模型组合。
为了使模型间的组合更加自动化,最常规或者最成熟的做法就是只使用一种模型,比如决策树。通过某种方式将多个决策树组合起来,使用它们的“集体智慧”来解决问题,学术上被称为集成方法(ensemble method)。
那么什么是集成学习?
集成学习通过建立几个模型来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。* 这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测。*
针对决策树的集成方法通常可以被分为两类:平均方法(averaging methods)和提升方法(boosting methods)。它们的代表模型分别是随机森林和 GBTs。
随机森林
随机森林(random forests)由
- 对于分类问题,最终结果等于在决策树预测结果中出现次数最多的类别。直观上,可以将每个决策树想象成一个人,而随机森林想象成一场投票,通过少数服从多数的原则得到最终的结果。
- 对于回归问题,最终结果等于决策树预测结果的平均值。
随机森林的建模依据是:一棵树犯错的概率比较大,但很多树同时犯错的概率就很小了。通过一个简单的例子,从数学上来证明一下这种做法的正确性。假设针对某个分类问题,有 3 棵相互独立的决策树,它们各自预测错误的概率为 20%。如果将它们按少数服从多数的原则组合起来,形成一个随机森林,那么预测犯错的情况可分为如下两种:3 棵决策树都错误或者只有一棵树预测正确。计算可得这个随机森林的犯错概率下降到 10.4%。
由上面的例子可以看到,随机森林预测效果最重要的保证是森林中的决策树是相互独立的(极端地,假设森林中的每棵树都是一样的,则随机森林模型等同于决策树模型)。那么针对同一份训练数据,应该如何产生随机的决策树呢?
首先回顾一下决策树划分节点的具体步骤。使用训练集中的所有数据(假设数据被分为训练集和测试集)训练模型。对于需要划分的节点,选择最优的一个自变量以及相应的阈值,将其划分为左右两个子节点,使得子节点的不纯度之和达到最小。因此,可以从如下的 3 个层面引入决策树的随机性。
- 对于每个决策树,从原始训练集中随机选取训练该决策树的数据。
- 在划分节点时,并不遍历全部自变量,而是随机挑选其中的一部分作为候选自变量。
- 在选择自变量的划分阈值时,并不求得最优的解,而是随机构成一个候选阈值集合,并从中选取效果最优的(子节点的不纯度之和最低)。
针对随机森林,第三方库 scikit-learn 提供了两种实现:random forests 和 extremely randomized trees。这两者的差异在于 random forests 实现了随机性中的前两点,即训练数据随机以及候选自变量随机,而 extremely randomized trees 实现了随机性中的全部 3 点。在代码层面,这两类模型被封装成 4 个类(模型的参数和调用代码与决策树类似,在此不再赘述,有兴趣的读者请参考 scikit-learn 官方网站)。
- random forests 包括两个类:用于分类问题的 RandomForestClassifier 和用于回归问题的 RandomForestRegressor。
- extremely randomized trees 也包含两个类:ExtraTreesClassifier 和 ExtraTreesRegressor。它们分别解决分类问题和回归问题。
集成学习中 boosting 和 Bagging
机器学习的两个核心任务
- 任务一:如何优化训练数据 —> 主要用于 解决欠拟合问题
- 任务二:如何提升泛化性能 —> 主要用于 解决过拟合问题
只要单分类器的表现不太差,集成学习的结果总是要好于单分类器的
小结
- 什么是集成学习【了解】
- 通过建立几个模型来解决单一预测问题
- 机器学习两个核心任务【知道】
- 1.解决欠拟合问题
- 弱弱组合变强
- boosting
- 2.解决过拟合问题
- 互相遏制变壮
- Bagging
- 1.解决欠拟合问题
Bagging
Bagging 集成原理
目标:把下面的圈和方块进行分类
实现过程:
1.采样不同数据集
2.训练分类器
3.平权投票,获取最终结果
4.主要实现过程小结
随机森林构造过程
在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
随机森林 = Bagging + 决策树
例如,如果你训练了 5 个树,其中有 4 个树的结果是 True, 1 个树的结果是 False, 那么最终投票结果就是 True
随机森林够造过程中的关键步骤(M 表示特征数目):
1)一次随机选出一个样本,有放回的抽样,重复 N 次(有可能出现重复的样本)
2)随机去选出 m 个特征
- 思考
- 为什么要随机抽样训练集?
- 如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的
- 为什么要有放回地抽样? 如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,都是绝对“片面的”(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决。
- 为什么要随机抽样训练集?
随机森林 API 介绍
sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None, bootstrap=True,random_state=None, min_samples_split=2)
- n_estimators:integer,optional(default = 10)森林里的树木数量 120,200,300,500,800,1200
- Criterion:string,可选(default =“gini”)分割特征的测量方法
- max_depth:integer 或 None,可选(默认=无)树的最大深度 5,8,15,25,30
- max_features="auto”,每个决策树的最大特征数量
- If "auto", then
max_features=sqrt(n_features)
. - If "sqrt", then
max_features=sqrt(n_features)
(same as "auto"). - If "log2", then
max_features=log2(n_features)
. - If None, then
max_features=n_features
.
- If "auto", then
- bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样
- min_samples_split:节点划分最少样本数
- min_samples_leaf:叶子节点的最小样本数
- 超参数:n_estimator, max_depth, min_samples_split,min_samples_leaf
随机森林预测案例
- 实例化随机森林
estimator = RandomForestClassifier(
n_estimators=10, criterion="entropy", max_depth=5
)
- 定义超参数的选择列表
param_grid = {
"n_estimators": [120, 200, 300, 500, 800, 1200],
"max_depth": [5, 8, 15, 25, 30]
}
- 使用 GridSearchCV 进行网格搜索
# 超参数调优
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
estimator.fit(x_train, y_train)
# 5.模型评估
print('预测结果', estimator.predict(x_test))
print('准确率:\t', estimator.score(x_test, y_test))
注意
- 随机森林的建立过程
- 树的深度、树的个数等需要进行超参数调优
bagging 集成优点
Bagging + 决策树/线性回归/逻辑回归/深度学习… = bagging 集成学习方法
经过上面方式组成的集成学习方法:
- 均可在原有算法上提高约 2% 左右的泛化正确率
- 简单,方便,通用
小结
- bagging 集成过程【知道】
- 1.采样 — 从所有样本里面,采样一部分
- 2.学习 — 训练弱学习器
- 3.集成 — 使用平权投票
- 随机森林介绍【知道】
- 随机森林定义
- 随机森林 = Bagging + 决策树
- 流程:
- 1.随机选取 m 条数据
- 2.随机选取 k 个特征
- 3.训练决策树
- 4.重复 1-3
- 5.对上面的若决策树进行平权投票
- 注意:
- 1.随机选取样本,且是有放回的抽取
- 2.选取特征的时候吗,选择 m<<M
- M 是所有的特征数
- api
- sklearn.ensemble.RandomForestClassifier()
- 随机森林定义
- Bagging + 决策树/线性回归/逻辑回归/深度学习… = bagging 集成学习方法【了解】
- bagging 的优点【了解】
- 1.均可在原有算法上提高约 2% 左右的泛化正确率
- 2.简单,方便,通用
Boosting
什么是 boosting
随着学习的积累从弱到强
简而言之:每新加入一个弱学习器,整体能力就会得到提升
代表算法:Adaboost,GBDT,XGBoost
实现过程
1、训练第一个学习器
2、调整数据分布
3、训练第二个学习器
4、再次调整数据分布
5、依次训练学习器,调整数据分布
6、整体过程实现
关键点:
如何确认投票权重?
如何调整数据分布?
AdaBoost 的构造过程小结
bagging 集成与 boosting 集成的区别:
区别一:数据方面
Bagging:对数据进行采样训练;
Boosting:根据前一轮学习结果调整数据的重要性。
区别二:投票方面
Bagging:所有学习器平权投票;
Boosting:对学习器进行加权投票。
区别三:学习顺序
Bagging 的学习是并行的,每个学习器没有依赖关系;
Boosting 学习是串行,学习有先后顺序。
区别四:主要作用
Bagging 主要用于提高泛化性能(解决过拟合,也可以说降低方差)
Boosting 主要用于提高训练精度(解决欠拟合,也可以说降低偏差)
API 介绍
from sklearn.ensemble import AdaBoostClassifier
GBDT(了解)
梯度提升决策树 (GBDT Gradient Boosting Decision Tree) 是一种迭代的决策树算法,** 该算法由多棵决策树组成,所有树的结论累加起来做最终答案。**它在被提出之初就被认为是泛化能力(generalization) 较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。
GBDT = 梯度下降 + Boosting + 决策树
梯度的概念 (复习)
GBDT 执行流程
如果上式中的 hi(x)=决策树模型,则上式就变为:
GBDT = 梯度下降 + Boosting + 决策树
案例
预测编号 5 的身高:
编号 | 年龄 (岁) | 体重 (KG) | 身高 (M) |
---|---|---|---|
1 | 5 | 20 | 1.1 |
2 | 7 | 30 | 1.3 |
3 | 21 | 70 | 1.7 |
4 | 30 | 60 | 1.8 |
5 | 25 | 65 | ? |
第一步:计算损失函数,并求出第一个预测值:
第二步:求解划分点
得出:年龄 21 为划分点的方差=0.01+0.0025=0.0125
第三步:通过调整后目标值,求解得出 h1(x)
第四步:求解 h2(x)
… …
得出结果:
编号 5 身高 = 1.475 + 0.03 + 0.275 = 1.78
GBDT 主要执行思想
1.使用梯度下降法优化代价函数;
2.使用一层决策树作为弱学习器,负梯度作为目标值;
3.利用 boosting 思想进行集成。
小结
boosting 集成原理【了解】
- 随着学习的积累从弱到强
实现过程【知道】
- 1.初始化训练数据权重,初始权重是相等的
- 2.通过这个学习器,计算错误率
- 3.计算这个学习器的投票权重
- 4.对每个样本进行重新赋权
- 5.重复前面 1-4
- 6.对构建后的最后的学习器进加权投票
bagging 集成与 boosting 集成的区别:【知道】
- 数据方面:
- bagging:重新采样
- boosting:对数据进行权重调整
- 投票方面:
- bagging:平权
- boosting:加权
- 学习顺序方面:
- bagging:并行
- boosting:串行
- 主要作用:
- bagging:过拟合
- boosting:欠拟合
- 数据方面:
梯度提升决策树 (GBDT Gradient Boosting Decision Tree)【了解】
- GBDT = 梯度下降 + Boosting + 决策树