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算法而言为实际迭代次数 |
eta | Boosting算法中的学习率,影响弱分类器结果的加权求和过程 |
objective | 选择需要优化的损失函数 |
base_score | 初始化预测结果H0的设置 |
max_delta_step | 一次迭代中所允许的最大迭代值 |
gamma | 乘在叶子数量前的系数,放大可控制过拟合 |
lambda | L2正则化系数,放大可控制过拟合 |
alpha | L1正则化系数,放大可控制过拟合 |
弱评估器的分枝
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_type | DART树中随机抽样树的具体方法 |
rate_drop | DART树中使用的抛弃率 |
one_drop | 每轮迭代时至少需要抛弃的树的数量 |
skip_drop | 在迭代中不进行抛弃的概率 |
normalized_type | 根据被抛弃的树的权重控制新增树权重 |
max_depth | 允许的弱评估器的最大深度 |
min_child_weight | 广义上叶子节点上的最小样本权重/最小样本量 |
gamma | 目标函数中叶子数量T的系数,同时也是分枝所需的最小结构分数增益值 |
lambda与alpha | 正则项系数,同时也位于结构分数的公式中,间接影响模型的剪枝 |
sample_type | 对样本进行抽样的具体方式 |
subsample | 对样本进行抽样的具体比例 |
colsample_bytree, colsample_bylevel, colsample_bynode | 在建树过程中对特征进行抽样的比例 |