XGBoost的参数详解与代码示例


XGBoost的参数类型

XGBoost有三大类型的参数:
1.一般参数(general parameters):用于集成算法本身;
2. 弱评估器参数(booster parameters):与弱评估器训练相关的参数;
3. 任务参数(Learning task parameters):应用中的其他过程;
下面主要使用sklearnAPI来讲解这些参数

一、一般参数

n_estimators 集成中弱评估器的数量
n_estimators表示集成的弱评估器的个数,n_estimators越大,模型的学习能力就会越强,模型也越容易过拟合。 在随机森林中,调整的第一个参数就是n_estimators,这个参数非常强大,常常能够一次性将模型调整到极限, 在XGBoost中它也是如此。
xgb.train(): num_round,default=10
xgb.XGBRegressor():n_estimators,default=100

booster 指定要使用的弱分类器
使用哪种弱评估器。可以输入gbtree,gblinear或dart。 输入的评估器不同,使用的params参数也不同, 每种评估器都有自己的params列表。 评估器必须于param参数相匹配,否则报错。
可选的有[gbtree, dart, gblinear]:
gbtree:即是论文中主要讨论的树模型,推荐使用
gblinear:是线性模型,表现很差,接近一个LASSO
dart:Dropouts meet Multiple Additive Regression Trees,可译为抛弃提升树,在建树的过 程中会抛弃一部分树,比梯度提升树有更好的防过拟合功能。
xgb.train(): booster
xgb.XGBRegressor():booster

nthread 用于运行XGBoost的并行线程数
disable_default_eval_metric 如果自定义了评估函数,就禁用默认的评估准则

verbosity 训练中是否打印每次训练的结果
开启参数verbosity,在数据巨大,预料到算法运行会非常缓慢的时候可以使用这个参数来监控模型的训练进度
xgb.train() :silent, default = False
xgb.XGBRegressor() :
verbosity , default = 0, 取值范围[0,3] 0 (silent), 1 (warning), 2 (info), 3 (debug).
#设置 verbosity = 3,会打印详细的训练过程

二、弱评估器参数

learning_rate 迭代决策树时的步长(shrinkage),又叫学习率,控制迭代速率,防止过拟合
在XGBoost中,完整的迭代决策树的公式应该写作:

其中 是迭代决策树时的步长(shrinkage),也叫学习率(learning_rate)。 越大,迭代速度越快,算法极限很快被达 到,有可能无法收敛到真正的最佳。 越小,越有可能找到更精确的最佳值,但迭代速度会比较缓慢。
xgb.train() eta,default=0.3 取值范围[0,1]
xgb.XGBRegressor() learning_rate,default=0.1 取值范围[0,1]

max_depth 树的最大深度
gamma 复杂度的惩罚项
subsample 从样本中进行采样的比例
min_child_weight 一个叶子节点上所需要的最小样本权重
max_delta_step 树的权重估计中允许的单次最大增量
colsample_bytree 构造每棵树时随机抽样出的特征占所有特征的比例
colsample_bylevel 在树的每一层进行分支时随机抽样出的特征占所有特征的比例
colsample_bynode 每次生成一个叶子节点时,随机抽样特征的比例 [default=1]

L1正则化系数
xgb.train() :alpha,默认0
xgb.XGBRegressor() : reg_alpha,默认0

L2正则化系数
xgb.train() :lambda,默认1
xgb.XGBRegressor() : reg_lambda,默认1

三、任务参数

objective 指定目标函数的第一部分,损失函数的类型
梯度提升算法中都存在着损失函数。不同于逻辑回归算法中固定的损失函数,集成算法中的损失函数是可选的,要 选用什么损失函数取决于我们希望解决什么问题。比如:如果我们的目标是进行回归预测,那么可以选择MSE作为 损失函数;如果是分类预测,可以选择错误率error或者对数损失函数log_loss(也叫做交叉熵损失函数)。
XGBoost使用参数’objective’来确定目标函数的第一部分,也就是损失函数。
xgb.train():objective: 默认reg:squarederror
xgb.XGBRegressor() :objective: 默认reg:squarederror
xgb.XGBClassifier() : objective: 默认binary:logistic
reg:squarederror 均方误差,回归时使用
reg:squaredlogerror 均方对数损失,回归时使用
reg:logistic 逻辑回归,二分类时使用
binary:logistic 二分类时候使用的逻辑回归问题,输出为概率
binary:logitraw 二分类时候使用的逻辑回归问题,输出的结果为
binary:hinge 使用支持向量机的损失函数,Hinge Loss,二分类时使用
multi:softmax 使用softmax损失函数,多分类时使用,同时需要设置参数num_class(类别个 数),返回预测的类别(不是概率)
multi:softprob 和softmax一样,但是输出的是ndata*nclass的向量,可以将该向量reshape成 ndata行nclass列的矩阵。每行数据表示样本所属于每个类别的概率
核心点:
如果不指定具体使用哪种objective,函数会根据是回归问题还是分类问题,默认选择相应的损失函数;
如果自行设定objective的类型,其类型需与业务的类型(回归 or 分类)相对应,否则容易报错。
另外,在XGBoost中,还被允许自定义损失函数,具体使用案例可参考:
https://xgboost.readthedocs.io/en/latest/tutorials/custom_metric_obj.html
但由于其内置的损失函数就比较丰富了,通常还是使用这些损失函数就能够满足需求。

eval_metric 模型的评估指标
rmse 回归用,调整后的均方误差
mae 回归用,绝对平均误差
logloss 二分类用,对数损失
mlogloss 多分类用,对数损失 error 分类用,分类误差,等于1-准确率
auc 分类用,AUC面积

base_score 所有实例的初始预测分数
random_state 随机数种子
missing 缺失值的处理
importance_type 输出特征的重要性

