集成算法 | AdaBoost
提升法(Boosting)
其基评估器是相关的 ,是按顺序⼀⼀构建的。其核⼼思想是结合弱评估器的⼒量⼀次次对难以评估的样本进⾏预测,从⽽构成⼀个强评估器。提升法的代表模型Adaboost
和梯度提升树GBDT
。
工作机制: 先从最初训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复,直至学习器数目到达事先制定的值T,最终将这个T 个基学习器进行加权结合。
Boosting
最著名的代表是Adaboosting
Adaboosting算法
输入:
训练集; 基学习算法,训练轮数过程:
1: 初始化样本权值分布
2:
3: 基于分布 从数据集 中训练出分类器
4: 估计的分类误差率
5:
6: 确定分类器 的权重
7:
更新样本分布,其中是规范化因子,以确保是一个分布
8: 输出:
AdaBoost
AdaBoost
,是英文"Adaptive Boosting"(自适应增强)
的缩写,由 Yoav Freund 和 Robert Schapire 在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强(也就是得到更高的权重),加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类 器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数,算法停止。
以决策树作为弱学习器的AdaBoost
通常被称为最佳开箱即用的分类器。
Adaboost 迭代算法就3步:
初始化训练数据的权重。 如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
训练弱分类器。 具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
将各个训练得到的弱分类器组合成强分类器。 各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
AdaBoostClassifier
AdaBoost分类器
AdaBoostClassifier(
base_estimator=None,
n_estimators=50,
learning_rate=1.0,
algorithm='SAMME.R',
random_state=None,
)
base_estimator : object, optional (default=None)
弱分类器。None或输入字符串,默认为None。理论上可以选择任何一个分类学习器,不过需要支持样本权重。常用
CART决策树或神经网络MLP
。如果为None,则弱分类器为DecisionTreeClassifier(max_depth=1)
n_estimators : int, optional (default=50)
弱学习器的最大迭代次数,或者说最大的弱学习器的个数。整数,默认50,太小易欠拟合;太大易过拟合。实际调参数过程中
n_estimators与learning_rate
一起考虑。learning_rate : float, optional (default=1.)
每个弱学习器的权重缩减系数。对于同样的训练集拟合效果,较小的权重缩减系数意味着需要更多的弱学习器的迭代次数。
algorithm : {'SAMME', 'SAMME.R'}, optional (default='SAMME.R')
AdaBoost两种分类算法
'SAMME', 'SAMME.R'
,两者的主要区别是弱学习器权重的度量。
'SAMME'使用了对样本集分类效果作为弱学习器权重。 'SAMME.R'使用了对样本集分类的预测概率大小作为弱学习器权重。 'SAMME.R'使用了概率度量的连续值,迭代一般比'SAMME'快。但其要求弱分类学习器参数base_estimator必须限制使用支持概率预测的分类器。 random_state : int, RandomState instance or None, optional (default=None)
整数,random_state是随机数生成器生成的随机数种子; Random_State实例,则random_state是一个随机数生成器; None,随机数生成器会是np.random模块中的Random_State实例。
实例一
数据准备
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles
# 生成2维正态分布,生成的数据按分位数分为两类,500个样本,2个样本特征,协方差系数为2
X1, y1 = make_gaussian_quantiles(cov=2.0,n_samples=500, n_features=2,n_classes=2, random_state=1)
# 生成2维正态分布,生成的数据按分位数分为两类,400个样本,2个样本特征均值都为3,协方差系数为2
X2, y2 = make_gaussian_quantiles(mean=(3, 3), cov=1.5,n_samples=400, n_features=2, n_classes=2, random_state=1)
#将两组数据合成一组数据
X = np.concatenate((X1, X2))
y = np.concatenate((y1, - y2 + 1))
数据可视化
两个特征,两个输出类别,用颜色区别
plt.figure(figsize=(10,8))
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
模型建立
ABC = AdaBoostClassifier(
DecisionTreeClassifier(max_depth=2, min_samples_split=20,
min_samples_leaf=5),
algorithm="SAMME",
n_estimators=200,
earning_rate=0.8)
ABC.fit(X, y)
这里我们选择了'SAMME'算法
,最多200个弱分类器,步⻓0.8,在实际运用中可通过交叉验证调参而选择最好的参数。拟合完了后,用网格图来看看它拟合的区域。
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
Z = ABC.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(figsize=(10,6))
cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
plt.show()
输出
查看拟合分数
>>> print("Score:" , ABC.score(X,y))
Score: 0.9133333333333333
AdaBoostRegressor
AdaBoost回归器
AdaBoostRegressor(
base_estimator=None,
n_estimators=50,
learning_rate=1.0,
loss='linear',
random_state=None,
)
base_estimator : object, optional (default=None)
弱分类器。None或输入字符串,默认为None。理论上可以选择任何一个分类学习器,不过需要支持样本权重。常用
CART决策树或神经网络MLP
。如果为None,则弱分类器为DecisionTreeRegressor(max_depth=3)
n_estimators : integer, optional (default=50)
弱学习器的最大迭代次数,或者说最大的弱学习器的个数。整数,默认50,太小易欠拟合;太大易过拟合。实际调参数过程中
n_estimators与learning_rate
一起考虑。learning_rate : float, optional (default=1.)
每个弱学习器的权重缩减系数。对于同样的训练集拟合效果,较小的权重缩减系数意味着需要更多的弱学习器的迭代次数。
loss : {'linear', 'square', 'exponential'}, optional (default='linear')
一般使用线性就足够了。其值对应了对k个弱分类器中的第i个样本的误差的处理。
random_state : int, RandomState instance or None, optional (default=None)
整数,random_state是随机数生成器生成的随机数种子; Random_State实例,则random_state是一个随机数生成器; None,随机数生成器会是np.random模块中的Random_State实例。
案例二
导包、数据准备
#导入所需的模块和包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
#创造数据集
rng = np.random.RandomState(1)
X = np.linspace(0, 6, 100).reshape(-1,1)
y = np.sin(X).ravel() + np.sin(6 * X).ravel() + rng.normal(0, 0.1, X.shape[0])
模型训练与预测
#训练回归模型
DTR = DecisionTreeRegressor(max_depth=4)
ABR = AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),n_estimators=300, random_state=rng)
DTR.fit(X, y)
ABR.fit(X, y)
#预测结果
y_1 = DTR.predict(X)
y_2 = ABR.predict(X)
结果可视化
#绘制可视化图形
plt.figure(figsize=(15,6))
plt.scatter(X, y, c="k", label="training samples")
plt.plot(X, y_1, c="orange", label="DTR", linewidth=2)
plt.plot(X, y_2, c="g", label="ABR", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Boosted Decision Tree Regression", fontsize=15)
plt.legend()
plt.show()
输出结果
推荐阅读-- 数据STUDIO --