【sklearn学习】集成算法之XGBoost

XGBoost是一个以提升树为核心的算法系统

XGBoost中包含Boosting三要素

  • 损失函数:用以衡量模型预测结果与真实结果的差异
  • 弱评估器:决策树,不同的boosting算法使用不同的建树流程
  • 综合集成结果:集成算法具体如何输出集成结果

原生代码必须使用XGBoost自定义的数据结构DMatrix,能够保证xgboost算法运行更快,并且能够迁移到GPU上运行。

以字典形式设置参数

使用xgboost中自带的方法xgb.train或xgb.cv进行训练

# lightgbm原生接口
import xgboost as xgb
# 基于scikit-learn接口
from xgboost import XGBClassifier
from xgboost import XGBRegressor

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import mean_absolute_error, mean_squared_error
import pandas as pd
import numpy as np
from sklearn.model_selection import KFold
from sklearn.datasets import load_boston, load_breast_cancer, load_wine
import warnings
warnings.simplefilter("ignore")
bonston = load_boston()
cancer = load_breast_cancer()
wine = load_wine()
data_train, data_test, target_train, target_test = train_test_split(cancer.data, cancer.target, test_size = 0.2, random_state = 0)

params = {
    'eta': 0.02,  #lr
    'max_depth': 6,  
    'min_child_weight':3,#最小叶子节点样本权重和
    'gamma':0, #指定节点分裂所需的最小损失函数下降值。
    'subsample': 0.7,  #控制对于每棵树,随机采样的比例
    'colsample_bytree': 0.3,  #用来控制每棵随机采样的列数的占比 (每一列是一个特征)。
    'lambda':2,
    'objective': 'binary:logistic', 
    'eval_metric': 'auc', 
    'silent': True, 
    'nthread': -1
}

xgb_train  = xgb.DMatrix(data_train, target_train)
xgb_test = xgb.DMatrix(data_test, target_test)
xgb_model = xgb.train(dtrain = xgb_train, params=params)
xgb_predict = xgb_model.predict(xgb_train)
xgb_predict[xgb_predict > .5] = 1
xgb_predict[xgb_predict <= .5] = 0
data_train, data_test, target_train, target_test = train_test_split(wine.data, wine.target, test_size = 0.2, random_state = 0)

params = {
    'eta': 0.02,  #lr
    'num_class':3,
    'max_depth': 6, 
    'min_child_weight':3,#最小叶子节点样本权重和
    'gamma':0, #指定节点分裂所需的最小损失函数下降值。
    'subsample': 0.7,  #控制对于每棵树,随机采样的比例
    'colsample_bytree': 0.3,  #用来控制每棵随机采样的列数的占比 (每一列是一个特征)。
    'lambda':2,
    'objective': 'multi:softmax', 
    'eval_metric': 'mlogloss', 
    'silent': True, 
    'nthread': -1
}

xgb_train  = xgb.DMatrix(data_train, target_train)
xgb_test = xgb.DMatrix(data_test, target_test)
xgb_model = xgb.train(dtrain = xgb_train, params=params)
xgb_predict = xgb_model.predict(xgb_train)
xgb_test_pred = xgb_model.predict(xgb_test)
data_train, data_test, target_train, target_test = train_test_split(bonston.data, bonston.target, test_size = 0.2, random_state = 0)

params = {
  'eta': 0.02,  #lr
  'max_depth': 6,  
  'min_child_weight':3,#最小叶子节点样本权重和
  'gamma':0, #指定节点分裂所需的最小损失函数下降值。
  'subsample': 0.7,  #控制对于每棵树,随机采样的比例
  'colsample_bytree': 0.3,  #用来控制每棵随机采样的列数的占比 (每一列是一个特征)。
  'lambda':2,
  'objective': 'reg:linear', 
  'eval_metric': 'rmse', 
  #   'silent': True, 
  'nthread': -1}