四、代码块

#导入库文件和数据集
from sklearn.datasets import load_boston
from xgboost import XGBRegressor
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error,accuracy_score,precision_score, recall_score 
from sklearn.model_selection import train_test_split
import math
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import numpy as np

boston_data = load_boston()
X = boston_data.data
y = boston_data.target

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=420)

n_estimators

# 先粗调n_estimators 
axisx = range(10, 500, 10)
result = []
for i in axisx:
    reg = XGBRegressor(n_estimators = i, random_state = 420)
    result.append(cross_val_score(reg, X_train, y_train, cv=5).mean())

# 可视化看一下
plt.figure(figsize=(20,5))
plt.plot(axisx,result,c="red",label="XGB")
plt.legend()
plt.show()

# 再细调n_estimators 
axisx = range(10, 40, 1)

result = []
for i in axisx:
    reg = XGBRegressor(n_estimators = i, random_state = 420)
    result.append(cross_val_score(reg, X_train, y_train, cv=5).mean())
plt.figure(figsize=(20,5))
plt.plot(axisx,result,c="red",label="XGB")
plt.legend()
plt.show()
# 打印最大result值,及其位置print(axisx[result.index(max(result))],max(result))

learning_rate

axisx = np.arange(0.05, 1, 0.05)
rs = []
te = []
for i in axisx:
    reg = XGBRegressor(n_estimators=180,random_state=420,learning_rate=i, verbosity =0)
    score = cross_val_score(reg, X_train, y_train, cv=5).mean()
    rs.append(score)
print(axisx[rs.index(max(rs))],max(rs))
plt.figure(figsize=(20,5))
plt.plot(axisx,rs,c="green",label="XGB")
plt.legend()
plt.show()

booster

from xgboost import XGBRegressor

for booster in ["gbtree","gblinear","dart"]:
    reg = XGBRegressor(
        n_estimators = 180,
        learning_rate = 0.1,
        random_state = 420,
        booster = booster,
        verbosity= 1
    )
    reg.fit(Xtrain, Ytrain)
    print(booster,":",reg.score(Xtest,Ytest))

objective

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston, load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_boston, load_iris
from xgboost import XGBRegressor

# 看一下在不同情况objective默认的值是什么
xgr = XGBRegressor(
    learning_rate=0.1,
    n_estimators=100,
    random_state = 27,
    verbosity = 0,
#     objective= 'reg:logistic'
)

xgr.fit(Xtrain, Ytrain)
xgr.get_params()['objective'] #'reg:squarederror',回归问题
data = load_iris() # 分类
X = data.data
y = data.target
Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
from xgboost import XGBClassifier

xgbc = XGBClassifier(
    learning_rate=0.1,
    n_estimators=100,
    seed = 27,
    verbosity = 0
)

xgbc.fit(Xtrain, Ytrain)
xgbc.get_params()['objective']  #  'multi:softprob'

eval_metric

import xgboost as xgb
reg = XGBRegressor(
    n_estimators = 20,
    learning_rate = 0.1,
    random_state = 420
)

reg.fit(X_train, y_train,eval_set = [(X_train, y_train), (X_test, y_test)], eval_metric ='mae')
result = reg.evals_result_

  • 16
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AdaptableJobFactory是Quartz中的一个接口,用于动态创建Job实例。在Quartz中,Job的实例是由Scheduler自行实例化并管理的。但是,有时候我们需要在Job运行时动态地创建Job实例,这时候就需要使用AdaptableJobFactory。 AdaptableJobFactory接口中有一个createJobInstance方法,用于创建Job实例。Quartz默认提供了一个SimpleJobFactory,用于创建Job实例。但是SimpleJobFactory只能创建无参构造函数的Job实例,如果我们需要创建有参构造函数的Job实例,则需要自定义AdaptableJobFactory。 以下是一个AdaptableJobFactory的示例代码: ```java public class MyJobFactory implements AdaptableJobFactory { private final AutowireCapableBeanFactory beanFactory; public MyJobFactory(AutowireCapableBeanFactory beanFactory) { this.beanFactory = beanFactory; } @Override public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException { JobDetail jobDetail = bundle.getJobDetail(); Class<? extends Job> jobClass = jobDetail.getJobClass(); try { Job job = beanFactory.createBean(jobClass); beanFactory.autowireBean(job); return job; } catch (Exception e) { throw new SchedulerException("Failed to create job instance", e); } } @Override public Object adapt(Objet obj) throws SchedulerException { if (obj instanceof Job) { return obj; } else if (obj instanceof JobDetail) { JobDetail jobDetail = (JobDetail) obj; Class<? extends Job> jobClass = jobDetail.getJobClass(); try { Job job = beanFactory.createBean(jobClass); beanFactory.autowireBean(job); return job; } catch (Exception e) { throw new SchedulerException("Failed to create job instance", e); } } else { throw new SchedulerException("Unsupported adaptable object"); } } } ``` 在上述代码中,我们自定义了一个MyJobFactory类,实现了AdaptableJobFactory接口。在newJob方法中,我们根据JobDetail中的Job类型创建Job实例,并对实例进行自动注入。在adapt方法中,我们判断传入的对象类型,并根据Job类型创建Job实例并自动注入。 使用自定义的AdaptableJobFactory可以参考以下代码: ```java @Bean public SchedulerFactoryBean schedulerFactoryBean(AutowireCapableBeanFactory beanFactory) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setJobFactory(new MyJobFactory(beanFactory)); return factory; } ``` 在上述代码中,我们将自定义的MyJobFactory实例设置为Scheduler的JobFactory。这样,在Scheduler创建Job实例时,就会使用我们自定义的AdaptableJobFactory。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值