前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门 13-6 Ada Boosting和Gradient Boosting

机器学习入门 13-6 Ada Boosting和Gradient Boosting

作者头像
触摸壹缕阳光
发布2021-06-15 17:02:42
9530
发布2021-06-15 17:02:42
举报
文章被收录于专栏:AI机器学习与深度学习算法

关注"AI机器学习与深度学习算法"公众号

Boosting

Bagging 集成学习是通过集成多个具有差异性的子模型构成的,这些子模型之间是相互独立的。除了 Bagging 这类集成学习方式之外,还有另外一类非常典型的集成学习方式 Boosting,"boosting" 的中文意思为增强推动,这类集成学习与 Bagging 这类集成学习最大的不同在于,Boosting 中的子模型之间不再是独立的关系,而是一个相互增强的关系,集成的每个模型都在尝试增强(Boosting)整体模型的效果。 Boosting 类的集成学习,主要有:Ada Boosting 和 Gradient Boosting 两种。

Ada Boosting

接下来以一个简单的回归问题为例,来看看 Ada Boosting 集成学习的思路。

图中从下到上具体分为三个部分:

  • 图中最底层代表全部的训练数据集,深色的点为模型预测错误的样本点,这些样本点被赋予更高的权重,需要下一次生成的子模型时被重点对待。浅色的样本点为模型预测成功的样本点,这些样本点被赋予更低的权重;
  • 图中中间层代表一种基本算法;
  • 图中最上层代表算法根据拥有不同权重的样本点,所训练出来的模型;

Ada Boosting 具体过程:

  • 第一次学习过程:使用基本算法在权重相同的样本点上训练得到一个子模型,根据第一个子模型的预测结果重新定义数据集:将预测错误的样本点(深色标识)赋予更高的权重,将预测成功的样本点(浅色标识)赋予较低权重;
  • 第二次学习过程:使用上一次学习后被重新定义的数据集进行训练,再根据模型的预测结果重新定义数据集:将预测错误的样本点(深色标识)赋予更高的权重,将预测成功的样本点(浅色标识)赋予更低的权重;
  • 以此类推,最终得到 n 个子模型;
总结
  • Ada Boosting 中的每个子模型都是想办法弥补上一次生成的子模型没有成功预测到的样本点。每个子模型都在推动(Boosting)整个集成学习模型,使得整个集成学习模型的准确率更高;
  • Ada Boosting 中的每个子模型实质都是在同一个数据集上进行训练的,只不过每次训练的样本点的权重不同,简单来说,带有权重的样本点对每一个子模型的重要程度不同,这也导致每个子模型具有差异性,最终以所有子模型综合投票的结果作为 Ada Boosting 集成模型的最终学习结果;

sklearn 封装的 Ada Boosting

接下来,看看如何使用 sklearn 封装好的 Ada Bossting 类。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

本小节使用分布呈现交错半圆形的二分类虚拟数据集,使用 sklearn.datasets 包下的 make_moons 函数即可生成这样的虚拟数据集。

代码语言:javascript
复制
from sklearn import datasets
    
X, y = datasets.make_moons(n_samples = 500,
                            noise = 0.3,
                            random_state = 666)

在使用 make_moons 函数时指定三个参数:

  • n_samples,生成样本点的总数。默认为 100 个,由于本章需要的数据量相对比较大,因此将 n_samples 设置为 500;
  • noise,加到数据集中的高斯噪声的标准差。默认为 None,noise 的值越小,生成的数据集呈现交错半圆形的分布形状越明显,noise 的值越大,生成的数据集呈现交错半圆形的分布形状越不明显,此时将 noise 设置为相对比较大的 0.3;
  • random_state,随机种子。设置固定的随机种子,能够保证多次试验结果的一致性;

使用散点图将生成的虚拟数据集绘制出来。

代码语言:javascript
复制
plt.scatter(X[y == 0, 0], X[y == 0, 1])
plt.scatter(X[y == 1, 0], X[y == 1, 1])
plt.show()

Ada Boosting 算法中每一个子模型都要使用全部的数据集进行训练,所以在 Ada Boosting 算法中没有 oob 数据集,因此在使用 Ada Boosting 算法之前,还需要使用 train_test_split 方法将数据集划分为训练集和测试集,使用训练集对模型进行训练,使用测试集对模型进行评估。

