贝叶斯优化在XGBoost及随机森林中的使用

简介: 本文简单讲解XGBoost和随机森林模型的优缺点,并引入贝叶斯优化去调整模型参数,找到模型参数最优解。

XGBoost和Random-Forest(RF,随机森林)都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性,通过组合各个决策树的输出来进行预测(分类或回归)。而集成学习按照个体学习器的生成方式,可以大致分为两类:一类是个体学习器之间存在强依赖关系,必须串行生成序列的方法;以及个体学习器之间不存在强依赖关系,可同时生成的并行化方法。前者的代表就是XGBoost,后者的代表是Random-Forest。

在这篇文章中,将尝试解释如何使用XGBoost和随机森林这两种非常流行的贝叶斯优化方法,而不仅仅是比较这两种模型的主要优点和缺点。

XGBoost vs Random Forest

XGBoost

XGBoost每次构建一个决策树,每个新树校正由先前训练的决策树产生的错误。

XGBoost应用示例

Addepto公司使用XGBoost模型来解决异常检测问题,例如在监督学习方法中,XGB在这种情况下是非常有用的,因为异常检测数据集通常是非常不平衡,比如手机APP中的用户/消费者交易,能量消耗或用户行为等,这些数据也经常用于推荐模型等训练数据,XGBoost模型在推荐系统中也是经典模型之一。

优点

由于提升树是通过优化目标函数得到的,所以XGB基本上可以用来解决几乎所有可以求导的目标函数,包括排名泊松回归等内容,这是随机森林模型难以实现。

缺点

如果数据中存在噪声,那么XGB模型可能会对过拟合会更为敏感。由于树模型是按顺序建造的,因此训练通常需要花费更长的时间。此外,XGB比随机森林更难调参,XGB通常有三个参数:树的数量,树的深度和学习率。一般而言,构建的每个树通常是浅的。

随机森林

随机森林(RF)使用随机数据样本独立训练每棵树,这种随机性有助于使得模型比单个决策树更健壮。由于这个原因,随机森林算法在训练数据上不太可能出现过拟合现象。

随机森林应用示例

随机森林的差异性已被用于各种应用,例如基于组织标记数据找到患者群$[1]$。 在以下两种情况下,随机森林模型对于这种应用非常实用:

  • 目标是为具有强相关特征的高维问题提供高预测精度;
  • 数据集非常嘈杂,并且包含许多缺失值,例如某些属性是半连续的;

优点

随机森林中的模型参数调整比XGBoost更容易。在随机森林中,只有两个主要参数:每个节点要选择的特征数量和决策树的数量。此外,随机森林比XGB更难出现过拟合现象。

缺点

随机森林算法的主要限制是大量的树使得算法对实时预测的速度变得很慢。对于包含不同级别数的分类变量的数据,随机森林偏向于具有更多级别的属性。

贝叶斯优化

贝叶斯优化是一种优化函数的技术,其评估成本很高$[2]$。它为目标函数构建后验分布,并使用高斯过程回归计算该分布中的不确定性,然后使用采集函数(acquisition function )来决定采样的位置。贝叶斯优化专注于解决问题:

$max(_x∈AF(X))$

超参数的维度($x∈R_d$)一般设置为$d<20$。

通常设置A超矩形($x∈R^d$:$a_i≤x_i≤b_i$)。目标函数是连续的,这是使用高斯过程回归建模所需的。它也缺乏像凹函数或线性函数这类函数,这使得利用这类函数来提高效率的技术徒劳无功。贝叶斯优化由两个主要组成部分组成:用于对目标函数建模的贝叶斯统计模型和用于决定下一步采样的采集函数。

在根据初始空间初始化实验设计的评估目标后,迭代使用这些目标分配N个评估的预算的剩余部分,如下所示:

  1. 观察初始点;
  2. 当$n\leqN$ 时,使用所有可用数据更新后验概率分布,并让$x_n$作为采集函数的最大值时的取值。继续观察$y_n=f(x_n)$ ,增大$n$, 直到循环结束;
  3. 返回一个解决方案:最大的评估点;

通过上述可以总结到,贝叶斯优化是为黑盒无导数全局优化而设计的,在机器学习中调整超参数中是非常受欢迎的。

下面是整个优化的图形做总结:具有后验分布的高斯过程以及观察值和置信区间,以及效用函数(Utility Function),其中最大值表示下一个样本点。

标题图片

由于效用函数的存在,贝叶斯优化在机器学习算法的参数调整方面比网格(grid)或随机搜索技术(random search)更有效,它可以有效地平衡“探索”和“开发”在寻找全局最优中的作用。

实践