xgb_train  = xgb.DMatrix(data_train, target_train)
xgb_test = xgb.DMatrix(data_test, target_test)
xgb_model = xgb.train(dtrain = xgb_train, params=params, num_boost_round=100)
xgb_train_predict = xgb_model.predict(xgb_train)
train_mae_score = mean_absolute_error(xgb_train_predict, target_train)
print('train mae score:', train_mae_score)
xgb_test_predict = xgb_model.predict(xgb_test)
test_mae_score = mean_absolute_error(xgb_test_predict, target_test)
print('test mae score:', test_mae_score)
result = xgb.cv(params, xgb_train, num_boost_round=300, nfold=5, seed=2022)

plt.figure(dpi=90)
plt.plot(result["train-rmse-mean"])
plt.plot(result["test-rmse-mean"])
plt.legend(["train","test"])
plt.title("xgboost 5 fold cv")

 

 

XGBoost的目标函数

经验风险:模型对数据学习越深入,损失越小(经验风险越小),模型对数据学习越浅显,损失越大(经验风险越大)

结构风险:树结构越复杂,模型复杂度越高,过拟合风险越大(结构风险越大),树模型结构越简单,模型复杂度越低,过拟合风险越小(结构风险越小)

叶子权重:是XGBoost数学体系中非常关键的因子,实际上就是当前叶子j的预测值

参数gamma:调大gamma可以控制过拟合

XGBoost默认使用L2正则化

参数alpha和lambda:调大这两个参数可以控制过拟合

参数作用
num_boost_round集成算法中弱分类器数量,对Boosting算法而言为实际迭代次数
etaBoosting算法中的学习率,影响弱分类器结果的加权求和过程
objective选择需要优化的损失函数
base_score初始化预测结果H0的设置
max_delta_step一次迭代中所允许的最大迭代值
gamma乘在叶子数量前的系数,放大可控制过拟合
lambdaL2正则化系数,放大可控制过拟合
alphaL1正则化系数,放大可控制过拟合

弱评估器的分枝

XGBoost使用的弱评估器是改进后的CART树,在CART树的基础上,XGBoost创新的全新的分枝策略:结构分数和结构分数增益,保证CART树向减小目标函数的方向增长。

类型参数
迭代过程/目标函数
弱评估器结构
CART树
弱评估器的训练数据
提前停止
其它

控制复杂度:弱评估器的剪枝

min_child_weight:被广义理解为任意节点上所允许的样本量,如果一个节点上的样本量小于该参数中设置的值,该节点就会被剪枝,min_child_weight越大,模型越不容易过拟合

gamma:允许分枝的最低结构分数增益,当分枝时结构增益不足gamma中设置的值,该节点被剪枝。gamma在剪枝中的作用相当于sklearn 中的min_impurity_

参数lambda和alpha:正则化系数,位于结构分数中间接影响树的生长和分枝

弱评估器的训练数据

样本的抽样

subsample:对样本进行抽样的比例,默认为1

sampling_method:对样本进行抽样时所使用的抽样方法,默认均匀抽样

特征的抽样

colsample_bytree

colsample_bylevel

colsample_bynode

类型参数
booster选择迭代过程中的弱评估器类型,包括gbtree、DART和线性模型
sample_typeDART树中随机抽样树的具体方法
rate_dropDART树中使用的抛弃率
one_drop每轮迭代时至少需要抛弃的树的数量
skip_drop在迭代中不进行抛弃的概率
normalized_type根据被抛弃的树的权重控制新增树权重
max_depth允许的弱评估器的最大深度
min_child_weight广义上叶子节点上的最小样本权重/最小样本量
gamma目标函数中叶子数量T的系数,同时也是分枝所需的最小结构分数增益值
lambda与alpha正则项系数,同时也位于结构分数的公式中,间接影响模型的剪枝
sample_type对样本进行抽样的具体方式
subsample对样本进行抽样的具体比例

colsample_bytree,

colsample_bylevel,

colsample_bynode

在建树过程中对特征进行抽样的比例

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值