【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
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")

【sklearn学习】集成算法之XGBoost

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

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

Original: https://blog.csdn.net/qq_41807261/article/details/123969995
Author: jaeden_xu
Title: 【sklearn学习】集成算法之XGBoost

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/693321/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球