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

作者:是妖怪啊

物联沃分享整理
物联沃-IOTWORD物联网 » XGBoost两种使用方法的Python代码详解

发表回复