xgboost知识点总结+代码调参

一、知识点总结

1. xgboost与GBDT的区别:

(1)xgboos相比GBDT的优点

(1)精度更高:GBDT只用到一阶泰勒, 而xgboost对损失函数进行了二阶泰勒展开, 一方面为了增加精度, 另一方面也为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数。
(2)灵活性更强:GBDT以CART作为基分类器,而Xgboost不仅支持CART,还支持线性分类器,另外,Xgboost支持自定义损失函数,只要损失函数有一二阶导数。
(3)正则化:xgboost在目标函数中加入了正则,用于控制模型的复杂度。有助于降低模型方差,防止过拟合。正则项里包含了树的叶子节点个数,叶子节点权重的L2范式。
(4)Shrinkage(缩减):相当于学习速率。这个主要是为了削弱每棵树的影响,让后面有更大的学习空间,学习过程更加的平缓
(5)列抽样:这个就是在建树的时候,不用遍历所有的特征了,可以进行抽样,一方面简化了计算,另一方面也有助于降低过拟合
(6)缺失值处理:这个是xgboost的稀疏感知算法,加快了节点分裂的速度
(7)并行化操作:块结构可以很好的支持并行计算

(2)xgboost相比GBDT的缺点:

  • 时间复杂度高:虽然利用了预排序和近似算法可以降低寻找最优分裂点的计算量,但在节点分裂过程中仍需要遍历整个数据集。
  • 空间复杂度高:预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本梯度统计值的索引,相当于消耗了两倍的内存。

2. 应该在哪个特征的哪个点上进行分裂?

(1)基本思想——最优切分点算法:
如何建立一颗树呢?XGBoost采用二叉树, 用了贪心策略。在开始的时候, 全部样本在一个叶子节点上, 然后叶子节点不断通过二分裂,逐渐生成一棵树。

  • 从深度为 0 的树开始,对每个叶节点枚举所有的可用特征;
  • 针对每个特征,把属于该节点的训练样本根据该特征值进行升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的分裂收益;(这个过程每个特征的收益计算是可以并行计算的)
  • 选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,在该节点上分裂出左右两个新的叶节点,并为每个新节点关联对应的样本集
  • 回到第 1 步,递归执行到满足特定条件为止

(2)优化划分方式——基于分桶的划分策略
近似分割的方式(可以理解为分割点分桶的思路),选出一些**候选的分裂点,然后再遍历这些较少的分裂点来找到最佳分裂点。**作者这里采用了一种对loss的影响权重的等值percentiles(百分比分位数)划分算法(Weight Quantile Sketch)。也就是说,进行候选点选取的时候,考虑的是想让loss在左右子树上分布的均匀一些,而不是样本数量的均匀。

3. 怎样避免过拟合?

(1)正则化

xgboost在GBDT的基础上,在损失函数加入正则化部分,并且每一轮迭代对损失函数做二阶泰勒展开,加快对损失函数的优化速度。
在这里插入图片描述
Tt:叶子节点数,wj:叶子上的节点权重,r,lamba是超参数。当正则化为零时,目标回归到传统的梯度提升树GBDT。正则化控制叶子结点的个数和叶子结点的权重,起到了抑制模型复杂度的作用,从而避免了过拟合。
XGBoost的目标(损失)函数可以表示为:
在这里插入图片描述

(2)Shrinkage

每次走一小步逼近最优值,比每次迈一大步很快逼近结果的方式更容易避免过拟合。因为这个过程不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。
原来的弱学习器迭代:
在这里插入图片描述
由于Shrinkage思想的加入,变成了:
在这里插入图片描述

(3)特征采样和样本采样

XGBoost借鉴RF的思想,对特征和特征进行采样以达到降低过拟合的目的,根据用户反馈,特征采样比起样本采样效果更优(特征采样率:[0.5,0.8])。当然,XGBoost同时支持以上两种降低过拟合的采样方式。

(4)Early Stopping

