前向分步算法
AdaBoost是一种加法集成策略的boosting算法,加法集成策略的boosting算法包括提升树、梯度提升树、以及比较火热的XGBoost。加法模型可使用前向分步算法求解。
在Adaboost的算法中,是使用多个基本分类器来利用Boosting(提升)的方法来实现的,每个分类器都是串行的,具有顺序承接的特性。所以中训练的过程中,可以认为Adaboost每次学习单一分类器以及单一分类器的参数(权重)。
抽象出Adaboost算法的整体框架逻辑,构建集成学习的一个非常重要的框架----前向分步算法。
(1) 加法模型(aditive model):
在Adaboost模型中,我们把每个基本分类器合成一个复杂分类器的方法是每个基本分类器的加权和
即:
f
(
x
)
=
∑
m
=
1
M
β
m
b
(
x
;
γ
m
)
f(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right)
f(x)=∑m=1Mβmb(x;γm),
其中,
b
(
x
;
γ
m
)
b\left(x ; \gamma_{m}\right)
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)
βm,γmmini=1∑NL(yi,m=1∑Mβ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)
β,γmini=1∑NL(yi,βb(xi;γ))
(2) 前向分步算法(forward stagewise algorithm):
加分模型(aditive model)是线性模型,按照顺序逐步学习一个基函数及其系数,即可逐步逼近优化。
前向分布和贝叶斯都假设每一步之间的基函数和系数是独立不相关的(贝叶斯中成为独立同分布),所以才可以把全局最优解求解等价为子项求解。每一步之间的依赖关联会被丢弃,损失精确度。
给定数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
}
T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}
T={(x1,y1),(x2,y2),⋯,(xN,yN)},
x
i
∈
X
⊆
R
n
x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n}
xi∈X⊆Rn,
y
i
∈
Y
=
{
+
1
,
−
1
}
y_{i} \in \mathcal{Y}=\{+1,-1\}
yi∈Y={+1,−1}。损失函数
L
(
y
,
f
(
x
)
)
L(y, f(x))
L(y,f(x)),基函数集合
{
b
(
x
;
γ
)
}
\{b(x ; \gamma)\}
{b(x;γ)},我们需要输出加法模型
f
(
x
)
f(x)
f(x)。
这是一个二分类的任务!
- 初始化: f 0 ( x ) = 0 f_{0}(x)=0 f0(x)=0
- 对m = 1,2,…,M:
- (a) 极小化损失函数:
( β m , γ m ) = arg min β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) \left(\beta_{m}, \gamma_{m}\right)=\arg \min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+\beta b\left(x_{i} ; \gamma\right)\right) (βm,γm)=argβ,γmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))
得到参数 β m \beta_{m} βm与 γ m \gamma_{m} γm - (b) 更新:
f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_{m}(x)=f_{m-1}(x)+\beta_{m} b\left(x ; \gamma_{m}\right) fm(x)=fm−1(x)+βmb(x;γm)
- (a) 极小化损失函数:
- 得到加法模型:
f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=f_{M}(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right) f(x)=fM(x)=m=1∑Mβmb(x;γm)
前向分步算法将同时求解从m=1到M的所有参数
β
m
\beta_{m}
βm,
γ
m
\gamma_{m}
γm的优化问题简化为逐次求解各个
β
m
\beta_{m}
βm,
γ
m
\gamma_{m}
γm的问题。
(3) 前向分步算法与Adaboost的关系:
① 初始化训练数据的分布:
D
1
=
(
w
11
,
⋯
,
w
1
i
,
⋯
,
w
1
N
)
,
w
1
i
=
1
N
,
i
=
1
,
2
,
⋯
,
N
D_{1}=\left(w_{11}, \cdots, w_{1 i}, \cdots, w_{1 N}\right), \quad w_{1 i}=\frac{1}{N}, \quad i=1,2, \cdots, N
D1=(w11,⋯,w1i,⋯,w1N),w1i=N1,i=1,2,⋯,N
② 对于m=1,2,…,M
- 使用具有权值分布 D m D_m Dm的训练数据集进行学习,得到基本分类器: G m ( x ) : X → { − 1 , + 1 } G_{m}(x): \mathcal{X} \rightarrow\{-1,+1\} Gm(x):X→{−1,+1}
- 计算 G m ( x ) G_m(x) Gm(x)在训练集上的分类误差率 e m = ∑ i = 1 N P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N w m i I ( G m ( x i ) ≠ y i ) e_{m}=\sum_{i=1}^{N} P\left(G_{m}\left(x_{i}\right) \neq y_{i}\right)=\sum_{i=1}^{N} w_{m i} I\left(G_{m}\left(x_{i}\right) \neq y_{i}\right) em=∑i=1NP(Gm(xi)=yi)=∑i=1NwmiI(Gm(xi)=yi)
- 计算 G m ( x ) G_m(x) Gm(x)的系数 α m = 1 2 log 1 − e m e m \alpha_{m}=\frac{1}{2} \log \frac{1-e_{m}}{e_{m}} αm=21logem1−em,这里的log是自然对数ln
- 更新训练数据集的权重分布
D m + 1 = ( w m + 1 , 1 , ⋯ , w m + 1 , i , ⋯ , w m + 1 , N ) w m + 1 , i = w m i Z m exp ( − α m y i G m ( x i ) ) , i = 1 , 2 , ⋯ , N \begin{array}{c} D_{m+1}=\left(w_{m+1,1}, \cdots, w_{m+1, i}, \cdots, w_{m+1, N}\right) \\ w_{m+1, i}=\frac{w_{m i}}{Z_{m}} \exp \left(-\alpha_{m} y_{i} G_{m}\left(x_{i}\right)\right), \quad i=1,2, \cdots, N \end{array} Dm+1=(wm+1,1,⋯,wm+1,i,⋯,wm+1,N)wm+1,i=Zmwmiexp(−αmyiGm(xi)),i=1,2,⋯,N
这里的 Z m Z_m Zm是规范化因子,使得 D m + 1 D_{m+1} Dm+1称为概率分布, Z m = ∑ i = 1 N w m i exp ( − α m y i G m ( x i ) ) Z_{m}=\sum_{i=1}^{N} w_{m i} \exp \left(-\alpha_{m} y_{i} G_{m}\left(x_{i}\right)\right) Zm=∑i=1Nwmiexp(−αmyiGm(xi))
③ 构建基本分类器的线性组合 f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M} \alpha_{m} G_{m}(x) f(x)=∑m=1MαmGm(x),得到最终的分类器
G
(
x
)
=
sign
(
f
(
x
)
)
=
sign
(
∑
m
=
1
M
α
m
G
m
(
x
)
)
\begin{aligned} G(x) &=\operatorname{sign}(f(x)) \\ &=\operatorname{sign}\left(\sum_{m=1}^{M} \alpha_{m} G_{m}(x)\right) \end{aligned}
G(x)=sign(f(x))=sign(m=1∑MαmGm(x))
Adaboost算法是前向分步算法的特例,Adaboost算法是由基本分类器组成的加法模型,损失函数为指数损失函数。
损失函数取:
L
(
y
i
,
f
(
x
i
)
)
=
e
x
p
(
−
y
f
(
x
)
)
L(y_{i},f(x_{i}))=exp(-yf(x))
L(yi,f(xi))=exp(−yf(x))
前向分步算法会逐一学习每个基函数G(x),这一过程与AdaBoost算法逐一学习基本分类器的过程一致。
梯度提升决策树(GBDT)
(1) 基于残差学习的提升树算法:
在使用加法模型+前向分步算法的框架解决问题前,可以确定框架内使用的基函数是决策树分类器。而在回归的问题中,使用回归树作为基模型。而因为回归问题中预测的是一个连续的数值,可划分点包含了所有特征的所有可取的值。。因此使用平方误差来评判拟合程度。
用每个样本的残差修正样本权重以及计算每个基本分类器的权重
算法步骤如下:
输入数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
}
,
x
i
∈
X
⊆
R
n
,
y
i
∈
Y
⊆
R
T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n}, y_{i} \in \mathcal{Y} \subseteq \mathbf{R}
T={(x1,y1),(x2,y2),⋯,(xN,yN)},xi∈X⊆Rn,yi∈Y⊆R,输出最终的提升树
f
M
(
x
)
f_{M}(x)
fM(x)
- 初始化 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0
- 对m = 1,2,…,M:
- 计算每个样本的残差: r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , ⋯ , N r_{m i}=y_{i}-f_{m-1}\left(x_{i}\right), \quad i=1,2, \cdots, N rmi=yi−fm−1(xi),i=1,2,⋯,N
- 拟合残差 r m i r_{mi} rmi学习一棵回归树,得到 T ( x ; Θ m ) T\left(x ; \Theta_{m}\right) T(x;Θm)
- 更新 f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f_{m}(x)=f_{m-1}(x)+T\left(x ; \Theta_{m}\right) fm(x)=fm−1(x)+T(x;Θm)
- 得到最终的回归问题的提升树: f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_{M}(x)=\sum_{m=1}^{M} T\left(x ; \Theta_{m}\right) fM(x)=∑m=1MT(x;Θm)
下面的例子形象的体现 基于残差学习的提升树 的概念
(2) 梯度提升决策树算法(GBDT):
提升树利用加法模型和前向分步算法实现学习的过程,当损失函数为平方损失和指数损失时,每一步优化是相当简单的,也就是我们前面探讨的提升树算法和Adaboost算法。但是对于一般的损失函数而言,往往每一步的优化不是那么容易,针对这一问题,我们得分析问题的本质,也就是是什么导致了在一般损失函数条件下的学习困难。对比以下损失函数:
Setting
Loss Function
−
∂
L
(
y
i
,
f
(
x
i
)
)
/
∂
f
(
x
i
)
Regression
1
2
[
y
i
−
f
(
x
i
)
]
2
y
i
−
f
(
x
i
)
Regression
∣
y
i
−
f
(
x
i
)
∣
sign
[
y
i
−
f
(
x
i
)
]
Regression
Huber
y
i
−
f
(
x
i
)
for
∣
y
i
−
f
(
x
i
)
∣
≤
δ
m
δ
m
sign
[
y
i
−
f
(
x
i
)
]
for
∣
y
i
−
f
(
x
i
)
∣
>
δ
m
where
δ
m
=
α
th-quantile
{
∣
y
i
−
f
(
x
i
)
∣
}
Classification
Deviance
k
th component:
I
(
y
i
=
G
k
)
−
p
k
(
x
i
)
\begin{array}{l|l|l} \hline \text { Setting } & \text { Loss Function } & -\partial L\left(y_{i}, f\left(x_{i}\right)\right) / \partial f\left(x_{i}\right) \\ \hline \text { Regression } & \frac{1}{2}\left[y_{i}-f\left(x_{i}\right)\right]^{2} & y_{i}-f\left(x_{i}\right) \\ \hline \text { Regression } & \left|y_{i}-f\left(x_{i}\right)\right| & \operatorname{sign}\left[y_{i}-f\left(x_{i}\right)\right] \\ \hline \text { Regression } & \text { Huber } & y_{i}-f\left(x_{i}\right) \text { for }\left|y_{i}-f\left(x_{i}\right)\right| \leq \delta_{m} \\ & & \delta_{m} \operatorname{sign}\left[y_{i}-f\left(x_{i}\right)\right] \text { for }\left|y_{i}-f\left(x_{i}\right)\right|>\delta_{m} \\ & & \text { where } \delta_{m}=\alpha \text { th-quantile }\left\{\left|y_{i}-f\left(x_{i}\right)\right|\right\} \\ \hline \text { Classification } & \text { Deviance } & k \text { th component: } I\left(y_{i}=\mathcal{G}_{k}\right)-p_{k}\left(x_{i}\right) \\ \hline \end{array}
Setting Regression Regression Regression Classification Loss Function 21[yi−f(xi)]2∣yi−f(xi)∣ Huber Deviance −∂L(yi,f(xi))/∂f(xi)yi−f(xi)sign[yi−f(xi)]yi−f(xi) for ∣yi−f(xi)∣≤δmδmsign[yi−f(xi)] for ∣yi−f(xi)∣>δm where δm=α th-quantile {∣yi−f(xi)∣}k th component: I(yi=Gk)−pk(xi)
观察Huber损失函数:
L
δ
(
y
,
f
(
x
)
)
=
{
1
2
(
y
−
f
(
x
)
)
2
for
∣
y
−
f
(
x
)
∣
≤
δ
δ
∣
y
−
f
(
x
)
∣
−
1
2
δ
2
otherwise
L_{\delta}(y, f(x))=\left\{\begin{array}{ll} \frac{1}{2}(y-f(x))^{2} & \text { for }|y-f(x)| \leq \delta \\ \delta|y-f(x)|-\frac{1}{2} \delta^{2} & \text { otherwise } \end{array}\right.
Lδ(y,f(x))={21(y−f(x))2δ∣y−f(x)∣−21δ2 for ∣y−f(x)∣≤δ otherwise
针对上面的问题,Freidman提出了梯度提升算法(gradient boosting),这是利用最速下降法的近似方法,利用损失函数的负梯度在当前模型的值
−
[
∂
L
(
y
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
-\left[\frac{\partial L\left(y, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{m-1}(x)}
−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)作为回归问题提升树算法中的残差的近似值,拟合回归树。与其说负梯度作为残差的近似值,不如说残差是负梯度的一种特例。
以下开始具体介绍梯度提升算法:
输入训练数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
}
,
x
i
∈
X
⊆
R
n
,
y
i
∈
Y
⊆
R
T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n}, y_{i} \in \mathcal{Y} \subseteq \mathbf{R}
T={(x1,y1),(x2,y2),⋯,(xN,yN)},xi∈X⊆Rn,yi∈Y⊆R和损失函数
L
(
y
,
f
(
x
)
)
L(y, f(x))
L(y,f(x)),输出回归树
f
^
(
x
)
\hat{f}(x)
f^(x)
- 初始化 f 0 ( x ) = arg min c ∑ i = 1 N L ( y i , c ) f_{0}(x)=\arg \min _{c} \sum_{i=1}^{N} L\left(y_{i}, c\right) f0(x)=argminc∑i=1NL(yi,c)
- 对于m=1,2,…,M:
- 对i = 1,2,…,N计算: r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{m i}=-\left[\frac{\partial L\left(y_{i}, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
- 对 r m i r_{mi} rmi拟合一个回归树,得到第m棵树的叶结点区域 R m j , j = 1 , 2 , ⋯ , J R_{m j}, j=1,2, \cdots, J Rmj,j=1,2,⋯,J
- 对j=1,2,…J,计算: c m j = arg min c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{m j}=\arg \min _{c} \sum_{x_{i} \in R_{m j}} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+c\right) cmj=argminc∑xi∈RmjL(yi,fm−1(xi)+c)
- 更新 f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_{m}(x)=f_{m-1}(x)+\sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right) fm(x)=fm−1(x)+∑j=1JcmjI(x∈Rmj)
- 得到回归树: f ^ ( x ) = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) \hat{f}(x)=f_{M}(x)=\sum_{m=1}^{M} \sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right) f^(x)=fM(x)=∑m=1M∑j=1JcmjI(x∈Rmj)
为什么要用学习率呢?这是Shrinkage的思想,如果每次都全部加上(学习率为1)很容易一步学到位导致过拟合。
优化梯度提升决策树(GBDT)
(1) 在预测阶段,每个CART是独立的,因此可以并行计算。另外,得益于决策树的高效率,GBDT在预测阶段的计算速度是非常快的。
(2) 在训练阶段,GBDT里的CART之间存在依赖,无法并行,所以GBDT的训练速度是比较慢的。人们提出了一些方法,用来提升这个阶段的并行度,以提升学习速度。
(3) 这里为了简单,使用了残差平方和作为损失函数,实际上还可以使用绝对值损失函数、huber损失函数等,从而让GBDT在鲁棒性等方面得到提升。
(4) GBDT的学习能力非常强,容易过拟合。大部分时候,我们都会给目标函数添加针对模型复杂度的惩罚项,从而控制模型复杂度
下面我们来使用sklearn来使用GBDT:
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html?highlight=gra#sklearn.ensemble.GradientBoostingClassifier
from sklearn.metrics import mean_squared_error # 均方误差回归损失
from sklearn.datasets import make_friedman1 # 生成“Friedman#1”回归问题
from sklearn.ensemble import GradientBoostingRegressor # 梯度提升回归树算法
X, y = make_friedman1(n_samples=1200, random_state=0, noise=1.0)
'''
make_friedman1 参数解释:
n_samples int, optional(默认=100), 样本数
n_features int, optional(默认=10), 特征数
noise float optional(默认=0.0), 应用于输出的高斯噪声的标准偏差
random_state int, RandomState instance, 默认=None, 确定数据集噪声的随机数生成。为多个函数调用传递可重复输出的int值
'''
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')
# n_estimators 执行的提升次数=100
# 学习率 = 0.1
# 回归模型的最大深度 = 1
# 损失函数='ls' 最小二乘回归
est.fit(X_train, y_train)
'''
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。
'''
mean_squared_error(y_test, est.predict(X_test))
'''
mean_squared_error 参数解释:
y_true 真实目标值
y_pred 预测目标值
sample_weight 样本权重
squared 如果为True,则返回MSE值(均方误差);如果为False,则返回RMSE值(均方根误差)
'''
5.009154859960321
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)
'''
make_regression 参数解释:
n_samples int, optional(默认=100), 样本数
n_features int, optional(默认=100), 特征数
n_informative int, optional (默认=10), 信息特征的数量,即用于构建用于生成输出的线性模型的特征的数量
n_targets int, optional (默认=1), 回归targets的数量,即与样本关联的y输出向量的尺寸
bias float, optional (默认=0.0), 基础线性模型中的偏差项
noise float optional(默认=0.0), 应用于输出的高斯噪声的标准偏差
shuffle boolean, optional (default=True), shuffle样本和特征
random_state int, RandomState instance, 默认=None, 确定数据集噪声的随机数生成。为多个函数调用传递可重复输出的int值
'''
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# 因为 train_size = None, test_size = None, 所以将test_size预设为0.25 train_size预设为0.75
reg = GradientBoostingRegressor(random_state=0)
reg.fit(X_train, y_train)
reg.score(X_test, y_test) # 返回预测的决定系数R^2
0.440031029624667
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:默认为2,拆分内部节点所需的最少样本数
min_samples_leaf:默认为1,在叶节点处需要的最小样本数
min_weight_fraction_leaf:默认为0.0,在所有叶节点处(所有输入样本)的权重总和中的最小加权数。如果未提供sample_weight,则样本的权重相等
max_depth:默认为3,各个回归模型的最大深度。最大深度限制了树中节点的数量。调整此参数以获得最佳性能;最佳值取决于输入变量
min_impurity_decrease:如果节点拆分会导致不纯度大于或等于该值,则该节点将被拆分。
min_impurity_split:提前停止树生长的阈值。如果节点的不纯度高于该值,则该节点将拆分
max_features {auto, sqrt, log2},int或float:寻找最佳切分点时要考虑的特征个数:
如果是int,则表示节点切分的特征个数
如果是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
GradientBoostingClassifier参数解释
loss:{deviance,exponential}, default=deviance:
deviance是指对具有概率输出的分类(等同于logistic回归)
对于exponential梯度提升方法,可等同于AdaBoost算法
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:默认为2,拆分内部节点所需的最少样本数
min_samples_leaf:默认为1,在叶节点处需要的最小样本数
min_weight_fraction_leaf:默认为0.0,在所有叶节点处(所有输入样本)的权重总和中的最小加权数。如果未提供sample_weight,则样本的权重相等
max_depth:默认为3,各个回归模型的最大深度。最大深度限制了树中节点的数量。调整此参数以获得最佳性能;最佳值取决于输入变量
min_impurity_decrease:如果节点拆分会导致不纯度大于或等于该值,则该节点将被拆分。
min_impurity_split:提前停止树生长的阈值。如果节点的不纯度高于该值,则该节点将拆分
max_features {auto, sqrt, log2},int或float:寻找最佳切分点时要考虑的特征个数:
如果是int,则表示节点切分的特征个数
如果是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