6.3 API : XGBoost

1147-柳同学

发表文章数:589

首页 » 算法 » 正文

一. XGBoost

完整参数
XGBoost的参数一共分为三类:

  1. 通用参数:宏观函数控制
  2. Booster参数:控制每一步的booster(tree/regression)。booster参数一般可以调控模型的效果和计算代价。我们所说的调参,很大程度上都是在调整booster参数
  3. 学习目标参数:控制训练目标的表现。我们对于问题的划分主要体现在学习目标参数上。比如我们要做分类还是回归,做二分类还是多分类,这都是目标参数所提供的

1.通用参数

booster:我们有两种参数选择,gbtree和gblinear。gbtree是采用树的结构来运行数据,而gblinear是基于线性模型。

silent:静默模式,为1时模型运行不输出

nthread: 使用线程数,一般我们设置成-1,使用所有线程。如果有需要,我们设置成多少就是用多少线程

2.Booster参数

n_estimator: 也作num_boosting_rounds
这是生成的最大树的数目,也是最大的迭代次数。

learning_rate: 有时也叫作eta,系统默认值为0.3,。
每一步迭代的步长,很重要。太大了运行准确率不高,太小了运行速度慢。我们一般使用比默认值小一点,0.1左右就很好。

gamma:系统默认为0,我们也常用0。
在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。因为gamma值越大的时候,损失函数下降更多才可以分裂节点。所以树生成的时候更不容易分裂节点。范围: [0,∞]

subsample:系统默认为1。
这个参数控制对于每棵树,随机采样的比例。减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-1,0.5代表平均采样,防止过拟合. 范围: (0,1],注意不可取0

colsample_bytree:系统默认值为1。我们一般设置成0.8左右。
用来控制每棵随机采样的列数的占比(每一列是一个特征)。 典型值:0.5-1范围: (0,1]

colsample_bylevel:默认为1,我们也设置为1.
这个就相比于前一个更加细致了,它指的是每棵树每次节点分裂的时候列采样的比例

max_depth: 系统默认值为6
我们常用3-10之间的数字。这个值为树的最大深度。这个值是用来控制过拟合的。max_depth越大,模型学习的更加具体。设置为0代表没有限制,范围: [0,∞]

max_delta_step:默认0,我们常用0.
这个参数限制了每棵树权重改变的最大步长,如果这个参数的值为0,则意味着没有约束。如果他被赋予了某一个正值,则是这个算法更加保守。通常,这个参数我们不需要设置,但是当个类别的样本极不平衡的时候,这个参数对逻辑回归优化器是很有帮助的。

lambda:也称reg_lambda,默认值为0。
权重的L2正则化项。(和Ridge regression类似)。这个参数是用来控制XGBoost的正则化部分的。这个参数在减少过拟合上很有帮助。

alpha:也称reg_alpha默认为0,
权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。

scale_pos_weight:默认为1
在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。通常可以将其设置为负样本的数目与正样本数目的比值

3.学习目标参数

objective [缺省值=reg:linear]

reg:linear– 线性回归
reg:logistic – 逻辑回归
binary:logistic – 二分类逻辑回归,输出为概率
binary:logitraw – 二分类逻辑回归,输出的结果为

w

T

x

w^Tx

wTx
count:poisson – 计数问题的poisson回归,输出结果为poisson分布。在poisson回归中,max_delta_step的缺省值为0.7 (used to safeguard optimization)
multi:softmax – 设置 XGBoost 使用softmax目标函数做多分类,需要设置参数num_class(类别个数)
multi:softprob – 如同softmax,但是输出结果为ndata*nclass的向量,其中的值是每个数据分为每个类的概率。

eval_metric [缺省值=通过目标函数选择]

rmse: 均方根误差
mae: 平均绝对值误差
logloss: negative log-likelihood
error: 二分类错误率。其值通过错误分类数目与全部分类数目比值得到。对于预测,预测值大于0.5被认为是正类,其它归为负类。不同的划分阈值可以通过 ‘t’进行设置
merror: 多分类错误率,计算公式为(wrong cases)/(all cases)
mlogloss: 多分类log损失
auc: 曲线下的面积
ndcg: Normalized Discounted Cumulative Gain
map: 平均正确率

一般来说,我们都会使用xgboost.train(params, dtrain)函数来训练我们的模型。这里的params指的是booster参数

train

xgboost.train(params, dtrain, num_boost_round=10, evals=(), obj=None, feval=None, maximize=None, 
early_stopping_rounds=None, evals_result=None, verbose_eval=True, xgb_model=None, callbacks=None)

二、参数调参

官方建议
控制过拟合

当你观察到训练精度高,但是测试精度低时,你可能遇到了过拟合的问题。
通常有两种方法可以控制 xgboost 中的过拟合。

第一个方法是直接控制模型的复杂度
这包括 max_depth, min_child_weight 和 gamma
第二种方法是增加随机性,使训练对噪声强健
这包括 subsample, colsample_bytree
你也可以减小步长 eta, 但是当你这么做的时候需要记得增加 num_round

对于广告点击日志等常见情况,数据集是极不平衡的。 这可能会影响 xgboost 模型的训练,
有两种方法可以改善它:

如果你只关心预测的排名顺序(AUC)

  1. 通过 scale_pos_weight 来平衡 positive 和 negative 权重。
  2. 使用 AUC 进行评估

