文章目录

  • 一、XGBoost实战
    • 1.xgboost的数据格式
    • 2.参数介绍
    • 3.XGBoost分类
      • 3.1基于XGBoost原生接口的分类
      • 3.2xgboost.train参数介绍
      • 3.3使用sklearn接口的分类—XGBClassifier
    • 4.XGBoost回归
      • 4.1 基于XGBoost原生接口的回归
      • 4.2使用sklearn接口的回归—XGBClassifier
    • 5.XGBoost操作补充
  • 二、XGBoost参数调优
    • 1.参数调优的一般方法
    • 2.XGBoost调参(结合sklearn网格搜索)

一、XGBoost实战

  XGBoost有两大类接口:XGBoost原生接口 和 scikit-learn接口 ,并且XGBoost能够实现分类和回归两种任务。

1.xgboost的数据格式

  XGBoost可以加载多种数据格式的训练数据:

  • libsvm格式的文本数据

    drrain = xgb.DMatrix('train.svm.txt)
    
  • 加载numpy的二维数组

    data = np.random.rand(5,10) # 5行10列数据集
    label = np.random.randint(2, size=5) # 二分类目标值
    dtrain = xgb.DMatrix( data, label=label) # 组成训练集
    
  • XGBoost的二进制缓存文件

    dtrain2 = xgb.DMatrix('train.svm.buffer')
    
  • 将scipy.sparse格式的数据转换为DMatrix

    csr = scipy.sparse.csr_matrix( (dat, (row,col)) )
    dtrain = xgb.DMatrix( csr )
    
  • 将DMatrix格式数据保存为XGBoost的二进制格式,在下次加载时可以提高速度

     dtrain = xgb.DMatrix('train.svm.txt')
    dtrain.save_binary("train.buffer")
    
  • 可以用如下方式来处理DMatrix中的缺失值

    dtrain = xgb.DMatrix( data, label=label, missing = -999.0)
    
  • 当需要给样本设置权重时,可以用到如下方式:

    w = np.random.rand(5,1)
    dtrain = xgb.DMatrix( data, label=label, missing = -999.0, weight=w)
    

2.参数介绍

XGBoost的参数分为三种:

  • 通用参数:(两种类型的booster,因为tree的性能比线性回归好得多,因此我们很少用线性回归。)

    • booster:使用哪个弱学习器训练,默认gbtree,可选gbtree,gblinear 或dart
    • nthread:用于运行XGBoost的并行线程数,默认为最大可用线程数
    • verbosity:打印消息的详细程度。有效值为0(静默),1(警告),2(信息),3(调试)。
    • Tree Booster的参数:
      • eta(learning_rate):learning_rate,在更新中使用步长收缩以防止过度拟合,默认= 0.3,范围:[0,1];典型值一般设置为:0.01-0.2
      • gamma(min_split_loss):默认= 0,分裂节点时,损失函数减小值只有大于等于gamma节点才分裂,gamma值越大,算法越保守,越不容易过拟合,但性能就不一定能保证,需要平衡。范围:[0,∞]
      • max_depth:默认= 6,一棵树的最大深度。增加此值将使模型更复杂,并且更可能过度拟合。范围:[0,∞]
      • min_child_weight:默认值= 1,如果新分裂的节点的样本权重和小于min_child_weight则停止分裂 。这个可以用来减少过拟合,但是也不能太高,会导致欠拟合。范围:[0,∞]
      • max_delta_step:默认= 0,允许每个叶子输出的最大增量步长。如果将该值设置为0,则表示没有约束。如果将其设置为正值,则可以帮助使更新步骤更加保守。通常不需要此参数,但是当类极度不平衡时,它可能有助于逻辑回归。将其设置为1-10的值可能有助于控制更新。范围:[0,∞]
      • subsample:默认值= 1,构建每棵树对样本的采样率,如果设置成0.5,XGBoost会随机选择一半的样本作为训练集。范围:(0,1]
      • sampling_method:默认= uniform,用于对训练实例进行采样的方法。
        • uniform:每个训练实例的选择概率均等。通常将subsample> = 0.5 设置 为良好的效果。
        • gradient_based:每个训练实例的选择概率与规则化的梯度绝对值成正比,具体来说就是g2+λh2\sqrt{g^2+\lambda h^2}g2+λh2​,subsample可以设置为低至0.1,而不会损失模型精度。
      • colsample_bytree:默认= 1,列采样率,也就是特征采样率。范围为(0,1]
      • lambda(reg_lambda):默认=1,L2正则化权重项。增加此值将使模型更加保守。
      • alpha(reg_alpha):默认= 0,权重的L1正则化项。增加此值将使模型更加保守。
      • tree_method:默认=auto,XGBoost中使用的树构建算法。
        • auto:使用启发式选择最快的方法。

          • 对于小型数据集,exact将使用精确贪婪()。
          • 对于较大的数据集,approx将选择近似算法()。它建议尝试hist,gpu_hist,用大量的数据可能更高的性能。(gpu_hist)支持。external memory外部存储器。
        • exact:精确的贪婪算法。枚举所有拆分的候选点。
        • approx:使用分位数和梯度直方图的近似贪婪算法。
        • hist:更快的直方图优化的近似贪婪算法。(LightGBM也是使用直方图算法)
        • gpu_hist:GPU hist算法的实现。
      • scale_pos_weight:控制正负权重的平衡,这对于不平衡的类别很有用。Kaggle竞赛一般设置sum(negative instances) / sum(positive instances),在类别高度不平衡的情况下,将参数设置大于0,可以加快收敛。
      • num_parallel_tree:默认=1,每次迭代期间构造的并行树的数量。此选项用于支持增强型随机森林。
      • monotone_constraints:可变单调性的约束,在某些情况下,如果有非常强烈的先验信念认为真实的关系具有一定的质量,则可以使用约束条件来提高模型的预测性能。(例如params_constrained[‘monotone_constraints’] = “(1,-1)”,(1,-1)我们告诉XGBoost对第一个预测变量施加增加的约束,对第二个预测变量施加减小的约束。)
    • Linear Booster的参数:
      • lambda(reg_lambda):默认= 0,L2正则化权重项。增加此值将使模型更加保守。归一化为训练示例数。
      • alpha(reg_alpha):默认= 0,权重的L1正则化项。增加此值将使模型更加保守。归一化为训练示例数。
      • updater:默认= shotgun。
        • shotgun:基于shotgun算法的平行坐标下降算法。使用“ hogwild”并行性,因此每次运行都产生不确定的解决方案。
        • coord_descent:普通坐标下降算法。同样是多线程的,但仍会产生确定性的解决方案。
      • feature_selector:默认= cyclic。特征选择和排序方法
        • cyclic:通过每次循环一个特征来实现的。
        • shuffle:类似于cyclic,但是在每次更新之前都有随机的特征变换。
        • random:一个随机(有放回)特征选择器。
        • greedy:选择梯度最大的特征。(贪婪选择)
        • thrifty:近似贪婪特征选择(近似于greedy)
      • top_k:要选择的最重要特征数(在greedy和thrifty内)
  • 任务参数(这个参数用来控制理想的优化目标和每一步结果的度量方法。)

    • objective:默认=reg:squarederror,表示最小平方误差。

      • reg:squarederror,最小平方误差。
      • reg:squaredlogerror,对数平方损失。12[log(pred+1)−log(label+1)]2\frac{1}{2}[log(pred+1)-log(label+1)]^221​[log(pred+1)−log(label+1)]2
      • reg:logistic,逻辑回归
      • reg:pseudohubererror,使用伪Huber损失进行回归,这是绝对损失的两倍可微选择。
      • binary:logistic,二元分类的逻辑回归,输出概率。
      • binary:logitraw:用于二进制分类的逻辑回归,逻辑转换之前的输出得分。
      • binary:hinge:二进制分类的铰链损失。这使预测为0或1,而不是产生概率。(SVM就是铰链损失函数)
      • count:poisson –计数数据的泊松回归,泊松分布的输出平均值。
      • survival:cox:针对正确的生存时间数据进行Cox回归(负值被视为正确的生存时间)。
      • survival:aft:用于检查生存时间数据的加速故障时间模型。
      • aft_loss_distribution:survival:aft和aft-nloglik度量标准使用的概率密度函数。
      • multi:softmax:设置XGBoost以使用softmax目标进行多类分类,还需要设置num_class(类数)
      • multi:softprob:与softmax相同,但输出向量,可以进一步重整为矩阵。结果包含属于每个类别的每个数据点的预测概率。
      • rank:pairwise:使用LambdaMART进行成对排名,从而使成对损失最小化。
      • rank:ndcg:使用LambdaMART进行列表式排名,使标准化折让累积收益(NDCG)最大化。
      • rank:map:使用LambdaMART进行列表平均排名,使平均平均精度(MAP)最大化。
      • reg:gamma:使用对数链接进行伽马回归。输出是伽马分布的平均值。
      • reg:tweedie:使用对数链接进行Tweedie回归。
      • 自定义损失函数和评价指标:https://xgboost.readthedocs.io/en/latest/tutorials/custom_metric_obj.html
    • eval_metric:验证数据的评估指标,将根据目标分配默认指标(回归均方根,分类误差,排名的平均平均精度),用户可以添加多个评估指标
      • rmse,均方根误差; rmsle:均方根对数误差; mae:平均绝对误差;mphe:平均伪Huber错误;logloss:负对数似然; error:二进制分类错误率;
      • merror:多类分类错误率; mlogloss:多类logloss; auc:曲线下面积; aucpr:PR曲线下的面积;ndcg:归一化累计折扣;map:平均精度;
    • seed :随机数种子,[默认= 0]。
  • 命令行参数(这里不说了,因为很少用命令行控制台版本)

3.XGBoost分类

3.1基于XGBoost原生接口的分类

from sklearn.datasets import load_iris
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score  # 准确率# 加载样本数据集
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234565)  # 数据集分割# 算法参数
params = {'booster': 'gbtree','objective': 'multi:softmax',  # 回归任务设置为:'objective': 'reg:gamma','num_class': 3,                   # 回归任务没有这个参数'gamma': 0.1,'max_depth': 6,'lambda': 2,'subsample': 0.7,'colsample_bytree': 0.7,'min_child_weight': 3,'silent': 1,'eta': 0.1,'seed': 2021,'nthread': 4,
}dtrain = xgb.DMatrix(X_train, y_train)  # 生成数据集格式
num_rounds = 500
model = xgb.train(params, dtrain, num_rounds)  # xgboost模型训练# 对测试集进行预测
dtest = xgb.DMatrix(X_test)
y_pred = model.predict(dtest)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("accuarcy: %.2f%%" % (accuracy * 100.0))# 显示重要特征
plot_importance(model)
plt.show()

