Adaboost每次学习单一分类器以及单一分类器的权重。
抽象出Adaboost算法的整体框架逻辑,构建集成学习的一个非常重要的框架——前向分步算法。
不仅可以解决分类问题,也可以解决回归问题。
在Adaboost中,复杂分类器是基本分类器的加权和
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x)=\sum\limits_{m=1}^{M}\beta_mb(x;\gamma_m)
f(x)=m=1∑Mβmb(x;γm)
其中,
b
(
x
;
γ
m
)
b(x;\gamma_m)
b(x;γm)为基分类器,
γ
m
\gamma_m
γm为基分类器的参数,
β
m
\beta_m
βm为基分类器的权重
加法模型
在给定训练数据以及损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))的条件下,学习加法模型
f
(
x
)
f(x)
f(x)就是:
min
β
m
,
γ
m
∑
i
=
1
N
L
(
y
i
,
∑
m
=
1
M
β
m
b
(
x
i
;
γ
m
)
)
\min _{\beta_{m}, \gamma_{m}} \sum_{i=1}^{N} L\left(y_{i}, \sum_{m=1}^{M} \beta_{m} b\left(x_{i} ; \gamma_{m}\right)\right)
minβm,γm∑i=1NL(yi,∑m=1Mβmb(xi;γm))
前向分步算法的基本思路:因为学习的是加法模型,每一步只优化一个基函数及其系数,逐步逼近目标函数,可以降低优化的复杂度。
每一步只需要优化:
min
β
,
γ
∑
i
=
1
N
L
(
y
i
,
β
b
(
x
i
;
γ
)
)
\min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, \beta b\left(x_{i} ; \gamma\right)\right)
minβ,γ∑i=1NL(yi,βb(xi;γ))
Adaboost算法是前向分步算法的特例,Adaboost算法是由基本分类器组成的加法模型,损失函数为指数损失函数。
加法模型+前向分步算法的框架可以用于分类/回归
基函数用决策树
最佳划分点:
提升的标准:
得到算法
from sklearn.metrics import mean_squared_error from sklearn.datasets import make_friedman1 from sklearn.ensemble import GradientBoostingRegressor ''' GradientBoostingRegressor参数解释: loss:{‘ls’, ‘lad’, ‘huber’, ‘quantile’}, default=’ls’:‘ls’ 指最小二乘回归. ‘lad’ (最小绝对偏差) 是仅基于输入变量的顺序信息的高度鲁棒的损失函数。. ‘huber’ 是两者的结合. ‘quantile’允许分位数回归(用于alpha指定分位数) learning_rate:学习率缩小了每棵树的贡献learning_rate。在learning_rate和n_estimators之间需要权衡。 n_estimators:要执行的提升次数。 subsample:用于拟合各个基础学习者的样本比例。如果小于1.0,则将导致随机梯度增强。subsample与参数n_estimators。选择会导致方差减少和偏差增加。subsample < 1.0 criterion:{'friedman_mse','mse','mae'},默认='friedman_mse':“ mse”是均方误差,“ mae”是平均绝对误差。默认值“ friedman_mse”通常是最好的,因为在某些情况下它可以提供更好的近似值。 min_samples_split:拆分内部节点所需的最少样本数 min_samples_leaf:在叶节点处需要的最小样本数。 min_weight_fraction_leaf:在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。如果未提供sample_weight,则样本的权重相等。 max_depth:各个回归模型的最大深度。最大深度限制了树中节点的数量。调整此参数以获得最佳性能;最佳值取决于输入变量的相互作用。 min_impurity_decrease:如果节点分裂会导致杂质的减少大于或等于该值,则该节点将被分裂。 min_impurity_split:提前停止树木生长的阈值。如果节点的杂质高于阈值,则该节点将分裂 max_features{‘auto’, ‘sqrt’, ‘log2’},int或float:寻找最佳分割时要考虑的功能数量: 如果为int,则max_features在每个分割处考虑特征。 如果为float,max_features则为小数,并 在每次拆分时考虑要素。int(max_features * n_features) 如果“auto”,则max_features=n_features。 如果是“ sqrt”,则max_features=sqrt(n_features)。 如果为“ log2”,则为max_features=log2(n_features)。 如果没有,则max_features=n_features。 ''' X, y = make_friedman1(n_samples=1200, random_state=0, noise=1.0) X_train, X_test = X[:200], X[200:] y_train, y_test = y[:200], y[200:] est = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=1, random_state=0, loss='ls').fit(X_train, y_train) mean_squared_error(y_test, est.predict(X_test))
from sklearn.datasets import make_regression from sklearn.ensemble import GradientBoostingRegressor from sklearn.model_selection import train_test_split X, y = make_regression(random_state=0) X_train, X_test, y_train, y_test = train_test_split( X, y, random_state=0) reg = GradientBoostingRegressor(random_state=0) reg.fit(X_train, y_train) reg.score(X_test, y_test)
用Adaboost的思想做回归,其实就是GBDT,如果用GBDT进行分类,采用指数损失,就是adaboost算法
参考资料:
DataWhale开源资料
机器学习大杀器——梯度提升树GBDT https://zhuanlan.zhihu.com/p/45145899