0
点赞
收藏
分享

微信扫一扫

天池龙珠训练营机器学习基础知识学习笔记Task(2) ----- XGBoost

code_balance 2022-04-14 阅读 41
算法

本学习笔记为阿里云天池龙珠计划机器学习训练营的学习内容,学习链接为:
https://tianchi.aliyun.com/specials/promotion/aicampml

一、学习知识点概要

  1. XGBoost介绍
  2. XGBoost原理粗略讲解
  3. 基于天气数据集的XGBoost分类实战

二、学习内容

1. XGBoost原理:

XGBoost是基于CART树的集成模型,它的思想是串联多个决策树模型共同进行决策。

那么如何串联呢?XGBoost采用迭代预测误差的方法串联。举个通俗的例子,我们现在需要预测一辆车价值3000元。我们构建决策树1训练后预测为2600元,我们发现有400元的误差,那么决策树2的训练目标为400元,但决策树2的预测结果为350元,还存在50元的误差就交给第三棵树……以此类推,每一颗树用来估计之前所有树的误差,最后所有树预测结果的求和就是最终预测结果!

XGBoost的基模型是CART回归树,它有两个特点:
(1)CART树,是一颗二叉树。
(2)回归树,最后拟合结果是连续值。

XGBoost模型可以表示为以下形式,我们约定 f t ( x ) f_t(x) ft(x)表示前 t t t颗树的和, h t ( x ) h_t(x) ht(x)表示第 t t t颗决策树,模型定义如下:

f t ( x ) = ∑ t = 1 T h t ( x ) f_{t}(x)=\sum_{t=1}^{T} h_{t}(x) ft(x)=t=1Tht(x)

由于模型递归生成,第 t t t步的模型由第 t − 1 t-1 t1步的模型形成,可以写成:

f t ( x ) = f t − 1 ( x ) + h t ( x ) f_{t}(x)=f_{t-1}(x)+h_{t}(x) ft(x)=ft1(x)+ht(x)

每次需要加上的树 h t ( x ) h_t(x) ht(x)是之前树求和的误差:

r t , i = y i − f m − 1 ( x i ) r_{t, i}=y_{i}-f_{m-1}\left(x_{i}\right) rt,i=yifm1(xi)

我们每一步只要拟合一颗输出为 r t , i r_{t,i} rt,i的CART树加到 f t − 1 ( x ) f_{t-1}(x) ft1(x)就可以了。

2. XGBoost的主要优点:
(1) 简单易用。
(2)  高效可扩展。在处理大规模数据集时速度快效果好,对内存等硬件资源要求不高。
(3)   鲁棒性强。
(4)   XGBoost内部实现提升树模型,可以自动处理缺失值。
3. XGBoost的主要缺点:
(1) 相对于深度学习模型无法对时空位置建模,不能很好地捕获图像、语音、文本等高维数据。
(2) 在拥有海量训练数据,并能找到合适的深度学习模型时,深度学习的精度可以遥遥领先XGBoost。
4. XGBoost 重要参数
1.eta[默认0.3]
通过为每一颗树增加权重,提高模型的鲁棒性。
典型值为0.01-0.2。

2.min_child_weight[默认1]
决定最小叶子节点样本权重和。
这个参数可以避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。
但是如果这个值过高,则会导致模型拟合不充分。

3.max_depth[默认6]
这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。
典型值:3-10

4.max_leaf_nodes
树上最大的节点或叶子的数量。
可以替代max_depth的作用。
这个参数的定义会导致忽略max_depth参数。

5.gamma[默认0]
在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关。

6.max_delta_step[默认0]
这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。
但是当各类别的样本十分不平衡时,它对分类问题是很有帮助的。

7.subsample[默认1]
这个参数控制对于每棵树,随机采样的比例。
减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。
典型值:0.5-1

8.colsample_bytree[默认1]
用来控制每棵随机采样的列数的占比(每一列是一个特征)。
典型值:0.5-1

9.colsample_bylevel[默认1]
用来控制树的每一级的每一次分裂,对列数的采样的占比。
subsample参数和colsample_bytree参数可以起到相同的作用,一般用不到。

10.lambda[默认1]
权重的L2正则化项。(和Ridge regression类似)。
这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。

11.alpha[默认1]
权重的L1正则化项。(和Lasso regression类似)。
可以应用在很高维度的情况下,使得算法的速度更快。

12.scale_pos_weight[默认1]
在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。

三、学习问题与解答

1.对数据进行平均值填补

for i in data.describe().columns:
    data[i] = data[i].fillna(data.describe()[i]["mean"])
    #一定不是data.describe()[i].mean(),它是对describe统计出的数据在进行平均

2.箱形图

  • 点表示异常值,选取异常点较少的特征
1.直观明了地识别数据批中的异常值
其实箱线图判断异常值的标准以四分位数和四分位距为基础,四分位数具有⼀定的耐抗性,多达25%的数据可以变得任意远⽽不会很⼤地扰动四分位数,所以异常值不会影响箱形图的数据形状,箱线图识别异常值的结果⽐较客观。由此可见,箱线图在识别异常值⽅⾯有⼀定的优越性。*
2.利⽤箱线图判断数据批的偏态和尾重
对于标准正态分布的样本,只有极少值为异常值。异常值越多说明尾部越重,⾃由度越⼩(即⾃由变动的量的个数);⽽偏态表⽰偏离程度,异常值集中在较⼩值⼀侧,则分布呈左偏态;异常值集中在较⼤值⼀侧,则分布呈右偏态。

3.对离散变量进行编码

#独热编码
pd.get_dummies()

四、学习思考与总结

1. 对数据集的缺失值进行填补(-1,中位数,平均数等方式)
2. 数据集正负样本差距过大,是数据不平衡问题,某些情况下要进行特殊处理
3. 字符数据要转为数据,有独热编码、求和编码、把相同类别特征编码写成同一个值等
4. 调参可以先进行自动调参,然后可以手动优化
举报

相关推荐

0 条评论