最后结果为Accuracy: 96.67%

3.2xgboost.train参数介绍

xgboost.train(params,dtrain,num_boost_round=10,evals=(),obj=None,feval=None,maximize=False,
early_stopping_rounds=None,evals_result=None,verbose_eval=True,learning_rates=None,xgb_model=None)

3.3使用sklearn接口的分类—XGBClassifier

  与原生接口不同的是,这个可以直接传入numpy数组格式数据

from xgboost.sklearn import XGBClassifier
clf = XGBClassifier(
silent=0 ,#设置成1则没有运行信息输出,最好是设置为0.是否在运行升级时打印消息。
#nthread=4,# cpu 线程数 默认最大
learning_rate= 0.3, # 如同学习率
min_child_weight=1,
# 这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言
#,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。
#这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
max_depth=6, # 构建树的深度,越大越容易过拟合
gamma=0,  # 树的叶子节点上作进一步分区所需的最小损失减少,越大越保守,一般0.1、0.2这样子。
subsample=1, # 随机采样训练样本 训练实例的子采样比
max_delta_step=0,#最大增量步长,我们允许每个树的权重估计。
colsample_bytree=1, # 生成树时进行的列采样
reg_lambda=1,  # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
#reg_alpha=0, # L1 正则项参数
#scale_pos_weight=1, #如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。平衡正负权重
#objective= 'multi:softmax', #多分类的问题 指定学习任务和相应的学习目标
#num_class=10, # 类别数,多分类与 multisoftmax 并用
n_estimators=100, #树的个数
seed=1000 #随机种子
#eval_metric= 'auc'
)
clf.fit(X_train,y_train,eval_metric='auc')
from sklearn.datasets import load_iris
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加载样本数据集
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2021)  # 数据集分割# 训练模型
model = xgb.XGBClassifier(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='multi:softmax')
model.fit(X_train, y_train)# 对测试集进行预测
y_pred = model.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("accuarcy: %.2f%%" % (accuracy * 100.0))# 显示重要特征
plot_importance(model)
plt.show()

