机器学习 7 XGBoost

1. 集成算法总结

1.1 Bagging

  1. 随机森林:多个基模型的构建是基于不同数据来构建的,各个模型是独立,不提提高准确度,但是可以降低过拟合;

1.2 Boosting

  1. 通过迭代的形式,基于之前构建好的模型,对样本数据做一定的修正【或者改变权重/标签值】然后影响之后模型的构建。不断迭代构建的目的是:让预测更加准确,提升准确度,降低偏差;
  2. Adaboost
    1. 通过修正样本的权重
  3. GBDT
    1. 通过修正样本的预测值label标签值;

2. XGBoost的基本概述

  1. XGBoost是GBDT算法的一种变种优化,是一种有监督的集成学习算法;是一种伸缩性强、便捷的可并行构建模型的Gradient Boosting算法;
  2. XGBoost的官网:http://xgboost.readthedocs.io
  3. XGBoost的Github源码位置:
  4. XGBoost支持的开发语言:Python、R、Java、Scala、C++等。

3. XGBoost的原理

3.1 CART、GBDT

在这里插入图片描述

3.2 模型

  1. 目标函数
    1. O b j ( θ ) = L ( θ ) + Ω ( θ ) Obj(\theta)=L(\theta) + \Omega(\theta) Obj(θ)=L(θ)+Ω(θ)
    2. L ( θ ) L(\theta) L(θ)是误差函数,体现的是模型有多拟合数据;
    3. Ω ( θ ) \Omega(\theta) Ω(θ)正则化项:惩罚复杂模型的参数用于解决过拟合;

3.3 GBDT的目标函数

  1. o b j = ∑ i = 1 n l ( y i , y i − ( t ) ) obj=\sum_{i=1}^nl(y_i, y_i^-(t)) obj=i=1nl(yi,yi(t))
  2. 逐步迭代
    1. y i − ( 0 ) = 0 y_i^-(0)=0 yi(0)=0
    2. y i − ( 1 ) = y i − ( 0 ) + f 1 ( x i ) y_i^-(1)=y_i^-(0)+f_1(x_i) yi(1)=yi(0)+f1(xi)
    3. y i − ( 2 ) = y i − ( 1 ) + f 2 ( x i ) y_i^-(2)=y_i^-(1)+f_2(x_i) yi(2)=yi(1)+f2(xi)
    4. y i − ( t ) = y i − ( t − 1 ) + f t ( x i ) y_i^-(t)=y_i^-(t-1)+f_t(x_i) yi(t)=yi(t1)+ft(xi)
  3. 并没有考虑模型的复杂程度

3.4 XGBoost的目标函数

  1. 在GBDT的目标函数上增加正则化项[主要考虑基函数的复杂度]
  2. o b j = ∑ i = 1 n l ( y i , y i − ( t ) ) + ∑ i = 1 t Ω ( f i ) obj=\sum_{i=1}^nl(y_i, y_i^-(t))+\sum_{i=1}^t\Omega(f_i) obj=i=1nl(yi,yi(t))+i=1tΩ(fi)
  3. 逐步迭代
    1. y i − ( 0 ) = 0 y_i^-(0)=0 yi(0)=0
    2. y i − ( 1 ) = y i − ( 0 ) + f 1 ( x i ) y_i^-(1)=y_i^-(0)+f_1(x_i) yi(1)=yi(0)+f1(xi)
    3. y i − ( 2 ) = y i − ( 1 ) + f 2 ( x i ) y_i^-(2)=y_i^-(1)+f_2(x_i) yi(2)=yi(1)+f2(xi)
    4. y i − ( t ) = y i − ( t − 1 ) + f t ( x i ) y_i^-(t)=y_i^-(t-1)+f_t(x_i) yi(t)=yi(t1)+ft(xi)
  4. 假设 f t ( x ) = ω q ( x ) f_t(x)=\omega_q(x) ft(x)=ωq(x), ω q ( x ) \omega_q(x) ωq(x)表示第q个叶子节点的预测值
  5. $\Omega(f)=\gamma T+\frac{1}{2}\lambda \sum_{j=1}^T \omega_j^2 $,T表示当前这棵树的叶子节点数,后面表示叶子节点的预测值不能太大【相当于模型的复杂度有两部分组成:叶子节点数(分的太细)和叶子节点的预测值不能太大】

