梯度提升决策树
梯度提升
梯度提升是一种迭代的机器学习算法,其核心思想是利用前一个模型的残差(即真实值与预测值之差)作为当前模型的学习目标,通过不断添加弱学习器(通常是决策树),逐步降低训练数据的损失函数值,直至达到预设的停止条件。
梯度提升涉及两种类型的模型:
- 一个“弱”机器学习模型,通常是决策树。
- 一个“强”机器学习模型,由多个弱模型组成。
决策树
决策树是一种由一系列“问题”组成的模型,这些“问题”以树的形状分层整理。这些问题通常称为“条件”、“分屏”或“测试”。在此类中,我们会使用“条件”一词。每个非叶节点都包含一个条件,而每个叶节点都包含一个预测结果。
决策树是GBDT中最常用的弱学习器。它通过一系列if-then规则对数据进行分割,每个内部节点表示一个特征上的测试,每个分支代表一个测试结果,而叶节点则存储一个预测值。
算法流程
- 初始化:首先,GBDT会用一个简单的模型(如常数模型)对所有样本做出初始预测。
- 迭代过程:
- 计算残差:基于当前模型的预测结果,计算每个样本的真实标签与预测值之间的梯度(对于回归问题通常是真实值减去预测值;对于分类问题,则使用损失函数的负梯度)。
- 拟合决策树:将这些残差作为新的目标变量,训练一个决策树来拟合这些残差。决策树的深度和节点数决定了模型的复杂度。
- 更新预测:将新训练的决策树加入到模型中,更新每个样本的预测值为原预测值加上新决策树的输出。
- 重复上述过程,直到达到预设的迭代次数或满足停止条件。
LightGBM
为了提高 GBT 的效率,LightGBM 应运而生。LightGBM 使用的是直方图算法(histogram algorithm),占用的内存更低,数据分割的复杂度更低。直方图算法思想是:
- 将连续的浮点特征离散成 个离散值,并构造宽度为 的 。
- 遍历训练数据,统计每个离散值在直方图中的累计统计量。
- 在进行特征选择时,只需要根据直方图的离散值,遍历寻找最优的分割点。
特征工程
我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:
- 特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
- 特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优先选择。除方差法外,本文介绍的其他方法均从相关性考虑。
Task 2 构建的是历史平移特征和窗口统计特征
通过特征工程挖掘特征可以很快的提升模型预测效果,这也是数据挖掘比赛中的主要优化方向,很多情况下会决定最终的成绩。
遇到的一些小问题
# 训练模型
model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)
提供的 Baseline 代码,由于 lightgbm 版本问题会报错
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[8], line 69
65 print(score)
67 return val_pred, test_pred
---> 69 lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)
71 # 保存结果文件到本地
72 test['target'] = lgb_test
Cell In[8], line 58, in time_model(lgb, train_df, test_df, cols)
42 lgb_params = {
43 'boosting_type': 'gbdt',
44 'objective': 'regression',
(...)
55 'verbose' : -1,
56 }
57 # 训练模型
---> 58 model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix],
59 categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)
60 # 验证集和测试集结果预测
61 val_pred = model.predict(val_x, num_iteration=model.best_iteration)
TypeError: train() got an unexpected keyword argument 'verbose_eval'
由于LightGBM库在更新之后将老版本的函数进行了改动,导致需要传入的参数或传入参数的方式发生了改变。
参数early_stopping_rounds和verbose_eval已被弃用,改为通过callbacks参数传入early_stopping和log_evaluation。
from lightgbm import log_evaluation, early_stopping
...
callbacks = [log_evaluation(period=500), early_stopping(stopping_rounds=500)]
...
# 训练模型
model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], categorical_feature=[], callbacks=callbacks)