最终结果为96.67%

4.XGBoost回归

4.1 基于XGBoost原生接口的回归

import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error# 加载数据集
boston = load_boston()
X, y = boston.data, boston.target# XGBoost训练过程
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)params = {'booster': 'gbtree','objective': 'reg:gamma','gamma': 0.1,'max_depth': 5,'lambda': 3,'subsample': 0.7,'colsample_bytree': 0.7,'min_child_weight': 3,'silent': 1,'eta': 0.1,'seed': 1000,'nthread': 4,
}dtrain = xgb.DMatrix(X_train, y_train)
num_rounds = 300model = xgb.train(params, dtrain, num_rounds)# 对测试集进行预测
dtest = xgb.DMatrix(X_test)
ans = model.predict(dtest)
mse = mean_squared_error(ans, y_test)
print('rmse = %.4f' % mse)
# 显示重要特征
plot_importance(model)
plt.show()

4.2使用sklearn接口的回归—XGBClassifier

import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_bostonboston = load_boston()
X, y = boston.data, boston.target# XGBoost训练过程
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)model = xgb.XGBRegressor(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='reg:gamma')
model.fit(X_train, y_train)# 对测试集进行预测
ans = model.predict(X_test)# 显示重要特征
plot_importance(model)
plt.show()

5.XGBoost操作补充

  在训练完成之后可以保存模型,也可以查看模型的内部结构

 bst.save_model('0001.model')

  导出模型与特征映射

