决策树和基于决策树的集成方法(DT,RF,GBDT,XGB)复习总结

本文详细介绍了决策树的基本概念及其在分类和回归任务中的应用,并深入探讨了Bagging、随机森林、Boosting等集成学习方法的工作原理。此外,还对比了不同决策树算法的优缺点,并提供了调参建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:http://www.cnblogs.com/arachis/p/DTreeFamily.html

摘要:

  1.算法概述

  2.算法推导

  3.算法特性及优缺点

  4.注意事项

  5.实现和具体例子

内容:

1.算法概述

  1.1 决策树(DT)是一种基本的分类和回归方法。在分类问题中它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布,学习思想包括ID3,C4.5,CART(摘自《统计学习方法》)。

  1.2 Bagging :基于数据随机重抽样的集成方法(Ensemble methods),也称为自举汇聚法(boostrap aggregating),整个数据集是通过在原始数据集中随机选择一个样本进行替换得到的。进而得到S个基预测器( base estimators),选择estimators投票最多的类别作为分类结果,estimators的平均值作为回归结果。(摘自《统计学习方法》和scikit集成方法介绍

  1.3 随机森林(RF):基于boostrap重抽样和随机选取特征,基预测器是决策树的集成方法(Ensemble methods)

  1.4 Boosting :通过改变样本的权重(误分样本权重扩大)学习多个基预测器,并将这些预测器进行线性加权的集成方法 (摘自《统计学习方法》)

  1.5 梯度提升决策树(GBDT):基于boosting方法,提升方向是梯度方向的决策树的集成方法(Ensemble methods)

  1.6 XGBDT:基于GBDT的一种升级版本,对目标函数做了二阶导数,主要改进是使用了正则化和特征分块存储并行处理(参考大杀器xgboost指南

  1.7 回归/分类树树模型函数:

,这里数据集被划分为R1,...,Rm个区域,每一个区域对应一个预测值Cm;其中I()是指示函数,当满足条件时返回1,否则为0

  1.8 决策树常见的损失函数:

    用于分类的损失函数:01损失,LR的对数损失,softmax的mlogloss

    用于回归的损失函数:线性回归的MSE

2.算法推导

  2.1 决策树生成过程就是一个递归的过程,如果满足某种停止条件(样本都是同一类别,迭代次数或者其他预剪枝参数)则返回多数投票的类作为叶结点标识;否则选择最佳划分特征和特征值生成|T|个子节点,对子节点数据进行划分;所以划分属性的计算方式是DT的精髓,以下总结各种划分属性的计算方法(附一个java实现决策树的demo):

  ID3与C4.5中使用的信息增益和信息增益率

  信息熵(Entropy)是表示随机变量不确定性的度量:

    ,其中S是数据集,X是类别集合,p(x)是类别x占数据集的比值。

  信息增益(Information gain)表示数据集以特征A划分,数据集S不确定性下降的程度

    其中H(S)是原数据集S的熵;T是S以特征A划分的子集集合,

    p(t)是T的某一划分子集t占数据集S的比值,H(t)是划分子集t的熵。

   信息增益率(为了克服ID3倾向于特征值多的特征):

    IG_Ratio = IG(A,S) / H(S),这里除以特征S的熵来"归一化"。 

    信息增益/信息增益率越大,样本集合的不确定性越小

   CART中使用的Gini指数:

   基尼(gini)指数是元素被随机选中的一种度量

   数据集D的gini系数:

 

   在数据集D中以特征A划分的gini系数:

   gini指数越小,样本集合的不确定性越小

   

   2.2回归树:CART,R,GBDT以及XGBoost 都可以用作回归树,所以这里梳理下回归树是如何确定划分特征和划分值的:

   ,其中C1,C2是划分区域R1,R2的均值,J,S是划分特征和划分的特征值

   2.3 GBDT算法(来自这个论文

   

    

   附: 

  

     参考自:《统计学习基础 数据挖据、推理与预测》 by Friedman 10.9节

    2.4 XGBoost

    模型函数:  

       

    最终得:

    

    详细的推导会附在文尾

3.算法特性及优缺点

  决策树的优(特性)缺点:

     优点:

    (1)输出结果易于理解,

    (2)对缺失值不敏感,可以处理无关数据,可以处理非线性数据

    (3)对于异常点的容错能力好,健壮性高

    (4)不需要提前归一化

    (5)可以处理多维度输出的分类问题。

   缺点:

    (1)容易过拟合,需要剪枝或者RF避免

    (2)只注重单个特征的局部划分,而不能想LR那样考虑整体的特征

    (3)有些问题决策树很难表达,如:异或问题、奇偶校验或多路复用器问题

  ID3算法比较:

    缺点:

    (1)按照特征切分后,特征不在出现,切分过于迅速;

    (2)只能处理类别类型,决策树不一定是二叉树,导致学习出来的树可能非常宽

    (3)不能回归

    (4)信息增益的结果偏向于数值多的特征   

  CART算法比较:

    优点:离散或者连续特征可以重复使用;可以处理连续性特征;可以回归

 

  RF的特性

    优点:并行处理速度快,泛化能力强,可以很好的避免过拟合;能够得到特征的重要性评分(部分参考这篇总结

       对于不平衡数据集可以平衡误差(参考中文维基百科)

    缺点:偏差会增大(方差减小)

  GBDT的特性

    优点:精度高;可以发现多种有区分性的特征以及特征组合

    缺点:串行处理速度慢

  XGB算法比较:

    使用了二阶导数,对特征分块,从而可以并行加快运算速度

4.注意事项

  4.1 树的剪枝(结合sklearn中的参数进行总结)

     max_depth :DT的最大深度(默认值是3)

     max_features :最大特征数(默认值是None)

     min_samples_split :触发分割的最小样本个数,如果是2,两个叶结点各自1个样本

     min_samples_leaf :叶子节点的最小样本数,如果是2,两个叶结点至少2个样本 

     min_impurity_split :最小分割纯度(与分割标准有关,越大越不容易过拟合) 

    (附:树模型调参

  4.2 如何计算的属性评分(结合sklearn总结)

      The importance of a feature is computed as the (normalized) total reduction of the criterion brought by that feature. It is also known as the Gini importance [R245].

  4.3 正则化

    衰减(Shrinkage)因子(learning_rate):

    proposed a simple regularization strategy that scales the contribution of each weak learner by a factor :

    The parameter  is also called the learning rate because it scales the step length the gradient descent procedure; it can be set via     the learning_rate parameter.  ——摘自scikit官网

     

    eta [default=0.3] 

    • 为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3
    • 取值范围为:[0,1]
    • 通常最后设置eta为0.01~0.2   ——摘自XGBOOST调优

 

    正则项系数:

    • lambda [default=0] 
      • L2 正则的惩罚系数
      • 用于处理XGBoost的正则化部分。通常不使用,但可以用来降低过拟合
    • alpha [default=0] 
      • L1 正则的惩罚系数
      • 当数据维度极高时可以使用,使得算法运行更快。
    • lambda_bias 
      • 在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)   ——摘自XGBOOST调优

  4.4 其他参数:

   class_weight:为了克服类别不均衡问题,引入代价敏感方法,class_weight是各类别的权重   ——摘自scikit官网:

  • gamma [default=0] 
    • minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be.
    • range: [0,∞]
    • 模型在默认情况下,对于一个节点的划分只有在其loss function 得到结果大于0的情况下才进行,而gamma 给定了所需的最低loss function的值
    • gamma值使得算法更conservation,且其值依赖于loss function ,在模型中应该进行调参。 ——摘自XGBOOST调优

   注:以上只是列出个人觉得比较重要的超参,具体的调参还请参见这两篇博文:RF和GBDT参数详解:《使用sklearn进行集成学习——实践》;XGBoost参数调优:XGBoost-Python完全调参指南-参数解释篇

    

5.实现和具体例子

  微额借款人品预测竞赛

  风控违约预测竞赛

  CTR预测(GBDT+LR)

  Spark ml GradientBoostedTrees 核心实现部分

  预测多变量的例子——(kaggle)预测沃尔玛超市38个购物区购物量

附:XGB推导目标函数推导:


<think>首先,用户的问题是:“我想查找梯度提升决策树GBDT)算法的实现方式请问GBDTalgorithmimplementation”。这需要我根据提供的引用内容来回答。回顾引用内容:-引用[1]:讨论了GBDT的概念,提到了XGBoost是高性能的GBDT库,并提到了优点(但没有具体列出)。-引用[2]:提到XGBoost设计了高速缓存压缩感知算法,用于效率提升,包括缓存感知预取算法选择合适块大小的近似算法。-引用[3]:详细描述了划分点查找算法,包括exactgreedyalgorithm、approximatealgorithmWeightedQuantileSketch算法。-引用[4]:提到XGB-4:学习排序,一些实现细节差异,但与GBDT直接相关度不高。用户指定要查找GBDT算法的实现方式,所以我需要专注于如何实现GBDT的代码层面。参考引用内容,XGBoost是实现GBDT的一个流行库。关键实现方面:-引用[3]提到了划分点查找算法,这是决策树构建的核心部分。-引用[2]讨论了效率优化,如缓存感知算法。-引用[1]提到scikit-learn也提供GBDT实现。所以,我应该解释GBDT的基本实现原理,并给出代码示例,如果有的话。系统级指令:-行内数学表达式使用$...$,如变量、方程。-独立公式使用$$...$$并单独成段。-使用中文回答。-生成相关问题。-引用段落末尾添加引用标识。回答结构:-清晰、逐步解释问题。-提供真实可靠的信息,基于引用内容。大纲GBDT实现方式:1.**简介**:GBDT集成学习方法,通过迭代地添加决策树来最小化损失函数。2.**核心步骤**:-初始化:用常量值预测。-迭代:-计算残差(损失函数的负梯度)。-用决策树拟合残差。-更新模型。3.**关键组件**:-损失函数:如回归用均方误差,分类用对数损失。-决策树构建:划分点查找算法(如exactgreedyalgorithm)。-优化:如梯度提升。4.**实现库**:-XGBoost:高效实现,支持算法如exactapproximate。-scikit-learn:梯度提升分类器(GradientBoostingClassifier)回归器。5.**代码示例**:给出一个简单实现或库的使用代码。数学表达式:-例如,残差计算:$r_i=-\left[\frac{\partialL(y_i,F(\mathbf{x}_i))}{\partialF(\mathbf{x}_i)}\right]$对于第i个样本。-损失函数:对于回归,$L=\frac{1}{2}(y_i-F(\mathbf{x}_i))^2$,所以负梯度$r_i=y_i-F(\mathbf{x}_i)$。基于引用:-引用[3]详细描述了划分点查找算法,所以在解释决策树构建时引用它。-引用[2]讨论了效率优化,引用[1]提到XGBoost。可能的代码:提供一个用scikit-learn或XGBoost的代码示例,因为它是最直接的实现方式。生成相关问题:在回答后添加相关问题列表。确保回答可靠:从可靠来源总结。最终回答结构:-引言解释GBDT实现。-逐步说明步骤。-代码示例。-相关问题。</think> ### 梯度提升决策树GBDT)算法的实现方式 梯度提升决策树GBDT)是一种基于Boosting的集成学习方法,它通过迭代地添加弱学习器(决策树)来最小化损失函数。GBDT的核心思想是每轮迭代都拟合前一模型预测的残差(负梯度),最终组合成一个强模型。以下我将基于您提供的引用内容(尤其是引用[1]-[3]),逐步解释GBDT的实现方式,包括关键算法原理实际代码实现。 #### 1. GBDT算法的核心实现步骤 GBDT的实现主要分为初始化、迭代训练预测三阶段。每轮迭代都构建一个决策树来拟合残差,通过梯度提升机制逐步降低损失。损失函数通常为回归任务使用均方误差(MSE),分类任务使用对数损失。 - **初始化模型**:用一个常量初始化预测值。对于回归问题,常量为训练样本的平均值: $$ F_0(\mathbf{x}) = \arg\min_\gamma \sum_{i=1}^n L(y_i, \gamma) $$ 例如,若损失函数 $L$ 为MSE,则 $\gamma$ 是样本均值 $\bar{y}$,即 $F_0(\mathbf{x}) = \bar{y}$。 - **迭代训练(伪代码描述)**: 1. 对于每个迭代 $m = 1$ 到 $M$($M$ 为树的数量): - 计算残差:$r_{i,m} = -\left[ \frac{\partial L(y_i, F_{m-1}(\mathbf{x}_i))}{\partial F_{m-1}(\mathbf{x}_i)} \right]$,其中 $F_{m-1}$ 是上一轮模型。例如,在MSE损失下,残差为 $r_i = y_i - F_{m-1}(\mathbf{x}_i)$。 - 使用决策树拟合残差:构建一颗回归树 $h_m(\mathbf{x})$,目标是最小化 $\sum_{i=1}^n (r_{i,m} - h_m(\mathbf{x}_i))^2$。 - 更新模型:$F_m(\mathbf{x}) = F_{m-1}(\mathbf{x}) + \nu \cdot h_m(\mathbf{x})$,其中 $\nu$ 是学习率(步长),用于控制树的贡献,防止过拟合。 关键点:决策树的构建是性能瓶颈,涉及特征分裂点的选择算法(如 exact greedy algorithm 或 approximate algorithm)[^3]。 - **预测阶段**:对新样本 $\mathbf{x}_*$,预测值为所有树预测的加权: $$ F(\mathbf{x}_*) = F_0 + \sum_{m=1}^M \nu \cdot h_m(\mathbf{x}_*) $$ #### 2. 决策树构建的关键算法(划分点查找算法) GBDT依赖决策树作为弱学习器,其构建核心是选择最佳分裂点(splitting point),最大化信息增益或减少损失。引用[3]详细描述了三种高效算法,用于处理大数据或分布式场景: - **Exact greedy algorithm(精确贪心算法)**:穷举所有可能的特征分裂点,计算增益并选择最优者。算法高效但数据无法载入内存时慢。增益公式为: $$ \text{Gain} = \frac{1}{2} \left[ \frac{(\sum_{i \in I_L} g_i)^2}{\sum_{i \in I_L} h_i + \lambda} + \frac{(\sum_{i \in I_R} g_i)^2}{\sum_{i \in I_R} h_i + \lambda} - \frac{(\sum_{i \in I} g_i)^2}{\sum_{i \in I} h_i + \lambda} \right] - \gamma $$ 其中 $g_i$ $h_i$ 分别是损失函数的一阶二阶导数(梯度),$\lambda$ $\gamma$ 是正则化参数[^3]。适用于数据能一次载入内存的场景。 - **Approximate algorithm(近似算法)**:引入候选分割点概念,通过直方图统计特征值分布,仅评估候选点而非全枚举。这大幅减少了计算量,适合大数据的单机或分布式环境。引用[2]提到XGBoost实现中采用此法,并优化了块大小(block size)以提高缓存命中率[^2]。 - **Weighted Quantile Sketch(分布式加权直方图算法)**:在分布式环境下,特征值加权分位数的算法,解决数据无法完全载入内存的问题。引用[3]强调这是对近似算法的扩展[^3]。 效率优化:引用[2]讨论了XGBoost的缓存感知预取算法(cache-aware prefetching),它通过优化数据访问模式减少处理器高速缓存丢失,加速分裂点计算[^2]。 #### 3. 实际实现库及代码示例 GBDT的代码实现通常基于流行库,如XGBoost(高性能实现)或scikit-learn(简单易用)。以下是引用推荐的库简单代码。 - **推荐库**: - **XGBoost**:引用[1]指出这是高性能GBDT库,支持所有上述算法,特别适合大规模数据。它提供了分类、回归排序任务(如引用[4]提到)的实现[^1][^4]。 - **scikit-learn**:引用[1]提到它也提供GBDT实现,但XGBoost在效率扩展性上更优[^1]。 - **代码示例**(使用XGBoost库实现回归任务): ```python import xgboost as xgb from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 生成模拟数据 X, y = make_regression(n_samples=100, n_features=4, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 初始化GBDT模型(使用近似算法) params = { 'objective': 'reg:squarederror', # 损失函数:均方误差 'tree_method': 'approx', # 使用近似算法 'learning_rate': 0.1, # 学习率(步长) 'max_depth': 3, # 树的最大深度 'n_estimators': 100 # 树的迭代轮数 } model = xgb.XGBRegressor(**params) # 训练模型 model.fit(X_train, y_train) # 预测并评估 y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) print(f"测试集MSE: {mse}") ``` 解释:这段代码用XGBoost实现一个简单的回归模型。`tree_method='approx'` 指定了近似算法(如引用[3]描述),可以改为 `'exact'` 使用精确贪心算法。引用[2]提到的缓存优化块大小选择在内部自动处理[^2][^3]。 #### 4. 性能优化注意事项 实现时考虑以下点以确保效率: - **学习率 $\nu$**:值小(如 0.01-0.1)防止过拟合,但增加树数 $M$ 补偿。 - **正则化**:在损失函数中加入正则项(如XGBoost中的 $\lambda$ $\gamma$)避免过拟合,如引用[3]算法增益公式所示。 - **算法选择**:单机小数据用 exact greedy algorithm;大数据或低内存用 approximate algorithm 或加权直方图算法[^3]。 如果您有特定数据场景(如分布式系统),我可以提供更针对性建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值