XGBoost两种使用方法的Python代码详解
方法一:直接使用xgboost库自己的建模流程
import xgboost as xgb
from sklearn.preprocessing import train_test_split
import joblib
def xgb_train_1(df):
""""
# 模型输入的数据格式必须转为DMatrix格式,输出为概率值
"""
x = df.drop("label", axis=1)
y = df["label"]
#划分训练集和测试机集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.3,random_state=32)
# 转为DMatrix格式,这是xgboost的内部数据结构
dtrain = xgb.DMtrix(x_train,label = y_train)
dtest = xgb.DMtrix(x_test, label=y_test)
#设置参数
params = {
"objective":"binary:logistic",#对于二分类问题
"eval_metric":"auc",#用于指定评估指标,可以传递各种评估方法组成的list。常用的评估指标如下:1.‘rmse’,用于回归任务;2.‘mlogloss’,用于多分类任务;3.‘error’,用于二分类任务;4.‘auc’,用于二分类任务
"max_depth":6,#指定树的最大深度,默认值为6,合理的设置可以防止过拟合,推荐的数值为:[3, 5, 6, 7, 9, 12, 15, 17, 25]
"eta / learning_rate":0.3,#XGBoost为了防止过拟合,引入了"Shrinkage"的思想,即不完全信任每个弱学习器学到的残差值。为此需要给每个弱学习器拟合的残差值都乘上取值范围在(0, 1] 的 eta,设置较小的 eta 就可以多学习几个弱学习器来弥补不足的残差.推荐的候选值为:[0.01, 0.015, 0.025, 0.05, 0.1]
"subsample":0.8,#默认值1,指定采样出 subsample * n_samples 个样本用于训练弱学习器。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。 取值在(0, 1)之间,设置为1表示使用所有数据训练弱学习器。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐的候选值为:[0.6, 0.7, 0.8, 0.9, 1]
"colsample_bytree":0.8,#构建弱学习器时,对特征随机采样的比例,默认值为1。推荐的候选值为:[0.6, 0.7, 0.8, 0.9, 1]
"seed / random_state":23,#指定随机数种子。在XGBClassifier与XGBRegressor中,对应参数名为 random_state 。
"booster":"gbtree",#用于指定弱学习器的类型,默认值为 ‘gbtree’,表示使用基于树的模型进行计算。还可以选择为 ‘gblinear’ 表示使用线性模型作为弱学习器。推荐设置为 ‘gbtree’
"gamma":0,#指定叶节点进行分支所需的损失减少的最小值,默认值为0。设置的值越大,模型就越保守。**推荐的候选值为:[0, 0.05 ~ 0.1, 0.3, 0.5, 0.7, 0.9, 1] **
"alpha / reg_alpha":0,#L1正则化权重项,增加此值将使模型更加保守。在XGBClassifier与XGBRegressor中,对应参数名为 reg_alpha 。推荐的候选值为:[0, 0.01~0.1, 1]
"lambda / reg_lambda":0,#L2正则化权重项,增加此值将使模型更加保守。Classifier与XGBRegressor中,对应参数名为 reg_lambda。推荐的候选值为:[0, 0.1, 0.5, 1]
"min_child_weight":1,#指定孩子节点中最小的样本权重和,如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束,默认值为1。推荐的候选值为:[1, 3, 5, 7]
"silent":0#数值型,表示是否输出运行过程的信息,默认值为0,表示打印信息。设置为1时,不输出任何信息。推荐设置为 0 。
#"num_class":2#用于设置多分类问题的类别个数
}
#训练模型
num_rounds = 100
bst = xgb.train(params,dtrain,num_rounds,evals=[(dtrain,'train'),(dtest,'test')])
#保存模型为.m文件
joblib.dump(bst,"model.m")
#加载模型并预测
model = joblib.load("model.m")
y_pred = model.predict(dtest)#预测结果为概率值。
方法二:使用sklearn中的XGBClassifier
import xgboost as xgb
from sklearn.preprocessing import train_test_split
import joblib
def xgb_train_2(df):
x = df.drop("label", axis=1)
y = df["label"]
# 划分训练集和测试机集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=32)
#训练xgboost模型
model = xgb.XGBClassifier(
max_depth = 8,#含义:树的深度,默认值为6,典型值3-10。调参:值越大,越容易过拟合;值越小,越容易欠拟合。
learning_rate = 0.1,#含义:学习率,控制每次迭代更新权重时的步长,默认0.3。调参:值越小,训练越慢。典型值为0.01-0.2。
n_estimators = 200,#总共迭代的次数,即决策树的个数
subsample = 0.8,#含义:训练每棵树时,使用的数据占全部训练集的比例。默认值为1,典型值为0.5-1。调参:防止overfitting。
colsample_bytree=0.8,# 构建弱学习器时,对特征随机采样的比例,默认值为1。推荐的候选值为:[0.6, 0.7, 0.8, 0.9, 1],调参:防止overfitting。
gamma = 1,#惩罚项系数,指定节点分裂所需的最小损失函数下降值。
min_child_weight = 5,#含义:默认值为1,。调参:值越大,越容易欠拟合;值越小,越容易过拟合(值较大时,避免模型学习到局部的特殊样本)。
objective = 'binary:logistic',
random_state = 42
)
model.fit(x_train,y_train)
joblib.dump(model,"model.m")
# 加载模型并预测
model = joblib.load("model.m")
y_pred = model.predict(x_test) # 预测结果为0,1。
y_pred = model.predict_proba(x_test) #预测结果为概率值
使用sklearn中的XGBClassifier的参数详解:(该部分参考xgboost中XGBClassifier()参数详解-CSDN博客)
常规参数
booster
gbtree 树模型做为基分类器(默认)
gbliner 线性模型做为基分类器
silent
silent=0时,输出中间过程(默认)
silent=1时,不输出中间过程
nthread
nthread=-1时,使用全部CPU进行并行运算(默认)
nthread=1时,使用1个CPU进行运算。
scale_pos_weight
正样本的权重,在二分类任务中,当正负样本比例失衡时,设置正样本的权重,模型效果更好。例如,当正负样本比例为1:10时,scale_pos_weight=10。
模型参数
n_estimatores
含义:总共迭代的次数,即决策树的个数
调参:
early_stopping_rounds
含义:在验证集上,当连续n次迭代,分数没有提高后,提前终止训练。
调参:防止overfitting。
max_depth
含义:树的深度,默认值为6,典型值3-10。
调参:值越大,越容易过拟合;值越小,越容易欠拟合。
min_child_weight
含义:默认值为1,。
调参:值越大,越容易欠拟合;值越小,越容易过拟合(值较大时,避免模型学习到局部的特殊样本)。
subsample
含义:训练每棵树时,使用的数据占全部训练集的比例。默认值为1,典型值为0.5-1。
调参:防止overfitting。
colsample_bytree
含义:训练每棵树时,使用的特征占全部特征的比例。默认值为1,典型值为0.5-1。
调参:防止overfitting。
学习任务参数
learning_rate
含义:学习率,控制每次迭代更新权重时的步长,默认0.3。
调参:值越小,训练越慢。
典型值为0.01-0.2。
objective 目标函数
回归任务
reg:linear (默认)
reg:logistic
二分类
binary:logistic 概率
binary:logitraw 类别
多分类
multi:softmax num_class=n 返回类别
multi:softprob num_class=n 返回概率
rank:pairwise
eval_metric
回归任务(默认rmse)
rmse–均方根误差
mae–平均绝对误差
分类任务(默认error)
auc–roc曲线下面积
error–错误率(二分类)
merror–错误率(多分类)
logloss–负对数似然函数(二分类)
mlogloss–负对数似然函数(多分类)gamma
惩罚项系数,指定节点分裂所需的最小损失函数下降值。
调参:
alpha
L1正则化系数,默认为1
lambda
L2正则化系数,默认为1
作者:是妖怪啊