关注"AI机器学习与深度学习算法"公众号
Bagging 集成学习是通过集成多个具有差异性的子模型构成的,这些子模型之间是相互独立的。除了 Bagging 这类集成学习方式之外,还有另外一类非常典型的集成学习方式 Boosting,"boosting" 的中文意思为增强推动,这类集成学习与 Bagging 这类集成学习最大的不同在于,Boosting 中的子模型之间不再是独立的关系,而是一个相互增强的关系,集成的每个模型都在尝试增强(Boosting)整体模型的效果。 Boosting 类的集成学习,主要有:Ada Boosting 和 Gradient Boosting 两种。
接下来以一个简单的回归问题为例,来看看 Ada Boosting 集成学习的思路。
图中从下到上具体分为三个部分:
Ada Boosting 具体过程:
接下来,看看如何使用 sklearn 封装好的 Ada Bossting 类。
import numpy as np
import matplotlib.pyplot as plt
本小节使用分布呈现交错半圆形的二分类虚拟数据集,使用 sklearn.datasets 包下的 make_moons 函数即可生成这样的虚拟数据集。
from sklearn import datasets
X, y = datasets.make_moons(n_samples = 500,
noise = 0.3,
random_state = 666)
在使用 make_moons 函数时指定三个参数:
使用散点图将生成的虚拟数据集绘制出来。
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 方法将数据集划分为训练集和测试集,使用训练集对模型进行训练,使用测试集对模型进行评估。
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 基本的算法,这里依然选择决策树作为基本的算法。
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)
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 模型进行评估。
ada_clf.score(X_test, y_test)
# 0.85599999999999998
另外一个比较常见的 Boosting 类的算法是:Gradient Boosting。Gradient Boosting 集成学习的思路如下:
m1, m2, m3 ... 的每一个模型其实都是对前一个模型所犯错误的一个补偿。如果要预测一个新的样本数据,最终的预测结果为:m1 + m2 + m3 + ...。
依然是以一个简单的回归问题为例,来看看 Gradient Boosting 集成学习。
图中从左到右:
通过右侧红色线的三个图示可以看出,随着集成子模型的数量越多,集成学习的整体效果越好。
使用 sklearn 封装好的 Gradient Boosting 非常简单,只需要从 ensemble(集成学习模块)中导入 GradientBoostingClassifier 类。由于 Gradient Boosting 集成学习算法的基本算法只能使用决策树算法,因此在设定参数时,不需要传入 base_estimator 基本算法,而直接指定决策树算法需要的参数。
from sklearn.ensemble import GradientBoostingClassifier
gd_clf = GradientBoostingClassifier(max_depth=2, n_estimators=30)
gd_clf.fit(X_train, y_train)
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 模型进行评估。
gb_clf.score(X_test, y_test)
# 0.90400000000000003
同样 Boosting 这类集成学习不仅能够解决分类问题,还能够解决回归问题。
from sklearn.ensemble import AdaBoostRegressor
from sklearn.ensemble import GradientBoostingRegressor
这些解决回归问题的集成学习类和解决分类问题的集成学习类的使用方式几乎是一致的,只不过对于回归问题来说,最终的输出结果是一个具体的数值。
References:
本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!