代码语言:javascript
复制
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 666)

使用 sklearn 封装好的 Ada Boosting 非常简单,只需要从 ensemble(集成学习模块)中导入 AdaBoostClassifier 类。使用 Ada Boosting 需要一个 base_estimator 基本的算法,这里依然选择决策树作为基本的算法。

代码语言:javascript
复制
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier

ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth = 2),
                            n_estimators = 500)
ada_clf.fit(X_train, y_train)
代码语言:javascript
复制
AdaBoostClassifier(algorithm='SAMME.R',
          base_estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=2,
            max_features=None, max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, presort=False, random_state=None,
            splitter='best'),
          learning_rate=1.0, n_estimators=500, random_state=None)

使用测试集对 Ada Boosting 模型进行评估。

代码语言:javascript
复制
ada_clf.score(X_test, y_test)
# 0.85599999999999998

Gradient Boosting

另外一个比较常见的 Boosting 类的算法是:Gradient Boosting。Gradient Boosting 集成学习的思路如下:

  • 使用某一种算法在整体的数据集上训练一个模型 m1,每个模型都会犯错误,m1 模型也不例外,假设 m1 模型产生的错误为 e1,e1 其实就是 m1 模型预测错误的样本点;
  • 针对 e1 训练第二个模型 m2,假设 m2 模型产生的错误为 e2,e2 其实就是 m2 模型预测错误的样本点;
  • 针对 e2 训练第三个模型 m3,假设 m3 模型产生的错误为 e3,e3 其实就是 m3 模型预测错误的样本点;
  • 以此类推;

m1, m2, m3 ... 的每一个模型其实都是对前一个模型所犯错误的一个补偿。如果要预测一个新的样本数据,最终的预测结果为:m1 + m2 + m3 + ...。

依然是以一个简单的回归问题为例,来看看 Gradient Boosting 集成学习。

图中从左到右:

  • 左侧绿色线的三个图示为三个子模型 m1, m2, m3;
  • 右侧红色线的三个图示为集成模型,从上到下一次为 m1, m1 + m2, m1 + m2 + m3;

通过右侧红色线的三个图示可以看出,随着集成子模型的数量越多,集成学习的整体效果越好。

sklearn 封装的 Gradient Boosting

使用 sklearn 封装好的 Gradient Boosting 非常简单,只需要从 ensemble(集成学习模块)中导入 GradientBoostingClassifier 类。由于 Gradient Boosting 集成学习算法的基本算法只能使用决策树算法,因此在设定参数时,不需要传入 base_estimator 基本算法,而直接指定决策树算法需要的参数。

代码语言:javascript
复制
from sklearn.ensemble import GradientBoostingClassifier

gd_clf = GradientBoostingClassifier(max_depth=2, n_estimators=30)
gd_clf.fit(X_train, y_train)
代码语言:javascript
复制
GradientBoostingClassifier(criterion='friedman_mse', init=None,
              learning_rate=0.1, loss='deviance', max_depth=2,
              max_features=None, max_leaf_nodes=None,
              min_impurity_decrease=0.0, min_impurity_split=None,
              min_samples_leaf=1, min_samples_split=2,
              min_weight_fraction_leaf=0.0, n_estimators=30,
              presort='auto', random_state=None, subsample=1.0, verbose=0,
              warm_start=False)

使用测试集对 Gradient Boosting 模型进行评估。

代码语言:javascript
复制
gb_clf.score(X_test, y_test)
# 0.90400000000000003

Boosting 解决回归问题

同样 Boosting 这类集成学习不仅能够解决分类问题,还能够解决回归问题。

代码语言:javascript
复制
from sklearn.ensemble import AdaBoostRegressor
from sklearn.ensemble import GradientBoostingRegressor

这些解决回归问题的集成学习类和解决分类问题的集成学习类的使用方式几乎是一致的,只不过对于回归问题来说,最终的输出结果是一个具体的数值。

References:

  1. Python3入门机器学习 经典算法与应用: https://coding.imooc.com/class/chapter/169.html#Anchor
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Boosting
  • Ada Boosting
    • 总结
    • sklearn 封装的 Ada Boosting
    • Gradient Boosting
    • sklearn 封装的 Gradient Boosting
    • Boosting 解决回归问题
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档