集成学习
———————————————————————————————————————————————————————–
Bagging
RF
- 采样 + 属性选择
- 采用Bootstrap随机选择训练样本,Bootstrap有放回的选择训练样本,单个 样本p次不被采样到的概率是 (1−1m)p ( 1 − 1 m ) p , limp→∞(1−1m)p=1e≈0.368 lim p → ∞ ( 1 − 1 m ) p = 1 e ≈ 0.368
- 随机选择k个属性作为子集用于最优子集划分
- 优点
- 在小数据集上表现良好,两个随机性的引入,使得随机森林不容易陷入过拟合
- 既能处理离散型数据,也能处理连续型数据,数据集无需规范化
- 在创建随机森林的时候,对generlization error使用的是无偏估计。包外估计无偏
- 训练速度快,并行,可以得到变量重要性排序
- 特征重要性
- 每一个树选择对应的包外数据,计算包外数据偏差记为 error1
- 随即对包外样本的特征加入噪音,再次计算包外偏差记为 error2
- N颗树,特征重要性为 ∑(error2−error1)N ∑ ( e r r o r 2 − e r r o r 1 ) N
- 预测结果 根据各颗树的投票的来
———————————————————————————————————————————————————————–
Boosting
GBDT
- GBDT多轮迭代,每轮产生一个弱分类器,每个分类器拟合上一轮的残差
一般而言,GBDT选择CART回归树最为基分类器 - 模型:
Fm(m)−∑m=1MT(x:θm)(1)
(1)
F
m
(
m
)
−
∑
m
=
1
M
T
(
x
:
θ
m
)
训练m轮,每轮产生一个弱分类器
T(x;θm)
T
(
x
;
θ
m
)
,损失函数:
∑i=1NL(yi,F(m−1(xi)+T(xi;θm))(2)
(2)
∑
i
=
1
N
L
(
y
i
,
F
(
m
−
1
(
x
i
)
+
T
(
x
i
;
θ
m
)
)
- 原理:gbdt 极小化经验误差来确定下个分类器的参数,分类器去拟合残差的负梯度(作为残差的近似值),采用加法模型不断减少训练过程中产生的残差
- 具体求导过程以m+1轮的负梯度为例,以交叉熵为例
对于 yi y i ,
∂L(yi,F(m−1(xi)+T(xi;θm))∂T(x;θm)=∂∑ki=1yiklog(Fm−1(xi)+T(xi;θm))∂T(x;θm)=∑i=1kyikFm−1(x)+T(xi;θm)(3) ∂ L ( y i , F ( m − 1 ( x i ) + T ( x i ; θ m ) ) ∂ T ( x ; θ m ) = ∂ ∑ i = 1 k y i k l o g ( F m − 1 ( x i ) + T ( x i ; θ m ) ) ∂ T ( x ; θ m ) (3) = ∑ i = 1 k y i k F m − 1 ( x ) + T ( x i ; θ m ) - 特征选择 CART 树的特征选择过程,默认为CART回归树
- 选择特征
- 选择切分点
- 暴力遍历特征+遍历可能的切分点
- 如何分类
- k类每轮就有k颗树
- 输入为 [0, 0, 0, 0, …1, …]
- 与回归树类似的拟合 方式
XGBOOST
- 损失函数:
∑i=1NL(yi,F(m−1(xi)+T(xi;θm))+∑i=1kcomplex(Tree)(4)
(4)
∑
i
=
1
N
L
(
y
i
,
F
(
m
−
1
(
x
i
)
+
T
(
x
i
;
θ
m
)
)
+
∑
i
=
1
k
c
o
m
p
l
e
x
(
T
r
e
e
)
2. 通过极小化结构误差来得到下一个分类器的参数,加入了L1 norm与 L2 norm, 叶子结点个数与叶子节点里的值:
complex(Tree)=αLeaves+12β∑j=1Tω2j(5)
(5)
c
o
m
p
l
e
x
(
T
r
e
e
)
=
α
L
e
a
v
e
s
+
1
2
β
∑
j
=
1
T
ω
j
2
增益
Gain=G2LHL+β+G2RHR+β−(GL+GR)2HL+HR+β−α G a i n = G L 2 H L + β + G R 2 H R + β − ( G L + G R ) 2 H L + H R + β − α
左孩子得分+右孩子得分-不分裂得分-引入额外叶子损失,用于限制树的生长优点:
- 使用二阶导数进行拟合,而GBDT只使用一阶
- 预数据特征预排序,block存储利于并行计算;
- l1 l2正则减轻过拟合
- 缺点
- 预排序方法(pre-sorted):首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结
- 对cache优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时在每一层树建立的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序不一样
LightGBM
- 只存储离散化后的值,内存消耗小
- 使用直方图算法,将离连续的浮点数离散化为k个整数,同时构造宽度为k的直方图 ,在便利数据的时候,根据离散化的值作为索引累计统计量,在遍历一遍数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历最优分割点
- 降低计算代价,预排序算法每遍历一次特征值就要计算一次分裂增益,而直方图只需要计算k次,时间复杂度从O(data fetures)降低到O(k feature) 牺牲一定精度来提高切分效率
———————————————————————————————————————————————————————–
小结 :
RF
- 是一种Bagging 他的基学习器是分类树或者回归树 最终的结果是多个学习器投票或者是平均。
- 他每棵树的训练是并行的,不依赖于上一轮的结果。
- 它主要关注于降低模型的方差,所有他的基分类器一般是可以是比较深的树 (低偏差的)
- RF在训练每一颗树的时候,对训练集进行了bootstraping 有放回的采样 他不需要划分测试集 36.7的数据用于测试(包外估计),对异常值不敏感。随机选择特征,对当前属性随机选择k个属性作为子集用于最优属性的划分,一般取logk(样本扰动+属性扰动)
GBDT
- GBDT采用的是Boosting的思想,它是一种加法模型,最终的分类结果是所有分类器加权求和的,
- 他的每一颗树的学习依赖于上一课树的残差,利用上一课树的负梯度作为残差的近似值,进而拟合Cart回归树,
- 它的训练过程是串行的。
- GBDT关注的是降低模型的偏差,这是与RF不同的,他选的基分类一般是相对于RF较浅(低方差的树),对异常值敏感。只能使用CART回归树。
XGBOOST
- XGBOOST是一种对GBDT的改进算法,他同样属于Booting方法。
- 与GBDT以期望损失作为优化目标函数不同,XGBOOST考虑优化结构损失,即加入了L1 L2正则 分别来限制叶子结点的个数与叶子结点里的值。
- GBDT在优化时使用了一阶导数,而XGBOOST还用使用了二阶导数。决
- 策树在学习最耗时的步骤是特征的排序,确定最佳分割点,XGBOOST预先对数据进行了排序,保存下来,在后面的迭代中反复使用较小计算。
- XGBOOST对于最佳特征与分割点的选择是并行的,同时同一层叶子结点的分裂也是并行的。XGBOOST能够处理缺失值,自动将它分到左边或右边(损失函数小的)
- 过拟合参数
- eta 学习率
- max_depth 深度
- subsample 采集比例
- colsample_bytree 特征采样比例
- min_child_weight 叶节点样本个数
- lambda l2正则
- alpha l1正则
- gamma 分裂最小损失
LightGBM
- XGBOOST的level-wise将当前所有叶子 结点一视同仁,有些叶子节点分裂收益很小,对结果没有什么影响,但还要分裂,加重了计算代价。其次是,预排序方法的空间消耗较大,不仅要保存特征值 ,还要保存特征值的排序索引
- LightGBM 与XGBOOST使用level-wise的建树方式不同,他采取了Leaf-wise的策略,他的做法是当前叶子结点中选择分裂收益最大的结点进行分类,如此递归进行。
- LightGBM使用了基于histogram的决策树方法, Hitsogram算法将特征分桶离散化,遍历数据一遍确定桶的值。在内存与计算代价都有不小的优势。内存上 直方图算法的内存消耗仅为对特征值分桶后离散化的值,而xgboost是2*特征的存储量*4bytes。
- 计算上,预排序算法在选择好分裂计算分裂收益时,所由样本的特征值,时间为data,而直方图只需要遍历桶就可以了,时间为bin
- 参数
- num_leaves 叶子树
- max_depth 深度
- min_data_in_leaf 树中最小的样本数
- feature_fraction 没课树采样多少特征
- lambda_l1、lambda_l2