赞
踩
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_
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。