机器学习算法-boost

本文转自http://blog.crackcell.com/posts/2013/04/30/machine_learning_note_3_boosting.html

1 前言

Boosting的基本思想很简单,就是"三个臭皮匠顶个诸葛亮"。将若干个弱分类器(base learner)组合起来,变成一个强分类器。大多数boosting方法都是通过不断改变训练数据的概率(权值)分布,来迭代训练弱学习器的。所以总结而言,boosting需要回答2个问题:。

  1. 如何改变训练数据的概率(权值)分布
  2. 如何将弱分类器组合起来

下面先用Adaboost入手,聊一下boosting。

2 AdaBoost

输入: 训练样例

T={(x 1 ,y 1 ),(x 2 ,y 2 ),...,(x n ,y n )}
输出: 由M个弱分类器构成的最终分类器G(x)
步骤:

  1. 初始化权值分布
    D 1 =(w 11 ,...,w 1i ,...,w 1n ),w 1i =1n
  2. 对于m=1,2,…,M:
    1. 使用带权值的实例集合Dm训练模型,得到弱分类器:
      G m (x):x>y
    2. 计算Gm(x)在训练集上的误差率
      e m =P(G m (x i y i ))= i=1 n w mi I(G m (x i )y i )
    3. 计算Gm(x)的系数
      a m =12 ln1e m e m
      这个地方用模型的整体误差来衡量弱分类器在最终分类器中的权重。
    4. 更新训练样例的权值分布,为下一轮迭代做准备
      D m+1 =(w m+1,1 ,...,w m+2,i ,...,w m+1,n )
      w m+1,i =w mi Z m exp(a m y i G m (x i ))
      Zm是规范化因子:
      Z m = i=1 n w mi exp(a m y i G m (x i ))
      exp(a m y i G m (x i )) 这个部分,当分类正确时,整体<1;错误时,整体>1。意义是,当样例分类错误,我们加大它的权重,以便在后面的迭代中更受重视。相应的,降低分类正确的样例的权重。
  3. 进行了M轮迭代之后,产出了M个弱分类器,将他们组合起来:
    f(x)= i=1 m a m G m (x)

3 Boosting Tree

提升树被认为是统计学习中性能最好的方法之一,可以用来分类或者回归。对于分类问题,算法类似在AdaBoost中,使用决策树作为弱分类器。但对于回归问题,稍微有点不同。回归和分类最大的区别在于模型产出的数值之间的可比性。比如,对于分类,我们把本来应该是分类1的样本预测成了2或者3,他们2者的错误程度是一样的。但若这是一个回归问题,回归成3显然比2"错"得更多。

3.1 加法模型和前向分步算法

在聊Boosting Tree的回归之前,需要先了解2个概念:加法模型(additive model)和前向分步算法。
加法模型 就是将若干基函数线性组合的模型,函数表示为:

f(x)= m=1 M β m b(x;γ m )

  • b(x;γ m ) 为基函数
  • γ m 为基函数的参数
  • β m 为基函数的系数

直接解加法模型的最优化问题很麻烦,所以使用 前向分步算法 来分步迭代的求解,每次只算一个基函数的参数。
对于提升树,第m次迭代可以表示为:

f m (x)=f m1 (x)+T(x;Θ m )

  • T(x;Θ m ) 为一个树
  • Θ m 为树的参数

每轮的最优化问题可以表示为:

Θ m =argmin i=1 n L(y i ,f m1 (x i )+T(x i ;Θ m ))

3.2 回归问题的提升树算法

接上节,那么对于回归问题,可以用平方误差损失函数:

L(x,f(x))=(yf(x)) 2
代入每轮迭代的优化函数中,损失函数部分为:
L(y,f m1 (x)+T(x;Θ m )) == (yf m1 (x)T(x;Θ m )) 2 (rT(x;Θ m )) 2
这里r就是上轮迭代的残差。所以 对于回归问题,提升树只需简单地拟合当前模型的残差
我们不妨对比一下Boosting Tree的回归和分类。从实现上,分别用不同的方法实现了"动态确定样本权值"这一目标。回归是用拟合残差,分类是用错误率来调整样本权值。
那么,回归问题的算法可以如下描述:

输入: 训练样例
T={(x 1 ,y 1 ),(x 2 ,y 2 ),...,(x n ,y n )}
输出: 提升树f M(x)
步骤:

  1. 初始化f0(x)=0
  2. 对m=1,2,…,M
    1. 计算残差
      r mj =y i f m1 (x i )
    2. 拟合残差得到回归树 T(x;Θ m )
    3. 更新 f m x=f m1 (x)+T(x;Θ m )
  3. 得到回归问题的boosting tree:
    f M (x)= m=1 M T(x;Θ m )

4 Gradient Boosting

