【机器学习】sklearn中xgboost模块的XGBClassifier函数【分类问题】

4,191 阅读9分钟

参考网址

blog.csdn.net/levy_cui/ar…

objective参数的取值

XGBoost的`objective`参数用于指定学习任务及相应的学习目标,其取值非常丰富,覆盖了多种不同的机器学习问题。以下是一些常见的`objective`参数取值及其应用场景:
  1. 回归问题

    • reg:linear:线性回归,这是回归问题的默认选项。
    • reg:squarederror:另一种表示线性回归的方式,与reg:linear效果相同,但在某些上下文中可能更直观地表示平方误差作为损失函数。
    • reg:squaredlogerror:对数的平方误差回归,适用于预测值范围变化很大,使用对数变换可以使误差更加稳定的情况。
    • reg:logistic:虽然名字包含“logistic”,但它实际上在XGBoost中通常不用作回归问题的目标函数,而是用于二分类的逻辑回归。
  2. 二分类问题

    • binary:logistic:二分类的逻辑回归问题,输出为预测为正类的概率。
    • binary:logitraw:二分类的逻辑回归问题,但输出的是线性预测值(即未经sigmoid函数转换的原始分数)。
  3. 多分类问题

    • multi:softmax:使用softmax的多分类器,需要设置num_class(类别数目)参数,输出预测的类别标签。
    • multi:softprob:与multi:softmax类似,但输出的是每个数据属于各个类别的概率,形式为ndata * nclass的向量,可以将其reshape成ndata行nclass列的矩阵。
  4. 排序问题

    • rank:pairwise:通过最小化成对损失进行排序。
  5. 计数问题

    • count:poisson:计数问题的Poisson回归,输出结果为Poisson分布。
  6. 其他

    • XGBoost还支持一些其他的objective参数,如自定义的损失函数等,但这些通常需要根据具体的应用场景和需求进行选择和实现。

前言

我们都知道,xgboost算法有2大类接口。
一个是陈天奇团队开发的原生接口xgboost。
另一个是和sklearn配合使用的接口
本文,是讲解sklearn接口中的分类函数XGBClassifier。

常规参数

  • booster

    • gbtree 树模型做为基分类器(默认),及弱学习器的类型,这里默认是cart分类回归决策树
    • 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次迭代,分数没有提高后,提前终止训练。
    •     这里的n次就是early_stopping_rounds值。
      
    • 调参:防止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

    • 分类任务(默认error)

      • auc--roc曲线下面积
      • error--错误率(二分类)
      • merror--错误率(多分类)
      • logloss--负对数似然函数(二分类)
      • mlogloss--负对数似然函数(多分类)
    • 回归任务(默认rmse)

      • rmse--均方根误差
      • mae--平均绝对误差
  • gamma

    • 惩罚项系数,指定节点分裂所需的最小损失函数下降值。
    • 调参:
  • alpha

    • L1正则化系数,默认为1
  • lambda

    • L2正则化系数,默认为1

 

代码主要函数:

-   载入数据:load_digits()
-   数据拆分:train_test_split()
-   建立模型:XGBClassifier()
-   模型训练:fit()
-   模型预测:predict()
-   性能度量:accuracy_score()
-   特征重要性:plot_importance()

demo

# -*- coding: utf-8 -*-

# load module
from xgboost.sklearn import XGBClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from xgboost import plot_importance
import matplotlib.pyplot as plt

# load datasets
data = datasets.load_digits()
print(data.data)
print(data.target)

# data analysis
print(data.data.shape)
print(data.target.shape)

# data split
x_train, x_test, y_train, y_test = train_test_split(data.data,
                                                    data.target,
                                                    test_size=0.3,
                                                    random_state=33)
                                                    
# 建立模型
xgb_class_model = XGBClassifier(learning_rate=0.1,
                      n_estimators=1000,  # 树的个数--1000棵树建立xgboost
                      max_depth=6,  # 树的深度
                      min_child_weight=1,  # 叶子节点最小权重
                      gamma=0.,  # 惩罚项中叶子结点个数前的参数
                      subsample=0.8,  # 随机选择80%样本建立决策树
                      colsample_btree=0.8,  # 随机选择80%特征建立决策树
                      objective='multi:softmax',  # 指定目标函数,多分类
                      scale_pos_weight=1,  # 解决样本个数不平衡的问题
                      random_state=27  # 随机数
                      )
# 训练模型
xgb_class_model.fit(x_train,
                    y_train,
                    eval_set=[(x_test, y_test)],
                    eval_metric="mlogloss",
                    early_stopping_rounds=10,
                    verbose=True)


# plot feature importance
fig, ax = plt.subplots(figsize=(15, 15))
plot_importance(model,
                height=0.5,
                ax=ax,
                max_num_features=64)
plt.show()

