PythonXGBoost算法代码实现和筛选特征应⽤
XGBoost算法在机器学习中是⼀个⽐较重要的算法模块,过去我们经常处理连续特征⽤GBDT,⽽现在更多的是⽤XGBoost,特别是在数据预处理和特征⼯程上,XGBoost有很多明显的优势。
⼀、算法原理
之前⼀直有听说GBM,GBDT(Gradient Boost Decision Tree)渐进梯度决策树GBRT(Gradient Boost RegressionTree)渐进梯度回归树是GBDT的⼀种,因为GBDT核⼼是累加所有树的结果作为最终结果,⽽分类树的结果是没法累加的,所以GBDT中的树都是回归树,不是分类树。
XGBoost(eXtreme Gradient Boosting)是⼯业界逐渐风靡的基于GradientBoosting算法的⼀个优化的版本,可以给预测模型带来能⼒的提升。
回归树的分裂结点对于平⽅损失函数,拟合的就是残差;对于⼀般损失函数(梯度下降),拟合的就是残差的近似值,分裂结点划分时枚举所有特征的值,选取划分点。最后预测的结果是每棵树的预测结果相加。
XGBoost算法的步骤和GB基本相同,都是⾸先初始化为⼀个常数,gb是根据⼀阶导数ri,xgboost是根据⼀阶导数gi和⼆阶导数hi,迭代⽣成基学习器,相加更新学习器。
⼆、相⽐较GBDT优势
1.传统GBDT以CART作为基分类器,xgboost还⽀持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。—可以通过booster [default=gbtree]设置参数:gbtree: tree-bad models/gblinear: linear models
2.传统GBDT在优化时只⽤到⼀阶导数信息,xgboost则对代价函数进⾏了⼆阶泰勒展开,同时⽤到了⼀阶和⼆阶导数。顺便提⼀
下,xgboost⼯具⽀持⾃定义代价函数,只要函数可⼀阶和⼆阶求导。—对损失函数做了改进(泰勒展开,⼀阶信息g和⼆阶信息h,上⼀章节有做介绍)
—正则化包括了两个部分,都是为了防⽌过拟合,剪枝是都有的,叶⼦结点输出L2平滑是新增的。
4.shrinkage and column subsampling —还是为了防⽌过拟合,论⽂2.3节有介绍,这⾥答主已概括的⾮常到位
(1)shrinkage缩减类似于学习速率,在每⼀步tree boosting之后增加了⼀个参数n(权重),通过这种⽅式来减⼩每棵树的影响⼒,给后⾯的树提供空间去优化模型。
(2)column subsampling列(特征)抽样,说是从随机森林那边学习来的,防⽌过拟合的效果⽐传统的⾏抽样还好(⾏抽样功能也有),并且有利于后⾯提到的并⾏化处理算法。
5.split finding algorithms(划分点查找算法):—理解的还不够透彻,需要进⼀步学习
(1)exact greedy algorithm— 贪⼼算法获取最优切分点
(2)approximate algorithm— 近似算法,提出了候选分割点概念,先通过直⽅图算法获得候选分割点的分布情况,然后根据候选分割点将连续的特征信息映射到不同的buckets中,并统计汇总信息。详细见论⽂3.3节
(3)Weighted Quantile Sketch— 分布式加权直⽅图算法,论⽂3.4节这⾥的算法(2)、(3)是为了解决数据⽆法⼀次载⼊内存或者在分布式情况下算法(1)效率低的问题,以下引⽤的还是wepon⼤神的总结:
可并⾏的近似直⽅图算法。树节点在进⾏分裂时,我们需要计算每个特征的每个分割点对应的增益,即⽤贪⼼法枚举所有可能的分割点。当数据⽆法⼀次载⼊内存或者在分布式情况下,贪⼼算法效率就会变得很低,所以xgboost还提出了⼀种可并⾏的近似直⽅图算法,⽤于⾼效地⽣成候选的分割点。
6.对缺失值的处理。对于特征的值有缺失的样本,xgboost可以⾃动学习出它的分裂⽅向。—稀疏感知算法,论⽂3.4节,Algorithm 3: Sparsity-aware
vehementSplit Finding林宥嘉照片
7.Built-in Cross-Validation(内置交叉验证)
XGBoost allows ur to run a cross-validation at each iteration of the boosting process and thus it is easy to get the exact optimum number of boosting iterations in a single run.
This is unlike GBM where we have to run a grid-arch and only a limited values can be tested.
8. continue on Existing Model(接着已有模型学习)
Ur can start training an XGBoost model from its last iteration of previous run. This can be of significant advantage in certain specific applications.
GBM implementation of sklearn also has this feature so they are even on this point.
9. High Flexibility(⾼灵活性)
**XGBoost allow urs to define custom optimization objectives and evaluation criteria.
This adds a whole new dimension to the model and there is no limit to what we can do.**
10.并⾏化处理—系统设计模块,块结构设计等
xgboost⼯具⽀持并⾏。boosting不是⼀种串⾏的结构吗?怎么并⾏的?注意xgboost的并⾏不是tree粒度的并⾏,xgboost也是⼀次迭代完才能进⾏下⼀次迭代的(第t次迭代的代价函数⾥包含了前⾯t-1次迭代的预测值)。xgboost的并⾏是在特征粒度上的。我们知道,决策树的学习最耗时的⼀个步骤就是对特征的值进⾏排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进⾏了排序,然后保存为block 结构,后⾯的迭代中重复地使⽤这个结构,⼤⼤减⼩计算量。这个block结构也使得并⾏成为了可能,在进⾏节点的分裂时,需要计算每个特征的增益,最终选增益最⼤的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进⾏。
需求的英文此外xgboost还设计了⾼速缓存压缩感知算法,这是系统设计模块的效率提升。
当梯度统计不适合于处理器⾼速缓存和⾼速缓存丢失时,会⼤⼤减慢切分点查找算法的速度。
(1)针对 exact greedy algorithm采⽤缓存感知预取算法
(2)针对 approximate algorithms选择合适的块⼤⼩
三、Python代码(参数说明)
del_lection import train_test_split
from sklearn import metrics
from sklearn.datats import make_hastie_10_2
from xgboost.sklearn import XGBClassifier
X, y = make_hastie_10_2(random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)##test_size测试集合所占⽐例 clf = XGBClassifier(
silent=0 ,#设置成1则没有运⾏信息输出,最好是设置为0.是否在运⾏升级时打印消息。
#nthread=4,# cpu 线程数默认最⼤
learning_rate=0.3, # 如同学习率
min_child_weight=1,
# 这个参数默认是 1,是每个叶⼦⾥⾯ h 的和⾄少是多少,对正负样本不均衡时的 0-1 分类⽽⾔
#,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶⼦节点中最少需要包含 100 个样本。
#这个参数⾮常影响结果,控制叶⼦节点中⼆阶导的和的最⼩值,该参数值越⼩,越容易 overfitting。
max_depth=6, # 构建树的深度,越⼤越容易过拟合
gamma=0, # 树的叶⼦节点上作进⼀步分区所需的最⼩损失减少,越⼤越保守,⼀般0.1、0.2这样⼦。subsample=1, # 随机采样训练样本训练实例的⼦采样⽐
max_delta_step=0,#最⼤增量步长,我们允许每个树的权重估计。
colsample_bytree=1, # ⽣成树时进⾏的列采样
秋天的公园作文reg_lambda=1, # 控制模型复杂度的权重值的L2正则化项参数,参数越⼤,模型越不容易过拟合。
长跑健将#reg_alpha=0, # L1 正则项参数
#scale_pos_weight=1, #如果取值⼤于0的话,在类别样本不平衡的情况下有助于快速收敛。平衡正负权重
#objective= 'multi:softmax', #多分类的问题指定学习任务和相应的学习⽬标
#num_class=10, # 类别数,多分类与 multisoftmax 并⽤治学严谨
n_estimators=100, #树的个数
ed=1000#随机种⼦
#eval_metric= 'auc'
民主生活会个人发言提纲
)
clf.fit(X_train,y_train,eval_metric='auc')
长裤用英语怎么说y_true, y_pred = y_test, clf.predict(X_test)
print"Accuracy : %.4g"% metrics.accuracy_score(y_true, y_pred)
四、特征筛选
XGBoost筛选特征其实很简单,主要就是通过zip将模型的importance和feature合并就可以了。