# 导出模型到txt文件,并浏览模型的含义:
bst.dump_model('dump.raw.txt')
# 导出模型和特征映射
bst.dump_model('dump.raw.txt','featmap.txt')

  加载模型

# 加载保存的模型:
bst = xgb.Booster({'nthread': 4})  # init model
bst.load_model('0001.model')  # load data

  设置早停机制

# 设置早停机制(需要设置验证集)
train(..., evals=evals, early_stopping_rounds=10)

  绘制重要性特征图

xgb.plot_importance(bst)

  绘制输出树

# 绘制输出树
xgb.plot_tree(bst, num_trees=2)

  使用xgboost.to_graphviz()将目标树转换为graphviz

xgb.to_graphviz(bst, num_trees=2)

二、XGBoost参数调优

1.参数调优的一般方法

  与GBDT中有相似的方法:

  1. 确定学习速率learning_rate和决策树的数量n_estimators
    我们可以先给其他参数一个初始值

    max_depth=5:这个参数的取值最好在3 ~ 10之间,起始值4 ~ 6之间都是一个不错的选择
    min_child_weight=1:默认值= 1,如果新分裂的节点的样本权重和小于min_child_weight则停止分裂 。这个可以用来减少过拟合,但是也不能太高,会导致欠拟合。
    gamma=0.1:起始值在0 ~ 0.2之间都可以
    subsample=0.8,colsubsample_bytree=0.8:值的范围在0.5 ~ 0.9之间

  2. max_depth,max_child_weight参数调优
    先大范围内粗调参数,在小范围内微调参数
  3. 对gamma参数调参
  4. 调整subsample,colsubsample参数
  5. 正则化因子调参
  6. 降低学习率,增加更多决策树

2.XGBoost调参(结合sklearn网格搜索)

import xgboost as xgb
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_auc_scoreiris = load_iris()
X,y = iris.data,iris.target
col = iris.target_names
train_x, valid_x, train_y, valid_y = train_test_split(X, y, test_size=0.3, random_state=1)   # 分训练集和验证集
parameters = {'max_depth': [5, 10, 15, 20, 25],'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],'n_estimators': [500, 1000, 2000, 3000, 5000],'min_child_weight': [0, 2, 5, 10, 20],'max_delta_step': [0, 0.2, 0.6, 1, 2],'subsample': [0.6, 0.7, 0.8, 0.85, 0.95],'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9],'reg_alpha': [0, 0.25, 0.5, 0.75, 1],'reg_lambda': [0.2, 0.4, 0.6, 0.8, 1],'scale_pos_weight': [0.2, 0.4, 0.6, 0.8, 1]}xlf = xgb.XGBClassifier(max_depth=10,learning_rate=0.01,n_estimators=2000,silent=True,objective='multi:softmax',num_class=3 ,          nthread=-1,gamma=0,min_child_weight=1,max_delta_step=0,subsample=0.85,colsample_bytree=0.7,colsample_bylevel=1,reg_alpha=0,reg_lambda=1,scale_pos_weight=1,seed=0,missing=None)gs = GridSearchCV(xlf, param_grid=parameters, scoring='accuracy', cv=3)
gs.fit(train_x, train_y)print("Best score: %0.3f" % gs.best_score_)
print("Best parameters set: %s" % gs.best_params_ )

参考:

  1. 深入理解XGBoost
  2. XGboost中的cv函数
  3. python机器学习库xgboost——xgboost算法

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论留言!