如果你关心预测正确的概率

  1. 在这种情况下,您无法重新平衡数据集
  2. 在这种情况下,将参数 max_delta_step 设置为有限数字(比如说1)将有助于收敛

三、实例

xgb
数据集下载—提取码:1234

import xgboost as xgb
from sklearn.datasets import load_svmlight_file
from sklearn.metrics import roc_auc_score

# 读取数据并自动做一个分割(提取码:1234 把libsvm格式读取成以前我们常用的二维数组形式)
X_train, y_train = load_svmlight_file('agaricus_train.txt')
X_test, y_test = load_svmlight_file('agaricus_test.txt')

print(type(X_train))
# train函数下需要传入一个Dmatrix值
dtrain = xgb.DMatrix(X_train, y_train)
dtest = xgb.DMatrix(X_test, y_test)

params = {
    'max_depth': 15,
    'learning_rate': 0.1,
    'n_estimators': 2000,
    'min_child_weight': 5,
    'max_delta_step': 0,
    'subsample': 0.8,
    'colsample_bytree': 0.7,
    'reg_alpha': 0,
    'reg_lambda': 0.4,
    'scale_pos_weight': 0.8,
    'silent': True,
    'objective': 'binary:logistic',
    'missing': None,
    'eval_metric': 'auc',
    'seed': 1440,
    'gamma': 0
}  # 这里的params特指booster参数,注意这个eva_metric是评估函数

# early_stopping:这里指的是30轮迭代中效果未增长便停止训练
# verbose_eval=True表示每轮打印输出
xlf = xgb.train(params, dtrain, evals=[(dtest, 'eval')],
                num_boost_round=2000, early_stopping_rounds=30, verbose_eval=True)

y_pred = xlf.predict(dtest, ntree_limit=xlf.best_ntree_limit)
# xgboost没有直接使用效果最好的树作为模型的机制,这里采用最大树深限制的方法,目的是获取刚刚early_stopping效果最好的,实测性能可以
auc_score = roc_auc_score(y_test, y_pred)  # 算一下预测结果的roc值

# 结果
y_pred = [0.33062753 0.6676669  0.33062753 ... 0.66978204 0.3305031  0.66978204]

预测输出的是一串连续值,是xgboost在这几个类别上概率最大的概率值。
XGBoostClassifier()形式
xgboost为了贴合sklearn的使用,比如gridsearch这些实用工具,又开发了XGBoostClassifier()和XGBoostRegression()两个函数。可以更加简单快捷的进行分类和回归处理。注意xgboost的sklearn包没有 feature_importance 这个量度,但是get_fscore()函数有相同的功能。

import xgboost as xgb
from sklearn.datasets import load_svmlight_file
from sklearn.metrics import roc_auc_score

# 读取数据并自动做一个分割(把libsvm格式读取成以前我们常用的二维数组形式)
X_train, y_train = load_svmlight_file('agaricus_train.txt')
X_test, y_test = load_svmlight_file('agaricus_test.txt')

print(type(X_train))

# 这里不需要Dmatrix

xlf = xgb.XGBClassifier(max_depth=10,
                        learning_rate=0.01,
                        n_estimators=2000,
                        silent=True,
                        objective='binary:logistic',
                        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='error', verbose=True, eval_set=[(X_test, y_test)], early_stopping_rounds=30)
# 这个verbose主要是调节系统输出的,如果设置成10,便是每迭代10次就有输出。
# 注意我们这里eval_metric=‘error’便是准确率。这里面并没有accuracy命名的函数,网上大多例子为auc,我这里特意放了个error。
y_pred = xlf.predict(X_test, ntree_limit=xlf.best_ntree_limit)
auc_score = roc_auc_score(y_test, y_pred)

print(auc_score)
print('y_pred =', y_pred)


1.0
y_pred = [0. 1. 0. ... 1. 0. 1.]

这里预测输出的是类别

四、常用调参-GridSearch

穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search)
其实这个就跟我们常用的遍历是一样的。建议大家使用sklearn里面的GridSearch函数,简洁速度快。

import xgboost as xgb
from sklearn.datasets import load_svmlight_file
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import GridSearchCV

# 读取数据并自动做一个分割(把libsvm格式读取成以前我们常用的二维数组形式)
X_train, y_train = load_svmlight_file('agaricus_train.txt')
X_test, y_test = load_svmlight_file('agaricus_test.txt')

print(type(X_train))

# 这里不需要Dmatrix

# 可调参数
parameters = {
    'max_depth': [5, 10, 15, 20, 25],
    'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],
    'n_estimators': [500, 1000, 2000, 3000, 5000],
    'min_child_weight': [0, 2, 5, 10, 20],
    'max_delta_step': [0, 0.2, 0.6, 1, 2],
    'subsample': [0.6, 0.7, 0.8, 0.85, 0.95],
    'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9],
    'reg_alpha': [0, 0.25, 0.5, 0.75, 1],
    'reg_lambda': [0.2, 0.4, 0.6, 0.8, 1],
    'scale_pos_weight': [0.2, 0.4, 0.6, 0.8, 1]
}

xlf = xgb.XGBClassifier()
gs_xgb = GridSearchCV(xlf, param_grid=parameters, scoring='accuracy', cv=5)
gs_xgb.fit(X_train, y_train)
print(gs_xgb.best_score_)
print(gs_xgb.best_params_)
print(gs_xgb.best_estimator_)

未经允许不得转载:作者:1147-柳同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《6.3 API : XGBoost》 发布于2021-01-23

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录