3.5 XGBoost公式的推导

  1. 第t次迭代之后,模型的预测等于前t-1次的模型加上第t棵树的预测结果: y i − ( t ) = y i − ( t − 1 ) + f t ( x i ) y_i^-(t)=y_i^-(t-1)+f_t(x_i) yi(t)=yi(t1)+ft(xi)
  2. 目标函数可以写成: l o s s = ∑ i = 1 n l ( y i , y i t − 1 + f t ( x i ) ) + ∑ t = 1 t − 1 Ω ( f i ) + Ω ( f t ) loss=\sum_{i=1}^nl(y_i, y_i^{t-1}+f_t(x_i))+\sum_{t=1}^{t-1}\Omega(f_i)+\Omega(f_t) loss=i=1nl(yi,yit1+ft(xi))+t=1t1Ω(fi)+Ω(ft)
  3. 将误差函数中的 y i t − 1 + f t ( x i ) y_i^{t-1}+f_t(x_i) yit1+ft(xi)当成一个整体在 y i t − 1 y_i^{t-1} yit1初进行二阶泰勒展开
    1. l o s s ≈ ∑ i n [ l ( y i , y i t − 1 ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + ∑ i = 1 t − 1 Ω ( f i ) + Ω ( f t ) loss\approx \sum_i^n [l(y_i,y_i^{t-1})+g_i f_t(x_i)+\frac{1}{2}h_i f_t^2(x_i)]+\sum_{i=1}^{t-1}\Omega(f_i)+\Omega(f_t) lossin[l(yi,yit1)+gift(xi)+21hift2(xi)]+i=1t1Ω(fi)+Ω(ft)
    2. g i = ∂ y i t − 1 l ( y i , y i t − 1 ) g_i=\partial_{y_i^{t-1}}l(y_i, y_i^{t-1}) gi=yit1l(yi,yit1)
    3. h i = ∂ y i t − 1 2 l ( y i , y i t − 1 ) h_i=\partial_{y_i^{t-1}}^2l(y_i, y_i^{t-1}) hi=yit12l(yi,yit1)
  4. t = y i + f t ( x ) , t 0 = f t − 1 ( x ) t=y_i+f_t(x), t_0=f_{t-1}(x) t=yi+ft(x),t0=ft1(x)
    5.在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.6 GBDT和XGBoost的比较

  1. XGBoost在GBDT的基础上加入了正则化项,防止模型过拟合;
  2. XGBoost在构建的过程中,考虑了二阶导函数;而GBDT只考虑了一阶导函数;
  3. XGBoost中决策树的构建是基于损失函数的;而GBDT内的决策树(CART)是基于MSE/MAE/Gini
    系数
  4. XGBoost支持列采样(类似随机森林的方式),可以降低过拟合的情况;
  5. XGBoost是并行计算的,此处的并行指的是:划分特征选择过程中是并行计算的;
  6. GBDT底层只支持CART,XGBoost底层不仅支持CART,还支持线性回归、逻辑回归;
  7. 一般很少用xgboost来获取特征的重要性权重

3.7 XGBoost的学习策略

  1. 当树的结构确定的时候,我们就可以得到最优的叶子节点分数以及对应的最小损失值,问题在于如何确定树结构:
    1. 暴力穷举法:暴力穷举所有可能的树结构,选择损失最小的树【难度较大】;
    2. 贪心算法:每次尝试选择一个分裂节点进行分裂,计算操作前后的增益,选择增益最大的方式进行分裂;
  2. 决策树相关的算法计算指标
    1. ID3算法:信息增益
    2. C4.5算法:信息增益率
    3. CART算法:Gini系数
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

3.8 XGBoost的其他特性

  1. 列采样(column subsampling):借鉴随机森林的做法,支持列采样,不仅可以降低过拟合,而且还可以提高计算量;
  2. 支持对缺失值的自动处理:对于某个特征有缺失的样本,XGBoost可以自动学习分裂方向;
  3. SGBoost支持并行算法;XGBoost的并行实在特征粒度上进行的,在计算特征的Gain的时候是并行计算的,但是在树的构建过程中,还是串行构建的;
  4. XGBoost算法中加入正则项,用于控制模型的复杂度,最终模型更加不容易过拟合;
  5. XGBoost基学习器支持CART、线性回归、逻辑回归;
  6. XGBoost支持自定义损失函数(要求损失函数二阶可导)

3.9XGBoost API相关参数

参数XGBClassifierXGBRegressor
max_depth给定树的深度,默认是3
learning_rate每个迭代产生额模型的权重/学习率,默认为0.1
n_estimators子模型的数量,默认为100
objective给定损失函数,默认为“binary:logistics”给定损失函数,默认为“reg:linear”
booster给定模型的求解方式,默认为:gbtree,可选参数:gbtree、gblinear、dart
n_jobs使用多少个线程并行构建XGBoost模型,默认为1
reg_alphaL1正则的权重,默认为0
reg_lambdaL2正则的权重,默认为1
## demos
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import xgboost as xgb

# load data
X, Y = load_boston(return_X_y=True)

# train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, Y, 
                                                    test_size=0.15,
                                                    random_state=0)
print('Train Set Size:', x_train.shape)
print('Test Set Size:', x_test.shape)

# 构建模型对象,使用XGBoost的相关API
# 1. 直接使用相关的API
# 1.1 数据转换
d_train = xgb.DMatrix(data=x_train, label=y_train, )
d_test = xgb.DMatrix(data=x_test, label=y_test)
# 1.2 模型参数构建
params = {
    'max_depth': 50, # 训练数据集
    'eta': 0.1, # 迭代次数
    'n_estimators': 50,
    'objective': 'reg:squarederror',
    'booster': 'gbtree'
}
# 1.3 模型训练
model = xgb.train(params=params, # booster 中的参数
    dtrain=d_train, # 训练数据集
    num_boost_round=50,  # 迭代次数
    evals=(),    # 评价函数
    obj=None,  # 损失函数
    xgb_model=None,)
# 1.4 模型保存
model.save_model('xgb.model')
# 加载模型来预测
model2 = xgb.Booster()
model2.load_model('xgb.model')
pred = model2.predict(d_test)
print('MSE on Test:', mean_squared_error(y_test, pred))
print('r2_score on Test', r2_score(y_test, pred))

from xgboost import plot_importance
from matplotlib import pyplot as plt
plot_importance(model2, importance_type='cover')
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值