文章目录
一、XGBoost概述
前驱知识:决策树,集成学习
XGBoost是近年兴起的一种提升树(boosting tree)集成算法,其效率较高。
该算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。
二、XGBoost算法
输入:训练数据集
,其中
;损失函数
。
输出:提升树
。
(1)初始化
(2)对K棵决策树,
(a)计算前一棵树损失函数的一阶和二阶梯度:
(b)对决策树的叶结点
,计算
(c)则第k棵树的目标函数最小值为:
,第k棵树第j个叶结点的最优权值为:
。
(d)更新:
(3)得到回归问题的提升树(分类问题即对回归问题的提升树进行符号函数变换):
三、XGBoost详解
3.1 目标函数
- ,其中 表示决策树的复杂度,用于防止过拟合。
- 根据前向算法有:
- 根据二阶泰勒展式有: ,其中 是一阶偏导, 是二阶偏导。
- 删去常数项,有:
- 关于正则项 : ,T是叶子节点个数, 是叶子节点的权值, 和 是超参数。
- 接着将4,5结合,这是算法的神奇之处,详见这里,有:
,其中 表示第i个样本划分到第j个叶结点 - 定义: 和
3.2 前向算法
四、XGBoost in Python
import xgboost as xgb
4.1 载入数据
xgboost将数据存储在DMatrix
对象里
支持的数据类型:
- LibSVM text format file
- Comma-separated values (CSV) file
- NumPy 2D array
- SciPy 2D sparse array
- Pandas data frame
- XGBoost binary buffer file.
注:xgb载入分类变量前要先one_hot encoding
xgb.DMatrix(data, label=None, missing=None, weight=None, silent=False, feature_names=None, feature_types=None, nthread=None)
:载入数据到DMatrix
对象。
label
:指定标签值向量/矩阵。
missing
:指定缺失值在矩阵中的值。
weight
:指定权重变量。
DMatrix.save_binary('train.buffer')
:存储DMatrix
对象,下次使用时能加快加载速度。
4.2 设置参数
param = {'max_depth': 2,'eta': 1, 'objective': 'binary:logistic',...}
参数介绍:
'nthread':4
'eval_metric':['auc','ams@0','rmse']
'max_depth': 2
'eta': 1
'objective':
:'reg:linear'
,'binary:logistic'
"booster":'gbtree'
'subsample': 0.7
'colsample_bytree': 0.8
'silent': True
扫描二维码关注公众号,回复: 8635251 查看本文章
4.3 训练和预测
clf=xgb.train(params, dtrain, num_boost_round=10, evals=[], obj=None, feval=None, maximize=False, early_stopping_rounds=None, evals_result=None, verbose_eval=True, xgb_model=None, callbacks=None, learning_rates=None)
num_boost_round
:boost迭代次数
evals
:一对对 (DMatrix, string)组成的列表,培训期间将评估哪些指标的验证集列表。验证指标将帮助我们跟踪模型的性能。用evallist = [(dtest, 'eval'), (dtrain, 'train')]
指定。
obj
feval
:自定义评价函数
maximize
early_stopping_rounds
:验证指标需要至少在每轮early_stopping_rounds中改进一次才能继续训练,例如early_stopping_rounds=200表示每200次迭代将会检查验证指标是否有改进,如果没有就会停止训练,如果有多个指标,则只判断最后一个指标
evals_result
verbose_eval
:取值可以是bool型也可以是整数,当取值为True时,表示每次迭代都显示评价指标,当取值为整数时,表示每该取值次数轮迭代后显示评价指标
xgb_model
callbacks
learning_rates
-
bst.save_model('0001.model')
-
ypred = clf.predict(data, output_margin=False, ntree_limit=None, validate_features=True)
ntree_limit
:限制预测中的树数;如果定义了最佳树数限制,则默认为最佳树数限制,否则为0(使用所有树)
xgb.plot_tree(bst, num_trees=2)
xgb.to_graphviz(bst, num_trees=2)
五、实例
model_xgb = xgb.XGBRegressor(colsample_bytree=0.4603, gamma=0.0468,
learning_rate=0.05, max_depth=3,
min_child_weight=1.7817, n_estimators=2200,
reg_alpha=0.4640, reg_lambda=0.8571,
subsample=0.5213, silent=1,
random_state =7, nthread = -1)
import xgboost
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
#X_train,y_train略
#自定义评价函数
def myFeval(preds, xgbtrain):
label = xgbtrain.get_label()
score = mean_squared_error(label,preds)
return 'myFeval',score
xgb_params = {"booster":'gbtree','eta': 0.005, 'max_depth': 5, 'subsample': 0.7,
'colsample_bytree': 0.8, 'objective': 'reg:linear', 'eval_metric': 'rmse', 'silent': True, 'nthread': 8}
folds = KFold(n_splits=5, shuffle=True, random_state=2018)
oof_xgb = np.zeros(len(train))
predictions_xgb = np.zeros(len(test))
for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train, y_train)):
print("fold n°{}".format(fold_+1))
trn_data = xgb.DMatrix(X_train[trn_idx], y_train[trn_idx])
val_data = xgb.DMatrix(X_train[val_idx], y_train[val_idx])
watchlist = [(trn_data, 'train'), (val_data, 'valid_data')]
clf = xgb.train(dtrain=trn_data, num_boost_round=20000, evals=watchlist, early_stopping_rounds=200, verbose_eval=100, params=xgb_params,feval = myFeval)
oof_xgb[val_idx] = clf.predict(xgb.DMatrix(X_train[val_idx]), ntree_limit=clf.best_ntree_limit)
predictions_xgb += clf.predict(xgb.DMatrix(X_test), ntree_limit=clf.best_ntree_limit) / folds.n_splits
print("CV score: {:<8.8f}".format(mean_squared_error(oof_xgb, y_train_)))
Thanks for reading!----by LiHao