对于每一次分离后的增益,在sklearn接口当中,如果G a i n GainGain出现负值,则提前停止;但是,被提前终止掉的分裂可能其后续的分裂会带来好处。在XBGoost原生接口当中是采用过后剪枝策略:将树分裂到最大深度,然后再基于上述增益计算剪枝。在具体实现时,还有learning rate等其它参数一起控制,给G a i n GainGain出现负值的后续轮留机会。

4. 缺失值处理

尝试通过枚举所有缺失值在当前节点是进入左子树,还是进入右子树更优,来决定一个处理缺失值默认的方向,这样处理起来更加的灵活和合理。

二、代码调参

(一)重要参数

1、booster

用于指定弱学习器的类型,默认值为 ‘gbtree’,表示使用基于树的模型进行计算。还可以选择为 ‘gblinear’ 表示使用线性模型作为弱学习器。

推荐设置为 ‘gbtree’,本文后面的相关参数设置都以booster设置为’gbtree’为前提。

2、eta / learning_rate

如果你看了我之前发的XGBoost算法的相关知识,不难发现XGBoost为了防止过拟合,引入了"Shrinkage"的思想,即不完全信任每个弱学习器学到的残差值。为此需要给每个弱学习器拟合的残差值都乘上取值范围在(0, 1] 的 eta,设置较小的 eta 就可以多学习几个弱学习器来弥补不足的残差。

在XGBClassifier与XGBRegressor中,对应参数名为 learning_rate。

推荐的候选值为:[0.01, 0.015, 0.025, 0.05, 0.1]

3、gamma

指定叶节点进行分支所需的损失减少的最小值,默认值为0。设置的值越大,模型就越保守。

**推荐的候选值为:[0, 0.05 ~ 0.1, 0.3, 0.5, 0.7, 0.9, 1] **

4、alpha / reg_alpha

L1正则化权重项,增加此值将使模型更加保守。

在XGBClassifier与XGBRegressor中,对应参数名为 reg_alpha 。

推荐的候选值为:[0, 0.01~0.1, 1]

5、lambda / reg_lambda

L2正则化权重项,增加此值将使模型更加保守。

在XGBClassifier与XGBRegressor中,对应参数名为 reg_lambda。

推荐的候选值为:[0

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于XGBoost和LightGBM,我们可以使用Python中的xgboost和lightgbm库来实现。首先需要安装这两个库: ``` pip install xgboost pip install lightgbm ``` 接下来,我们可以根据需要加载数据,进行数据预处理,并将其拆分为训练集和测试集。然后,我们可以使用XGBoost和LightGBM分别进行模型训练和预测。下面是一个简单的示例代码: ``` import pandas as pd import numpy as np import xgboost as xgb import lightgbm as lgb # 加载数据 train_data = pd.read_csv('train.csv') test_data = pd.read_csv('test.csv') # 数据预处理 # ... # 拆分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # XGBoost模型 xgb_model = xgb.XGBRegressor(n_estimators=100, learning_rate=0.1, max_depth=3) xgb_model.fit(X_train, y_train) y_pred_xgb = xgb_model.predict(X_test) # LightGBM模型 lgb_model = lgb.LGBMRegressor(n_estimators=100, learning_rate=0.1, max_depth=3) lgb_model.fit(X_train, y_train) y_pred_lgb = lgb_model.predict(X_test) ``` 接下来,我们来看一下如何使用LSTM模型。同样地,我们需要加载数据,进行数据预处理,并将其转换为LSTM所需的格式。然后,我们可以使用Keras库来构建LSTM模型,并进行模型训练和预测。下面是一个简单的示例代码: ``` import pandas as pd import numpy as np from keras.models import Sequential from keras.layers import LSTM, Dense # 加载数据 train_data = pd.read_csv('train.csv') test_data = pd.read_csv('test.csv') # 数据预处理 # ... # 转换数据格式 X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1)) X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1)) # LSTM模型 model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1))) model.add(LSTM(units=50)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(X_train, y_train, epochs=100, batch_size=32) y_pred_lstm = model.predict(X_test) ``` 需要注意的是,LSTM模型需要将数据转换为3D格式,即(samples, time steps, features)。在上述代码中,我们将数据转换为(samples, time steps, 1),其中1表示每个时间步只有一个特征值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值