XGBoost(eXtreme Gradient Boosting)极致梯度提升,是一种基于GBDT的算法或者说工程实现。
XGBoost的基本思想和GBDT相同,但是做了一些优化,比如二阶导数使损失函数更精准;正则项避免树过拟合;Block存储可以并行计算等。
XGBoost具有高效、灵活和轻便的特点,在数据挖掘、推荐系统等领域得到广泛的应用。
本文先回顾GBDT、泰勒公式、正则、一元二次函数等XGBoost的基础知识;接着介绍XGBoost原理、目标函数求导、目标函数解和学习训练;然后指出XGBoost在特征处理、电商预估上的应用;最后对XGBoost模型进行总结,指出XGBoost模型的优缺点,并与GBDT进行对比,及XGBoost的演化。主要目录结构如下:
一、XGBoost基础
1、GBDT
2、函数的近似计算
3、泰勒公式
4、正则
5、一元二次函数 二、XGBoost原理
1、XGBoost原理
2、XGBoost目标函数推导
3、XGBoost目标函数解
4、XGBoost树训练 三、XGBoost应用
1、XGBoost库
2、XGBoost挖掘特征
3、XGBoost电商预估 四、XGBoost总结
1、XGBoost的优缺点
2、XGBoost VS GBDT
3、XGBoost的演化
直接上PPT。
一、XGBoost基础
1、GBDT
梯度提升决策树(Gradient Boosting Decision Tree,GBDT)是一种基于boosting集成思想的加法模型,训练时采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差。
梯度提升决策树算法(GBDT)如下:
第一步:初始化弱学习器
第二步:迭代训练
更多GBDT可参考:
刘启林:GBDT的原理、推导和应用zhuanlan.zhihu.com2、函数的近似计算
什么是函数的近似计算?
3、泰勒公式
什么是泰勒公式?
4、正则
什么是L1、L2正则?
5、一元二次函数
什么是一元二次函数的最优解?
二、XGBoost原理
1、XGBoost原理
XGBoost(eXtreme Gradient Boosting)极致梯度提升,是基于GBDT的一种算法。
2016年,陈天奇在论文《 XGBoost:A Scalable Tree Boosting System》中正式提出。
这是源头,这是根,强烈推荐、推荐、推荐。
XGBoost:A Scalable Tree Boosting Systemarxiv.orgXGBoost的基本思想和GBDT相同,但XGBoost进行许多优化。
2、XGBoost目标函数推导
XGBoost的目标函数由损失函数和正则化项两部分组成。
用GBDT梯度提升树表达方式XGBoost。
接下来,三个步骤优化XGBoost目标函数。
第一步:二阶泰勒展开,去除常数项,优化损失函数项;
第二步:正则化项展开,去除常数项,优化正则化项;
第三步:合并一次项系数、二次项系数,得到最终目标函数。
关键是二阶泰勒展开。
关键是前向计算,t-1棵数的结构已经确定。
建议这部分参考陈天奇大神的PPT《 Introduction to Boosted Trees》,讲的够细、够细、够细。
Introduction to Boosted Treeshomes.cs.washington.edu先重新定义一棵树。
然后定义树的复杂度。
接着带入目标函数,对结点进行分组。
最后,合并一次项系数、二次项系数。
3、XGBoost目标函数解
构建形如一元二次方程形式,求最优值。
目标值Obj最小,则树结构最好,此时即是目标函数的最优解。
4、XGBoost树训练
在实际训练XGBoost树中,最佳分裂点是一个关键问题。
三、XGBoost应用
1、XGBoost库
XGBoost库是XGBoost算法的一种实现。
XGBoost是一个优化的分布式梯度提升库,被设计为高效、灵活和轻便。
GitHub:https://github.com/tqchen/xgboost
优化XGBoost系统设计如下:
2、XGBoost挖掘特征
XGBoost一个很重要应用就是进行数据特征挖掘分析。本例子是挖掘哪些特征是糖尿病重要特征。
数据集:diabetes.csv
中文:皮马印第安人糖尿病数据集
英文:Pima Indians Diabetes Database
可以从Github上下载:diabetes.csv
diabetes.csvgithub.com代码如下:
import pandas as pd
from sklearn import metrics
from sklearn.model_selection import train_test_split
import xgboost as xgb
import matplotlib.pyplot as plt
# 导入数据集
df = pd.read_csv("./data/diabetes.csv")
data=df.iloc[:,:8]
target=df.iloc[:,-1]
# 切分训练集和测试集
train_x, test_x, train_y, test_y = train_test_split(data,target,test_size=0.2,random_state=7)
# xgboost模型初始化设置
dtrain=xgb.DMatrix(train_x,label=train_y)
dtest=xgb.DMatrix(test_x)
watchlist = [(dtrain,'train')]
# booster:
params={'booster':'gbtree',
'objective': 'binary:logistic',
'eval_metric': 'auc',
'max_depth':5,
'lambda':10,
'subsample':0.75,
'colsample_bytree':0.75,
'min_child_weight':2,
'eta': 0.025,
'seed':0,
'nthread':8,
'gamma':0.15,
'learning_rate' : 0.01}
# 建模与预测:50棵树
bst=xgb.train(params,dtrain,num_boost_round=50,evals=watchlist)
ypred=bst.predict(dtest)
# 设置阈值、评价指标
y_pred = (ypred >= 0.5)*1
print ('Precesion: %.4f' %metrics.precision_score(test_y,y_pred))
print ('Recall: %.4f' % metrics.recall_score(test_y,y_pred))
print ('F1-score: %.4f' %metrics.f1_score(test_y,y_pred))
print ('Accuracy: %.4f' % metrics.accuracy_score(test_y,y_pred))
print ('AUC: %.4f' % metrics.roc_auc_score(test_y,ypred))
ypred = bst.predict(dtest)
print("测试集每个样本的得分n",ypred)
ypred_leaf = bst.predict(dtest, pred_leaf=True)
print("测试集每棵树所属的节点数n",ypred_leaf)
ypred_contribs = bst.predict(dtest, pred_contribs=True)
print("特征的重要性n",ypred_contribs )
xgb.plot_importance(bst,height=0.8,title='影响糖尿病的重要特征', ylabel='特征')
plt.rc('font', family='Arial Unicode MS', size=14)
plt.show()
运行结果:
Precesion: 0.8158
Recall: 0.5439
F1-score: 0.6526
Accuracy: 0.7857
AUC: 0.8699
结果如上所示:
模型的AUC为0.8699,其中,Glucose(血糖)、BMI(体质指数)、DiabetesPedigreeFunction(糖尿病系统)三个指标对模型影响较大。
3、XGBoost电商预估
2019泰达杯跨境电商智能算法大赛
安泰杯 -- 跨境电商智能算法大赛-天池大赛-阿里云天池tianchi.aliyun.com冠军的Github
RainFung/Tianchi-AntaiCup-International-E-commerce-Artificial-Intelligence-Challengegithub.com四、XGBoost总结
1、XGBoost的优缺点
2、XGBoost VS GBDT
抓住:XGBoost是极致GBDT就OK。
3、XGBoost的演化
XGBoost总结:
What:什么是XGBoost?
How:怎么实现XGBoost?
Why:为什么需要XGBoost?
由于能力和水平的限制,我的可能是错的。
参考文献:
1、同济大学数学系,高等数学(第六版)[M],高等教育出版社,2007.04
2、Tianqi Chen,Introduction to Boosted Trees(PPT),2014.10.
3、Tianqi Chen and Carlos Guestrin. XGBoost: A Scalable Tree Boosting System. In 22nd SIGKDD Conference on Knowledge Discovery and Data Mining, 2016