乐趣区

具有贝叶斯优化的XGBoost和随机森林

作者 | Edwin Lisowski
编译 | CDA 数据分析师

在这篇文章中,我们将介绍带有贝叶斯优化算法的两种流行的算法即 XGBoost 和随机森林,并指出这些算法的优缺点。XGBoost(XGB)和随机森林(RF)都是集成学习方法,并通过组合各个决策树的输出(我们假设基于树的 XGB 或 RF)来预测(分类或回归)。

让我们深入比较一下 – XGBoost 与 Random Forest

XGBoost 或 Gradient Boosting

XGBoost 每次构建一个决策树,每一个新的树都修正以前训练过的决策树所产生的错误。

XGBoost 应用程序的示例

在 Addepto,我们使用 XGBoost 模型来解决异常检测问题,例如在监督学习方法中。在这种情况下,XGB 非常有用,因为数据集通常非常不平衡。此类数据集的示例是移动应用中的用户 / 消费者交易,能量消耗或用户行为。

优点

由于通过优化目标函数导出了增强树,基本上 XGB 可以用来解决几乎所有可以写出渐变的目标函数。这包括排名和泊松回归等内容,RF 难以实现。

缺点

如果数据有噪声,XGB 模型对过度拟合更敏感。由于树木是按顺序建造的,因此培训通常需要更长时间。GBM 比 RF 更难调整。通常有三个参数:树的数量,树的深度和学习率,并且构建的每个树通常是浅的。

随机森林

随机森林(RF)使用随机数据样本独立训练每棵树。这种随机性有助于使模型比单个决策树更健壮。由于 RF 不太可能过度拟合训练数据。

随机森林应用示例

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

我们的目标是为具有强相关特征的高维问题提供高预测精度。

我们的数据集非常嘈杂,并且包含许多缺失值,例如,某些属性是分类或半连续的。

优点

随机森林中的模型调整比 XGBoost 更容易。在 RF 中,我们有两个主要参数:每个节点要选择的特征数量和决策树的数量。RF 比 XGB 更难装配。

缺点

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

贝叶斯优化是一种优化功能的技术,其评估成本很高。它建立目标函数的后验分布,并使用高斯过程回归计算该分布中的不确定性,然后使用获取函数来决定采样的位置。贝叶斯优化专注于解决问题:

max f(x)(x∈A)

超参数的尺寸(x∈Rd)经常在最成功的应用 d <20。

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

据初始空间填充实验设计评估目标后,它们被迭代地用于分配 N 个评估的预算的剩余部分,如下所示:

  1. 观察初始点
  2. 当 n≤N 时执行,使用所有可用的数据更新后验概率分布
  • 设 Xn 是采集功能的最大化
  • 观察 yn= f(xn)
  1. 返回一个解决方案:用最大的评估点

我们可以说贝叶斯优化是为黑盒无导数全局优化而设计来总结这个问题。它在机器学习中调整超参数非常受欢迎。

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

由于效用函数,贝叶斯优化在调整机器学习算法的参数方面比网格或随机搜索技术更有效。它可以有效地平衡“探索”和“利用”,找到全局最优。

为了呈现贝叶斯优化,我们使用用 Python 编写的 BayesianOptimization 库来调整随机森林和 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

我们定义了一个函数来运行贝叶斯优化给定数据,优化函数及其超参数:

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,maxdepth 和 minsamplessplit。另外,我们使用给定数据集上的交叉验证分数的平均值:

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 数据库的视图 [dbo].[vTargetMail] 作为示例数据,我们可以依据个人数据预测人们是否购买自行车。作为贝叶斯优化的结果,我们提取出了连续样本:

我们可以看到贝叶斯优化在第 23 步中找到了最佳参数,在测试数据集上得出 0.8622 AUC 分数。如果要检查更多样品,这个结果可能会更高。我们优化的随机森林模型具有以下 ROC AUC 曲线:

我们提出了一种使用贝叶斯优化在机器学习中调整超参数的简单方法,贝叶斯优化是一种更快的方法,可以找到最优值,而且比网格或随机搜索方法更先进。


搜索进入小程序,解锁更多精彩资讯和优质内容,不要错过哟!

退出移动版