集成学习之 Ada Boosting & Gradient Boosting

Contents

一、 集成学习的思路

集成学习 3 种思路:

  • Bagging:独立的集成多个模型,每个模型有一定的差异,最终综合有差异的模型的结果,获得学习的最终的结果;
  • Boosting(增强集成学习):集成多个模型,每个模型都在尝试增强(Boosting)整体的效果;
  • Stacking(堆叠):集成 k 个模型,得到 k 个预测结果,将 k 个预测结果再传给一个新的算法,得到的结果为集成系统最终的预测结果;

二、增强集成学习(Boosting)

1. Ada Boosting

image1 图形介绍(假设对于一个回归问题)

  • 最下层代表全部的训练数据集,深色的点为模型预测错误的点,定义为权重高样本,需要下一次生成的子模型时被重点对待;浅色的点为模型预测成功的点,定义为权重低样本;
  • 中间层代表一种基本算法;
  • 最上层代表通过某个算法对不同权重的样本进行训练所生成的模型

流程介绍

  • 第一次进行训练得到第一个子模型
  • 根据第一个子模型,重新定义数据集:将预测错误的点划分较高的权重(深色点),将预测正确的点划分较低的权重(浅色点)
  • 进行第二次学习,使用上次重新定义的数据集进行训练,生成新的子模型,再根据模型预测结果重新定义数据集,重复上一步
  • 进行n次学习,最终得到n个子模型
  • 最终以所有子模型综合投票的结果作为 Ada Boosting 模型的最终学习结果;

特点

  • 每一次生成的子模型都在弥补上一次生成的子模型没有成功预测的样本点,这样每个子模型都在想办法推动(Boosting)整个基础系统,使得整个集成系统准确率更高

  • 每一个子模型都是基于同一数据集的样本点,只是样本点的权重不同,也就是样本对于每一个子模型的重要程度不同,因此每份子模型也是有差异的;

scikit-learn 中封装的 Ada Boosting

Ada Boosting集成学习和前面提到的RandomForest一样都既能解决分类问题又能解决回归问题。

from sklearn.ensemble import AdaBoostRegressor # 回归问题
from sklearn.ensemble import AdaBoostClassifier # 分类问题

Ada Boosting实例

这里仅简单示例,不进行调参

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split

X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)


from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2), n_estimators=500)
ada_clf.fit(X_train, y_train)

ada_clf.score(X_test, y_test)

输出

0.85599999999999998

2. Gradient Boosting

image2 图形介绍(假设对于一个回归问题)

  • 左侧绿色的线,代表生成的子模型,点代表上一个子模型越策错误的点,作为训练集
  • 右边红色的线,代表集成的子模型
  • 随着子模型的增多,集成算法的模型整体也随之改变,最终模型为:h1(x1)+h2(x)+h3(x) + …

流程介绍

  • 第一次进行训练得到第一个子模型h1(x1)。第一个子模型产生错误e1
  • 使用e1数据集训练第二个子模型h1(x1),第二个莫醒醒产生错误e2
  • 使用e2数据集训练第二个子模型h1(x1),第二个莫醒醒产生错误e3
  • 最终预测结果 h1(x1)+h2(x)+h3(x) + …

特点

  • 每一个模型都是对前一个模型所犯错误的补偿,使用错误的数据集进行训练
  • Gradient Boosting 集成学习算法不能对基本算法进行选择,它的的基本算法就是决策树算法

scikit-learn 中封装的 Gradient Boosting

Gradient Boosting集成学习和前面提到的Ada Boosting一样都既能解决分类问题又能解决回归问题。

from sklearn.ensemble import GradientBoostingRegressor # 回归问题
from sklearn.ensemble import GradientBoostingClassifier # 分类问题

Ada Boosting实例

这里仅简单示例,不进行调参

from sklearn.ensemble import GradientBoostingClassifier

gb_clf = GradientBoostingClassifier(max_depth=2, n_estimators=30)
gb_clf.fit(X_train, y_train)

gb_clf.score(X_test, y_test)

输出

0.90400000000000003

三、小结

Boosting 类的集成学习,主要有:Ada Boosting 和 Gradient Boosting 两类;

  • 对于Ada Boosting, 由于每个子模型要使用全部的数据集进行训练,因此 Ada Boosting 算法中没有 oob 数据集,在使用 Ada Boosting 算法前,需要划分数据集:train_test_split;
  • 每个 Ada Boosting 集成学习算法的模型只使用一个基本算法进行训练子模型;
  • 对于Gradient Boosting,是对于每次训练之后产生错误的训练集进行训练
  • Gradient Boosting就是以决策树作为基础的,所以base_estimator不像Ada Boosting可以选择

Further Reading

[1] 1.11.3. AdaBoost [2] 1.11.4. Gradient Tree Boosting


转载请注明:yezuolin的博客 » 点击阅读原文