上面聊到的算法中存在最优化的操作。如果损失函数是平方损失(对于回归问题)和指数损失(对于分类问题),解最优化很简单。但如果是一般的损失函数,最优化可能很困难。Gradient Boosting就是为了解决这个问题。它将问题转变成在损失函数梯度上寻找下降最快的方向,近似地求解。

输入: 训练样例

T={(x 1 ,y 1 ),(x 2 ,y 2 ),...,(x n ,y n )}
和损失函数:
L(y,f(x))
输出: 回归树 f(x) 步骤:

  1. 初始化:
    f 0 =argmin i=1 n L(y i ,c)
  2. 对于m=1,2,…,M
    1. 对于i=1,2,…,N,计算
      r mi =[L(y i ,f(x i ))f(x i ) ] f(x)=f m1 (x)
      这里用负梯度来表示损失函数的下降。
    2. 用rmi拟合一个回归树,得到第m棵树的叶结点区域Rmj
    3. 对于j=1,2,…,J,计算
      c mj =argmin x i R mj L(y i ,f m1 (x i )+c)
      这一步是利用线性搜索估计叶结点区域的常量输出值。
    4. 更新 f m (x)=f m1 (x)+ J j=1 c mj I(xR mj )
  3. 得到回归树
    f(x)=f M (x)= m=1 m j=1 J c mj I(xR mj )

我们可以和3.2节中的算法比较一下,一目了然,主要差别在于这里每轮拟合模型的是损失函数的负梯度而不是残差。

XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升框架的优化分布式计算的机器学习算法。其核心原理在于通过迭代构建多个弱预测模型(通常是决策树),并不断减少模型偏差和方差,最终将这些弱模型组合成一个强预测模型。XGBoost在传统梯度提升决策树(GBDT)的基础上进行了多项改进,包括正则化项引入、支持自定义损失函数、对缺失值的处理以及利用二阶泰勒展开优化目标函数等[^1]。 ### 基本原理 XGBoost的核心思想是通过加法训练的方式逐步构建模型。在每一步中,新的树模型被训练以拟合当前模型的残差。具体来说,XGBoost的目标函数由两部分组成:一是衡量当前模型与真实值之间的误差(损失函数),二是对模型复杂度的惩罚项(正则化项)。目标函数的形式可以表示为: $$ \text{Obj}(\theta) = \sum_{i=1}^{n} L(y_i, \hat{y}_i) + \sum_{k=1}^{K} \Omega(f_k) $$ 其中,$L$ 是损失函数,$\Omega$ 是正则化项,$f_k$ 表示第 $k$ 棵树的输出。为了优化这个目标函数,XGBoost采用了二阶泰勒展开的方法来近似损失函数,从而使得每次迭代中可以更精确地找到最优解。此外,XGBoost还引入了特征列采样机制,类似于随机森林中的做法,进一步提升了模型的泛化能力[^2]。 ### 算法细节 XGBoost算法流程主要包括以下几个步骤: 1. 初始化模型,通常设置初始预测值为常数。 2. 对于每一次迭代,计算当前模型的残差。 3. 使用残差作为目标变量,训练一个新的决策树。 4. 将新训练得到的树加入到现有模型中,同时调整学习率以控制每棵树的影响。 5. 重复上述步骤直到达到预设的最大迭代次数或者满足提前停止条件。 在构建单棵树的过程中,XGBoost通过贪心算法选择最佳分裂点,即对于每个节点尝试分割后增益最大的特征及阈值。这种增益计算考虑到了一阶导数和二阶导数的信息,有助于找到更加精确的分裂位置。此外,XGBoost还实现了高效的内存管理和缓存优化技术,提高了大规模数据集上的运行效率[^1]。 ### 应用场景 XGBoost因其出色的性能和灵活性,在众多领域得到了广泛应用。例如,在金融行业,XGBoost可用于信用评分卡建模、欺诈检测等任务;在电商领域,它可以用来进行用户购买行为预测、点击率预估等工作;而在生物信息学中,则可能用于基因表达数据分析或蛋白质结构预测等问题。除此之外,XGBoost也是许多Kaggle竞赛获胜方案中的常见选择之一,尤其是在处理表格型数据时表现尤为突出。 ### 示例代码 以下是一个简单的XGBoost分类任务的Python实现示例: ```python import xgboost as xgb from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 转换为DMatrix格式 dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) # 设置参数 params = { 'objective': 'multi:softmax', 'num_class': 3, 'max_depth': 3, 'eta': 0.3, 'eval_metric': 'merror' } # 训练模型 model = xgb.train(params, dtrain, num_boost_round=20) # 预测 y_pred = model.predict(dtest) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy:.2f}") ``` 这段代码演示了如何使用XGBoost库来进行多类分类任务,其中包括了数据准备、模型训练、预测以及评估的基本流程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值