一、XGBoost基本原理
参考文章:
https://blog.csdn.net/qq_22238533/article/details/79477547 ------ xgboost原理分析以及实践(转载)
https://blog.csdn.net/sb19931201/article/details/52557382 ------ XGboost API
(1) XGBoost损失函数
- XGboost损失函数的结构
- GBDT与XGBoost损失函数的区别
- XGboost损失函数初级表达式
- XGboost损失函数推导
- XGboost损失函数最终式子
- 例题
(2)XGBoost的学习策略
- XGboost 如何确定最优的子树结构,即损失函数最小的子树结构?
- 第一种方式:暴力穷举
- 暴力穷举:暴力罗列出所有的树结构,选择损失函数最小的子树结构(数据量很庞大时不宜计算)
- 第二种方式:贪心法
- 贪心法:类似于决策树的划分方法,逐层计算选取可能划分点中最优的分裂点(Gain增益最大,即损失函数
- 减小最多的分裂点)。
- 第一种方式:暴力穷举
• 决策树相关算法计算指标:
• ID3算法:信息增益
• C4.5算法:信息增益率
• CART算法:Gini系数
Xgboost最优树结构划分方式:
Gain值越大,分裂后减少的损失值越大。所以对于一个叶子节点分割时,计算所 有候选(feature,value)对应的gain,选择
gain最大特征进行分割。
- 树节点的贪心分裂方法?
- 精确算法:遍历所有特征的所有可能的分割点,计算gain值,选择最大的 gain值对应的(feature,
- value)进行分割
- 近似算法:对于每个特征,只考虑分位点,减少计算复杂度
近似算法案例:三分位数
>>>>>>
二、XGboost 总结
- XGboost 算法 比较 GBDT 算法 有哪些优势
优势有以下几点:最重要的是 增加了正则化项(不容易过拟合,鲁棒性强)、加快了模型的运行速度(伪并行和引入列抽样)
1、引入了损失函数的二阶导信息
传统的GBDT模型只用到了损失函数的一阶导信息(一阶泰勒公式展开),而XGboost模型用到了损失函数二阶导信息,模型效
果更好
2、支持自定义损失函数
但是需要自定义损失函数的二阶导数存在,大大增加模型处理问题的灵活性
3、加入了正则化项,模型不容易过拟合
① 通过控制子树树节点的个数来控制子树的深度,防止过拟合
② 控制子树节点的预测值不宜过大(即子树节点的均值),预测值过大会造成预测累加过程有较大偏差。
4、引入列采样
Xgboost 借鉴了RF 对特征属性进行采样,优点有以下两点:① 抗干扰性变强,异常值不敏感 ② 减少计算量
5、剪枝处理
6、增加缺省值的处理
根据Gain增益来确定划分左子树还是右子树
7、支持并行 ------ XGboost并行体现在特征划分上,而不是子树模型训练
Xgboost模型的并行运算与Bagging思想的RF不同,RF每个子模型的训练集的数据是有放回的重采样获得的,各个子模型之间相
互独立,因此可以并行运算。
XGboost 并行指的是可以在对子树进行多线程并行计算Gain增益从而加快最优划分子树分裂点。这是因为XGboost会对所有的特
征属性进行排序并保存为block结构,block结构可以并行多线程计算。
8、模型训练的速度更快
① XGboost引入并行预算
② XGboost引入列抽样
- XGboost算法原理部分执行了那些事 ?
1.在GBDT损失函数的基础上加入了正则项。
2.对目标函数进行二阶泰勒展开。
3.利用推导得到的表达式作为分裂准确,来构建每一颗树。
三、XGboost 调参
https://xgboost.readthedocs.io/en/latest/python/python_api.html#module-xgboost.sklearn ----- 官方API
(1)API
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.01, random_state=1729)
print(X_train.shape, X_test.shape)
#模型参数设置
xlf = xgb.XGBRegressor(max_depth=10,
learning_rate=0.1,
n_estimators=10,
silent=True,
objective='reg:linear',
nthread=-1,
gamma=0,
min_child_weight=1,
max_delta_step=0,
subsample=0.85,
colsample_bytree=0.7,
colsample_bylevel=1,
reg_alpha=0,
reg_lambda=1,
scale_pos_weight=1,
seed=1440,
missing=None)
xlf.fit(X_train, y_train, eval_metric='rmse', verbose = True, eval_set =
[(X_test, y_test)],early_stopping_rounds=100)
# 计算 auc 分数、预测
preds = xlf.predict(X_test)
(2)调参