赞
踩
XGBoost(Extreme Gradient Boosting)算法是陈天奇博士于2016年发表的论文《 XGBoost:A Scalable Tree Boosting System》中正式提出的。XGBoost在GBDT算法的基础上作出了一系列的优化,如在损失函数的计算中增加了二阶导数,增加了正则项,一定程度上的并行计算等。
XGBoost算法在机器学习中有着广泛的应用,在机器学习大赛中有着不错的表现。
XGBoost算法支持回归算法与分类算法。本文介绍其中的回归算法。
以表示第轮预测值,表示第棵树在样本处的取值(权重),表示第轮的损失函数,损失函数二阶可导。
将二阶泰勒展开:
记,
针对样本构造目标函数,在第轮时,
在第轮迭代时,已知, 为常数,要使得目标函数最小,仅需要上式中第2、3项的和最小即可。因此,可将目标函数改造成:
在第棵树中,第个叶子节点对应的样本序号的集合,在时,。
利用树的复杂度定义正则项,在第轮迭代时,
,其中表示第棵树叶子节点的个数,表示第棵树第个叶子节点的取值(权重);为设定的参数,且均大于0。
考虑到模型的泛化能力,在目标函数中增加正则项,则
将正则项代入目标函数:
则
记,则
从目标函数的表达式可以看出,在第个叶子节点时的表达式是关于的一元二次函数,在时目标函数取得极值。
此时,
XGBoost树的节点分裂,支持贪心算法和近似算法,这里介绍贪心算法。
假设叶子节点继续分裂分成左右()两个叶子节点。分裂前叶子节点的个数为1,分裂后变为2。在第棵树中,分裂后的分别记为,分裂后的分别记为。
则可计算分裂前后的目标函数增益:
对于所有可能的分裂,计算上述增益,以增益最大的分裂作为本次的节点分裂。
对于分裂后的叶子节点,继续按照上述贪心算法进行分裂,直至无法分裂或满足停止条件(如增益小于指定值、叶子节点的样本数量限制、树的深度达到指定值等),生成本轮决策树。
在上述生成树的叶子节点中,在第个叶子节点的取值
1)输入
训练样本集:
2)输出
最终回归树
设定。
假设初始化的弱学习器,代价函数,
则。
如当损失函数是平方损失函数时,。
模型的初始化会影响迭代效率。
对于轮迭代:
对于第个样本,其负梯度。
对于回归算法,一般选择平方损失函数,即,则
。
利用负梯度构建新的数据集。
计算,计算。
按照前述“树的生成”中的方法,生成本轮决策树。
叶子节点的区域为,其取值。
在不满足停止条件时,继续迭代。
在模型实现过程中,一般会增加一个学习率。
在第轮迭代时:当目标函数小于指定值或满足其它设定的停止条件(如迭代次数、分类器在训练集或测试集上的性能等)时,迭代停止。
- import pandas as pd
- import numpy as np
- from xgboost import XGBRegressor
- from sklearn import datasets
- #选择sklearn中的数据集
- diabetes = datasets.load_diabetes()
- X,y = diabetes.data,diabetes.target
- #选择默认参数训练模型
- xgb = XGBRegressor()
- xgb.fit(X,y)
XGBRegressor(base_score=0.5, booster='gbtree', callbacks=None, colsample_bylevel=1, colsample_bynode=1, colsample_bytree=1, early_stopping_rounds=None, enable_categorical=False, eval_metric=None, gamma=0, gpu_id=-1, grow_policy='depthwise', importance_type=None, interaction_constraints='', learning_rate=0.300000012, max_bin=256, max_cat_to_onehot=4, max_delta_step=0, max_depth=6, max_leaves=0, min_child_weight=1, missing=nan, monotone_constraints='()', n_estimators=100, n_jobs=0, num_parallel_tree=1, objective='reg:squarederror', predictor='auto', random_state=0, reg_alpha=0, ...)
xgb.predict(X[0:10])
array([151.23256 , 75.027435, 141.04771 , 205.8506 , 135.08458 , 97.08945 , 137.44916 , 63.018257, 109.95988 , 309.85986 ], dtype=float32)
1、XGBoost算法将损失函数二阶泰勒展开,这是该算法与GBDT算法的重大差异。这一做法较大的提升了模型的效果。
2、XGBoost算法在模型中增加了正则项,减缓了模型的过拟合风险,提高了模型的泛化能力。
3、XGBoost算法不仅支持贪心算法,还支持近似算法以提升运算效率。
4、XGBoost算法在一定程度上实现了并行处理。在特征层面实现了并行运算。
5、XGBoost算法引入了特征子采样。
6、XGBoost算法支持稀疏值处理、缺失值处理等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。