# make prediction for test data
y_pred = xgb_class_model.predict(x_test)  
# 这里是直接给出类型,predict_proba()函数是给出属于每个类别的概率。

# model evaluate
accuracy = accuracy_score(y_test, y_pred)
print("accuarcy: %.2f%%" % (accuracy * 100.0))

objective参数

在XGBoost算法中,`objective`参数是`xgboost.train()`函数或XGBoost的Sklearn接口(如`XGBRegressor``XGBClassifier`等)的入参之一。
它用于指定学习任务及相应的学习目标。

objective参数的作用

objective参数决定了XGBoost的预测目标,即模型是用于回归、分类还是其他类型的任务。
根据任务的不同,`objective`可以设置为不同的值,这些值对应了不同的损失函数和评估标准。

常见的objective参数值

以下是一些常见的`objective`参数值及其对应的用途:
  • reg:linear:线性回归,适用于回归任务,默认输出预测值。
  • reg:logistic:逻辑回归,虽然名为逻辑回归,但实际上是用于二分类问题的概率输出,不是直接用于回归任务。
  • binary:logistic:二分类的逻辑回归问题,输出为概率。
  • binary:logitraw:二分类的逻辑回归问题,输出的结果为线性预测值(即wTx)。
  • multi:softmax:多分类问题,使用softmax目标函数,需要设置num_class(类别个数)参数。
  • multi:softprob:与multi:softmax类似,但输出的是每个类别的概率,结果是一个n行k列的矩阵,其中n是样本数,k是类别数。
  • count:poisson:计数问题的poisson回归,输出结果为poisson分布。

在XGBoost的原生API中

 `objective`参数是`xgboost.train()`函数的入参之一,你需要在训练模型之前设置它。
 例如:
 param = {'objective': 'binary:logistic', 
          'max_depth': 5,
          'eta': 0.1}  
 bst = xgb.train(param, dtrain, num_boost_round=100)
 

在XGBoost的Sklearn接口中

`objective`参数通常通过其他参数或直接在类实例化时指定。
然而,在Sklearn接口中,`objective`参数通常被其他更直观的参数所替代,
如`XGBClassifier``objective`参数实际上是通过设置`eval_metric`和类的其他属性来隐式指定的。

但在某些版本的XGBoost中,Sklearn接口仍然支持通过`objective`参数直接设置,但更常见的做法是使用`XGBClassifier``XGBRegressor`等类的`eval_metric`参数来指定评估指标,
并通过类的其他属性(如`use_label_encoder``n_estimators`等)来配置模型。

注意事项

在使用XGBoost时,建议查阅最新的官方文档或源码,以了解`objective`参数及其相关参数的最新用法和默认值。
不同的`objective`值可能需要配合其他参数(如`eval_metric``num_class`等)一起使用,以达到最佳效果。
在实际应用中,选择合适的`objective`参数对于模型的性能和准确性至关重要。

在XGBoost算法中,objective参数和scoring参数的作用和传入方式有所不同,它们并不总是需要同时传入。以下是对这两个参数的详细解释:

objective参数

  • 作用objective参数用于指定学习任务及相应的学习目标。它决定了XGBoost模型的预测类型(如回归、分类)以及使用的损失函数。
  • 传入方式:在XGBoost的原生API(如xgboost.train()函数)或Sklearn接口(如XGBRegressorXGBClassifier等)中,objective参数通常在模型训练之前被设置。在Sklearn接口中,虽然有时可能不直接通过objective参数来设置(因为Sklearn接口提供了更直观的参数来控制这些设置),但模型的行为仍然受到等价于objective参数设置的影响。

scoring参数

  • 作用scoring参数主要用于模型评估阶段,特别是在交叉验证(如使用GridSearchCVcross_val_score等函数)时。它指定了用于评估模型性能的度量标准。
  • 传入方式scoring参数通常与模型评估或参数调优函数(如GridSearchCV)一起使用,而不是直接作为XGBoost模型训练函数的参数。在Sklearn中,scoring参数允许用户指定一个或多个评分字符串,这些字符串对应于Sklearn中定义的评分函数。

是否需要同时传入

  • 一般情况objectivescoring参数不需要同时传入。objective参数在模型训练时设置,用于指定模型的预测目标和损失函数;而scoring参数在模型评估或参数调优时设置,用于指定评估模型性能的度量标准。
  • 特殊情况:在某些情况下,如果用户在训练XGBoost模型后直接进行模型评估,并且希望使用与objective设置相对应的评估指标,那么可以(但不是必须)在评估时设置与objective相匹配的scoring参数。然而,这主要取决于用户的具体需求和评估场景。

结论

综上所述,objectivescoring参数在XGBoost算法中各自扮演不同的角色,通常不需要同时传入。objective参数在模型训练时设置,用于指定学习任务和损失函数;而scoring参数在模型评估或参数调优时设置,用于指定评估模型性能的度量标准。