为了实现贝叶斯优化,使用Python编写的BayesianOptimization库$[3]$来调整随机森林和XGBoost分类算法的超参数。首先需要通过pip安装它:

pip install bayesian-optimization

现在开始训练模型。首先导入所需要的依赖库:

#Import libraries
import pandas as pd
import numpy as np
from bayes_opt import BayesianOptimization
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import xgboost as xgb

下面定义了一个函数来运行给定数据的贝叶斯优化,以及要优化的函数及其超参数:

#Bayesian optimization
def bayesian_optimization(dataset, function, parameters):
   X_train, y_train, X_test, y_test = dataset
   n_iterations = 5
   gp_params = {"alpha": 1e-4}

   BO = BayesianOptimization(function, parameters)
   BO.maximize(n_iter=n_iterations, **gp_params)

   return BO.max

下面定义了优化函数,即随机森林分类器及其超参数$n\_estimators$,$max\_depth$和$min\_samples\_split$。另外,对给定数据集使用交叉验证获得分数的平均值:

def rfc_optimization(cv_splits):
    def function(n_estimators, max_depth, min_samples_split):
        return cross_val_score(
               RandomForestClassifier(
                   n_estimators=int(max(n_estimators,0)),                                                               
                   max_depth=int(max(max_depth,1)),
                   min_samples_split=int(max(min_samples_split,2)), 
                   n_jobs=-1, 
                   random_state=42,   
                   class_weight="balanced"),  
               X=X_train, 
               y=y_train, 
               cv=cv_splits,
               scoring="roc_auc",
               n_jobs=-1).mean()

    parameters = {"n_estimators": (10, 1000),
                  "max_depth": (1, 150),
                  "min_samples_split": (2, 10)}
    
    return function, parameters

类似地,为XGBoost分类器定义函数和超参数:

def xgb_optimization(cv_splits, eval_set):
    def function(eta, gamma, max_depth):
            return cross_val_score(
                   xgb.XGBClassifier(
                       objective="binary:logistic",
                       learning_rate=max(eta, 0),
                       gamma=max(gamma, 0),
                       max_depth=int(max_depth),                                               
                       seed=42,
                       nthread=-1,
                       scale_pos_weight = len(y_train[y_train == 0])/
                                          len(y_train[y_train == 1])),  
                   X=X_train, 
                   y=y_train, 
                   cv=cv_splits,
                   scoring="roc_auc",
                   fit_params={
                        "early_stopping_rounds": 10, 
                        "eval_metric": "auc", 
                        "eval_set": eval_set},
                   n_jobs=-1).mean()

    parameters = {"eta": (0.001, 0.4),
                  "gamma": (0, 20),
                  "max_depth": (1, 2000)}
    
    return function, parameters

现在,基于选择的分类器,可以对其进行优化并训练模型:

#Train model
def train(X_train, y_train, X_test, y_test, function, parameters):
    dataset = (X_train, y_train, X_test, y_test)
    cv_splits = 4
    
    best_solution = bayesian_optimization(dataset, function, parameters)      
    params = best_solution["params"]

    model = RandomForestClassifier(
             n_estimators=int(max(params["n_estimators"], 0)),
             max_depth=int(max(params["max_depth"], 1)),
             min_samples_split=int(max(params["min_samples_split"], 2)), 
             n_jobs=-1, 
             random_state=42,   
             class_weight="balanced")

    model.fit(X_train, y_train)
    
    return model

作为示例数据,使用来自AdventureWorksDW2017 SQL Server数据库的视图。在该数据库中,根据个人数据,需要预测是否有人购买自行车。这里只给出贝叶斯优化在随机森林算法上的结果:

ITER AUC max_depth min_samples_split n_estimators
1 0.8549 45.88 6.099 34.82
2 0.8606 15.85 2.217 114.3
3 0.8612 47.42 8.694 306.0
4 0.8416 10.09 5.987 563.0
5 0.7188 4.538 7.332 766.7
6 0.8436 100.0 2.0 448.6
7 0.6529 1.012 2.213 315.6
8 0.8621 100.0 10.0 1E + 03
9 0.8431 100.0 2.0 154.1
10 0.653 1.0 2.0 1E + 03
11 0.8621 100.0 10.0 668.3
12 0.8437 100.0 2.0 867.3
13 0.637 1.0 10.0 10.0
14 0.8518 100.0 10.0 10.0
15 0.8435 100.0 2.0 317.6
16 0.8621 100.0 10.0 559.7
17 0.8612 89.86 10.0 82.96
18 0.8616 49.89 10.0 212.0
19 0.8622 100.0 10.0 771.7
20 0.8622 38.33 10.0 469.2
21 0.8621 39.43 10.0 638.6
22 0.8622 83.73 10.0 384.9
23 0.8621 100.0 10.0 936.1
24 0.8428 54.2 2.259 122.4
25 0.8617 99.62 9.856 254.8

