集成
- 通过构建并结合多个学习器来完成学习任务
- 个体学习器要有一定的准确性,多样性
- 简单投票法,超过半数分类正确,集成分类就正确
- Hoeffding不等式可知,随着分类器数目T的增大,集成的错误率将指数级下降
- 目的降低偏差
boosting
– 要求基学习器能够对特定的数据分布进行学习,通过“重赋权法实施”,对于无法接受带权样本的基学习算法,通过重采样法来处理,每一轮学习中,根据样本分布对训练集重新进行采样。
– 是一族将弱学习器提升为强学习期的算法。串行生成的序列化方法。
先训练处一个基学习器,根据基学习器的表现对训练样本分布进行调整,使得先前基学习期做错的训练样本在后续受到更多关注。(如何进行更多关注?将测试样本放到训练样本中?)
最终得到T个样本进行加权融合(如何?按效果分?)
Adaboost boosting()Forward Stagewise Additive Modeling
1 初始化样本权值分布
while(T--)
2 基于分布Dt从数据集D中训练出分类器ht
3 求出t的误差
4 确定分类器的权重
5 更新样本分布
(在某个学习器精度不满足基本条件,概率低于随机时跳出)
from sklearn.ensemble import AdaBoostClassifier
(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm=’SAMME.R’, random_state=None)
-
base_estimator
- None,default, DecisionTreeClassifier(max_depth=1)
- object
-
n_estimators
- 50,default
- int
-
learning rate
- 1, default
- float
-
loss – in Regressor
loss function ,在每次boosting后更新参数用到的- linear, default
- ‘square’,‘exponential’
GBDT ()Gradient Boosting Modeling
梯度提升决策树
每一课树学的是之前所有树结论和的残差
损失函数
L
(
y
,
F
n
(
x
)
)
=
L
(
y
,
F
n
−
1
+
T
n
(
x
)
)
,
F
n
(
x
)
=
F
n
−
1
+
T
n
(
x
)
L(y,F_n(x)) =L(y,F_{n-1}+T_n(x)) ,F_n(x)=F_{n-1}+T_n(x)
L(y,Fn(x))=L(y,Fn−1+Tn(x)),Fn(x)=Fn−1+Tn(x)
from sklearn.ensemble import GradientBoostClassifer()
(loss=’deviance’, learning_rate=0.1,
n_estimators=100, subsample=1.0, criterion=’friedman_mse’,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_depth=3,
min_impurity_decrease=0.0,
min_impurity_split=None,
init=None, random_state=None,
max_features=None, verbose=0, max_leaf_nodes=None,
warm_start=False, presort=’auto’, validation_fraction=0.1,
n_iter_no_change=None, tol=0.0001)
from sklearn.ensemble import GradientBoostRegressor()
(loos='ls',alpha=0.9)
- loss
- ‘deviance’,default
- ‘exponential’, recovers the AdaBoost algorithm
- loss in Regressor
- ‘ls’,default,最小二乘回归
- ‘lad’, 最小绝对偏差, 鲁棒的函数
- ‘huber’,is the combination of the two above
- ‘quantile’ , 分位数回归 ,use alpha to specify the quantile.
- alpha in Regressor
- 0.9,default , alpha 分位数 in huber loss and quantile loss
- float
- n_estimators
对过拟合有好的鲁棒性,一般来说更多的学习器带来更好的结果- 100,default
- int
- subsample
训练个体学习器的样本比例- 如果小于1, 就是Stochastic GradientBoosting
- 带来小的方差和高的偏差
- criterion
划分节点的原则- ‘friedman_mse’ ,default,usually best
- ‘mse’
- ‘mae’
- init
计算初始预测的学习器。- None,default
- estimator
- ‘zero’ ,初始为0;
- validation_fraction
set for 提前停止, 训练集中设为验证集的比例。- 0.1,default , no_iter_no_change 为整数时这个参数才有效。
- float 0-1
- n_iter_no_change
当验证集得分没有提高时,是否提前停止。- None, default,不提前停止。
- int , 留出,如果前int次迭代没有提高则提前结束。
- tol
-1e-4, 提前停止的容忍度。- loat
- 残差的意义如公式:残差 = 真实值 - 预测值 。提升树即是整个迭代过程生成的回归树的累加。GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
- gbdt通过多轮迭代,每轮迭代产生一个弱分类器(默认CART TREE回归树),每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度,(此处是可以证明的)。
- 利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值去拟合一个回归树。gbdt 每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。
- 可以通过GBDT去产生特征的组合,和原来的特征一起输入到逻辑回归中去训练。
AdaBoost and GBDT
- Boosting族算法的著名代表是AdaBoost,AdaBoost算法通过给已有模型预测错误的样本更高的权重,使得先前的学习器做错的训练样本在后续受到更多的关注的方式来弥补已有模型的不足。与AdaBoost算法不同,梯度提升方法在迭代的每一步构建一个能够沿着梯度最陡的方向降低损失(steepest-descent)的学习器来弥补已有模型的不足。经
FSAM 和 GBM 得到的模型虽然从形式上是一样的,都是若干弱模型相加,但是他们求 解弱分类器的思路和方法有很大的差别
只有当选择平方差函数为损失函数时,这两种方法 等同。
以上比较了 GBM 和 FSAM,可以看到 GBM 在损失函数的选择上有更大的灵活性,但这不足以解释GBDT的全部优势。GBDT是拿Decision Tree作为GBM里的弱分类器,GBDT的优势 首先得益于 Decision Tree 本身的一些良好特性,具体可以列举如下:
为何GBDT受人青睐
-
Decision Tree 可以很好的处理 missing feature,这是他的天然特性,因为决策树的每个节点只依赖一个 feature,如果某个 feature 不存在,这颗树依然可以拿来做决策,只是少一些路径。像逻辑回归,SVM 就没这个好处。
-
Decision Tree 可以很好的处理各种类型的 feature,也是天然特性,很好理解,同样逻辑回归和 SVM 没这样的天然特性。
-
对特征空间的 outlier 有鲁棒性,因为每个节点都是 x < ? 的形式,至于大多少,小多少没有区别,outlier 不会有什么大的影响,同样逻辑回归和 SVM 没有这样的天然特性。
-
如果有不相关的 feature,没什么干扰,如果数据中有不相关的 feature,顶多这个 feature 不出现在树的节点里。逻辑回归和 SVM 没有这样的天然特性(但是有相应的补救措施,比如逻辑回归里的 L1 正则化)。
-
数据规模影响不大,因为我们对弱分类器的要求不高,作为弱分类器的决策树的深 度一般设的比较小,即使是大数据量,也可以方便处理。像 SVM 这种数据规模大的时候训练会比较麻烦。
-
当然 Decision Tree 也不是毫无缺陷,通常在给定的不带噪音的问题上,他能达到的最佳分类效果还是不如 SVM,逻辑回归之类的。但是,我们实际面对的问题中,往往有很大的噪音,使得 Decision Tree 这个弱势就不那么明显了。而且,GBDT 通过不断的叠加组合多个小的 Decision Tree,他在不带噪音的问题上也能达到很好的分类效果。换句话说,通过GBDT训练组合多个小的 Decision Tree 往往要比一次性训练一个很大的 Decision Tree 的效果好很多。因此不能把 GBDT 理解为一颗大的决策树,几颗小树经过叠加后就不再是颗大树了,它比一颗大树更强。
-
计算复杂度高
XGBoost
L
=
∑
i
l
(
y
i
^
,
y
i
)
+
∑
k
Ω
(
f
k
)
L=\sum_{i}{l(\hat{y_i},y_i)}+\sum_{k}{\Omega(f_k)}
L=i∑l(yi^,yi)+k∑Ω(fk)
Where
Ω
(
f
)
=
γ
T
+
1
2
λ
∣
∣
w
∣
∣
2
\Omega(f)=\gamma T+\frac12\lambda | |w||^2
Ω(f)=γT+21λ∣∣w∣∣2
加入了正则化项,减少过拟合,控制叶子节点和叶子节点分数
当生成t棵树后,预测分数可写成
y
^
i
t
=
y
^
i
t
−
1
+
f
t
(
x
i
)
\hat{y}_i^t=\hat{y}_i^{t-1}+f_t(x_i)
y^it=y^it−1+ft(xi)
目标函数改写成
L
(
t
)
=
∑
i
=
1
n
[
l
(
y
i
,
y
^
i
t
−
1
+
f
t
(
x
i
)
]
+
Ω
(
f
t
)
)
L(t)=\sum_{i=1}^n[l(y_i,\hat{y}_i^{t-1}+f_t(x_i)]+\Omega(f_t))
L(t)=i=1∑n[l(yi,y^it−1+ft(xi)]+Ω(ft))
- Shrinkage
在每次迭代中对树的每个叶子结点的分数乘上一个缩减权重。 - Column Subsampling
1-按层随机采样,每层随机选择一部分特征2 - 全部随机选择特征。。前者要好些 - 当样本的第i个特征值缺失时,无法利用该特征进行划分时,XGBoost的想法是将该样本分别划分到左结点和右结点,然后计算其增益,哪个大就划分到哪边。
优点
- XGBoost生成CART树考虑了树的复杂度,GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。
- XGBoost是拟合上一轮损失函数的二阶导展开,GDBT是拟合上一轮损失函数的一阶导展开,因此,XGBoost的准确性更高,且满足相同的训练效果,需要的迭代次数更少。
- XGBoost与GDBT都是逐次迭代来提高模型性能,但是XGBoost在选取最佳切分点时可以开启多线程进行,大大提高了运行速度。
- 有很多策略去防止过拟合。
- 交叉验证,early stop ,加快训练速度,比GBDT块很多
常用基分类器决策树
- 较为方便的将样本权重整合到训练过程中,而不需要使用过采样的方法调整样本权重。
- 树的表达能力和泛化能力,通过调整树的层数做折中。
- 数据样本扰动对决策树影响大,不同子样本集合生成决策树随机性大,这样的“不稳定学习器”更适合作为基分类器。在决策树节点分裂的时候,随机的选择一个特征子集,(Random),从中找出最优分裂属性。
- 除此之外,神经网络模型也适合作为基分类器,不稳定,通过调整神经元数量,连接方式,网络层数,初始权值等引入随机性。
参考资料:
http://blog.itpub.net/31542119/viewspace-2199549/