机器学习—XGBoost实战与调参相关推荐

  1. XGBoost实战与调参优化

    本篇主要内容包括XGBoost的入门教学.调参优化,将之前自己遇到的问题细心的整理一遍:XGBoost参数繁多,所以如果要调参,就一定要知道每个参数的作用于意义,因此本人十分建议在实战之前对XGBoo ...

  2. XGBoost 重要参数(调参使用)

    XGBoost 重要参数(调参使用) 数据比赛Kaggle,天池中最常见的就是XGBoost和LightGBM. 模型是在数据比赛中尤为重要的,但是实际上,在比赛的过程中,大部分朋友在模型上花的时间却 ...

  3. 如何使用hyperopt对xgboost进行自动调参

    本教程重点在于传授如何使用Hyperopt对xgboost进行自动调参.但是这份代码也是我一直使用的代码模板之一,所以在其他数据集上套用该模板也是十分容易的. 同时因为xgboost,lightgbm ...

  4. 机器学习算法总结之XGBoost(下) 实战与调参

    写在前面 XGBoost原理已在前一篇有过说明:机器学习算法总结之XGBoost(上) 本文思路与之前一篇GBDT调参( 基于scikit-learn的梯度提升树GBDT调参学习)思路相同,先遍历xg ...

  5. 加载svr模型_机器学习XGBoost实战,网格搜索自动调参,对比随机森林,线性回归,SVR【完整代码(含注释)+数据集见原文链接】...

    建议:阅读2020.8.7的文章,完全了解GDBT和XGBT的原理. 机器学习- XGBoost,GDBT[过程:决策树,集成学习,随机森林,GDBT,XGBT,LightGBM] 本次实践内容: 数 ...

  6. 随机森林原理_机器学习(29):随机森林调参实战(信用卡欺诈预测)

    点击"机器学习研习社","置顶"公众号 重磅干货,第一时间送达 回复[大礼包]送你机器学习资料与笔记 回顾 推荐收藏>机器学习文章集合:1-20 机器学习 ...

  7. XgBoost使用及调参教程

    Kaggle比赛利器XGBboost 数据,决定了机器学习的上限,而算法,只是逼近这个上限. 简介 如果你的机器学习集成模型表现得不是那么尽如人意,那就使用XGBoost吧.XGBoost算法现在已经 ...

  8. 人工智能框架实战精讲:Keras项目-英文语料的DNN、Word2Vec、CNN、LSTM文本分类实战与调参优化

    Keras项目-英文语料的文本分类实战 一.机器学习模型 1.1 数据简介 1.2 数据读取与预处理 1.3 数据切分与逻辑回归模型构建 二.全连接神经网络模型 2.1 模型训练 2.2 模型结果展示 ...

  9. 使用贝叶斯优化工具实践XGBoost回归模型调参

    0. 关于调参 0.1. 超参数 在机器学习的上下文中,超参数(hyper parameters)是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据.通常情况下,需要对超参数进行优化,给学 ...

  10. 收藏 | 机器学习、深度学习调参手册

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:来自|夕小瑶的卖萌屋   文 | 山竹小果 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开 ...

最新文章

  1. 语音识别、传统语音识别、带权有限转态转换器、深度语音识别、时序分类、CTC解码
  2. android ndk常见的问题及解决的方法
  3. 信息系统项目管理师范围管理
  4. python之路_文件操作解析
  5. 03_pandas布尔索引、isin()筛选、设置值at和iat,loc,reindex、dropna、fillna,isna、求平均值mean、Apply函数、value_counts
  6. Zabbix监控可视化
  7. 解决安装python当中的.whl文件结尾的第三方库
  8. 提交的时候过程很长,出现等待处理效果。
  9. php 查询access数据库操作,php操作access数据库的方法详解
  10. Qt软件开发-Qt编译zlib完成文件压缩解压(win10)
  11. 计算机无法打印图片,为什么电脑打印不了图片 电脑里的图片无法打印处理方法...
  12. fio与iometer
  13. java通过poi转换ppt/pptx内容,输出为PNG图片。
  14. html滚动字幕制作教程,抖音上的字幕怎么弄的?滚动字幕制作方法教程[多图]
  15. 摄像机功能参数:色温和白平衡
  16. Oracle查询某一天数据的SQL语句的几种写法
  17. 如何有效提高生产车间的生产效率呢?
  18. 自己留着用的 .net 图片水印 方法
  19. word参考文献交叉引用的多项引用,改逗号和破折号形式
  20. 应对功能性失衡-农业大健康·万建民:生物营养强化精准扶贫

热门文章

  1. Asp.net页面之间传递参数的几种方法荟萃
  2. 【win10.win7】在win10系统里面安装win7系统(亲测有效,方便快捷,无需自己设置开机启动项)
  3. shell的函数返回值
  4. MS Sql当中 money类型数据使用 Decimal 传输
  5. NSString类中三个用于获取子字符串的方法:
  6. myeclipse注册机,自己生成注册码
  7. PE文件结构及其加载机制(四)
  8. Matplotlib笔记(1)——文字、绘图、背景(颜色对照表)
  9. bzoj2260: 商店购物4349: 最小树形图
  10. Quartz.Net定时任务简单实用(实例)