从上面的结果可以看到,贝叶斯优化在第23步迭代中找到了最佳参数,在测试数据集上得到0.8622 AUC分数。如果数据样本更多,实验结果可能会更好。优化的随机森林模型具有以下ROC-AUC曲线:

标题图片

在机器学习研究$[4]$中,可以引入一种简单的超参数调整方法——贝叶斯优化,贝叶斯优化比网格或随机搜索策略能更快地找到最优值。

  1. https://www.researchgate.net/publication/225175169
  2. https://en.wikipedia.org/wiki/Bayesian_optimization
  3. https://github.com/fmfn/BayesianOptimization
  4. https://addepto.com/automated-machine-learning-tasks-can-be-improved/

作者信息

文由阿里云开发者社区组织翻译。
文章原标题《XGBoost and Random Forest with Bayesian Optimisation》
作者:Edwin Lisowski
译者:海棠
文章为简译,更为详细的内容,请查看原文

目录
相关文章
|
定位技术
ArcGIS地形起伏度+地形粗糙度+地表切割深度+高程变异系数提取
ArcGIS地形起伏度+地形粗糙度+地表切割深度+高程变异系数提取
20506 0
|
存储 Unix Linux
Linux命令历史记录管理:使用history命令提高工作效率
Linux命令历史记录管理:使用history命令提高工作效率
2461 0
|
安全 网络安全 网络虚拟化
华为ensp模拟器实现通信安全(交换机配置vlan)
华为ensp模拟器,实现vlan隔离,将不同的交换机接口放入不同的vlan步骤以及实现原理, 交换机的access接口与trunk接口的功能以及实现步骤
1505 0
华为ensp模拟器实现通信安全(交换机配置vlan)
|
9月前
|
机器学习/深度学习 算法 数据可视化
Python | 贝叶斯搜索参数优化的XGBoost+SHAP可解释性分析回归预测及可视化算法
本教程将推出Python实现的XGBoost贝叶斯调参+SHAP可解释性分析与可视化,涵盖数据应用、算法原理及SHAP理论,助力SCI论文提升模型可解释性,附完整代码与环境配置指南。
1156 7
阿里云账号注册、云服务器购买、域名备案流程(图文详细教程)
本文详细介绍了2025年阿里云域名备案的全流程,包括注册阿里云账号、企业实名认证、购买服务器、创建域名信息模板、购买域名、域名备案及查询备案号等步骤。通过图文结合的方式,清晰展示了每个环节的操作方法和注意事项,帮助用户顺利完成域名备案。文章强调了域名备案的前提是国内需有一台服务器,并提供了具体配置建议,同时提醒用户注意邮箱验证和短信核验等关键步骤,确保备案顺利通过。
|
11月前
|
机器学习/深度学习 数据采集 传感器
【WOA-CNN-LSTM】基于鲸鱼算法优化深度学习预测模型的超参数研究(Matlab代码实现)
【WOA-CNN-LSTM】基于鲸鱼算法优化深度学习预测模型的超参数研究(Matlab代码实现)
624 0
|
缓存 Ubuntu 编译器
从源码编译安装gdal3.6.2库的操作指南。
以上步骤概要了从源码编译安装GDAL库的基本流程,实际操作中可能会遇到各种配置上的问题。如果在编译或安装过程中遇到错误,通常需要根据终端输出的信息来判断问题所在,并根据需要安装缺失的依赖库,或是调整编译参数解决问题。
808 0
|
机器学习/深度学习 人工智能 自然语言处理
20用于深度学习训练和研究的数据集
无论是图像识别,自然语言处理,医疗保健还是任何其他人工智能领域感兴趣,这些数据集都是非常重要的,所以本文将整理常用且有效的20个数据集。
1332 1
ArcMAP对遥感影像进行波段提取的3种方法
ArcMAP对遥感影像进行波段提取的3种方法
5230 0
|
Ubuntu TensorFlow 算法框架/工具
NVIDIA Triton系列05-安装服务器软件
本文介绍了NVIDIA Triton推理服务器的安装方法,涵盖源代码编译、可执行文件安装及Docker容器部署三种方式。重点讲解了在NVIDIA Jetson AGX Orin设备上的安装步骤,适合Ubuntu 18及以上系统。通过检查HTTP端口状态确认服务器运行正常,为后续客户端软件安装做准备。
1540 0
NVIDIA Triton系列05-安装服务器软件