Datawhale AI 夏令营机器学习赛道 Task 2 笔记

64 阅读4分钟

梯度提升决策树

梯度提升

梯度提升是一种迭代的机器学习算法,其核心思想是利用前一个模型的残差(即真实值与预测值之差)作为当前模型的学习目标,通过不断添加弱学习器(通常是决策树),逐步降低训练数据的损失函数值,直至达到预设的停止条件。

梯度提升涉及两种类型的模型:

  • 一个“弱”机器学习模型,通常是决策树。
  • 一个“强”机器学习模型,由多个弱模型组成。

决策树

决策树是一种由一系列“问题”组成的模型,这些“问题”以树的形状分层整理。这些问题通常称为“条件”、“分屏”或“测试”。在此类中,我们会使用“条件”一词。每个非叶节点都包含一个条件,而每个叶节点都包含一个预测结果。

决策树是GBDT中最常用的弱学习器。它通过一系列if-then规则对数据进行分割,每个内部节点表示一个特征上的测试,每个分支代表一个测试结果,而叶节点则存储一个预测值。

算法流程

  1. 初始化:首先,GBDT会用一个简单的模型(如常数模型)对所有样本做出初始预测。
  2. 迭代过程:
    • 计算残差:基于当前模型的预测结果,计算每个样本的真实标签与预测值之间的梯度(对于回归问题通常是真实值减去预测值;对于分类问题,则使用损失函数的负梯度)。
    • 拟合决策树:将这些残差作为新的目标变量,训练一个决策树来拟合这些残差。决策树的深度和节点数决定了模型的复杂度。
    • 更新预测:将新训练的决策树加入到模型中,更新每个样本的预测值为原预测值加上新决策树的输出。
    • 重复上述过程,直到达到预设的迭代次数或满足停止条件。

LightGBM

为了提高 GBT 的效率,LightGBM 应运而生。LightGBM 使用的是直方图算法(histogram algorithm),占用的内存更低,数据分割的复杂度更低。直方图算法思想是:

  • 将连续的浮点特征离散成 kk 个离散值,并构造宽度为 kkHistogramHistogram
  • 遍历训练数据,统计每个离散值在直方图中的累计统计量。
  • 在进行特征选择时,只需要根据直方图的离散值,遍历寻找最优的分割点。

特征工程

我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:

  • 特征是否发散:如果一个特征不发散,例如方差接近于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_roundsverbose_eval已被弃用,改为通过callbacks参数传入early_stoppinglog_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)