贝叶斯全局优化(LightGBM调参)

本文介绍了如何结合Kaggle比赛数据集,利用贝叶斯全局优化和高斯过程来调优LightGBM模型。通过定义黑盒函数`LGB_bayesian`,设置参数边界,然后使用`BayesianOptimization`库寻找最佳参数。经过优化,模型在5折交叉验证中获得了0.90的AUC。

  这里结合Kaggle比赛的一个数据集,记录一下使用贝叶斯全局优化和高斯过程来寻找最佳参数的方法步骤。

  1.安装贝叶斯全局优化库

  从pip安装最新版本

  pip install bayesian-optimization

  2.加载数据集

  import pandas as pd

  import numpy as np

  from sklearn.model_selection import StratifiedKFold

  from scipy.stats import rankdata

  from sklearn import metrics

  import lightgbm as lgb

  import warnings

  import gc

  pd.set_option('display.max_columns', 200)

  train_df = pd.read_csv('../input/train.csv')

  test_df = pd.read_csv('../input/test.csv')

  目标变量的分布

  target = 'target'

  predictors = train_df.columns.values.tolist()[2:]

  train_df.target.value_counts()

  

在这里插入图片描述

  问题是不平衡。这里使用50%分层行作为保持行,以便验证集获得最佳参数。 稍后将在最终模型拟合中使用5折交叉验证。

  bayesian_tr_index, bayesian_val_index = list(StratifiedKFold(n_splits=2,

  shuffle=True, random_state=1).split(train_df, train_df.target.values))[0]

  这些bayesian_tr_index和bayesian_val_index索引将用于贝叶斯优化,作为训练和验证数据集的索引。

  3.黑盒函数优化(LightGBM)

  在加载数据时,为LightGBM创建黑盒函数以查找参数。

  def LGB_bayesian(

  num_leaves, # int

  min_data_in_leaf, # int

  learning_rate,

  min_sum_hessian_in_leaf, # int

  feature_fraction,

  lambda_l1,

  lambda_l2,

  min_gain_to_split,

  max_depth):

  # LightGBM expects next three parameters need to be integer. So we make them integer

  num_leaves = int(num_leaves)

  min_data_in_leaf = int(min_data_in_leaf)

  max_depth = int(max_depth)

  assert type(num_leaves) == int

  assert type(min_data_in_leaf) == int

  assert type(max_depth) == int

  param = {

  'num_leaves': num_leaves,

  'max_bin': 63,

  'min_data_in_lea

### 使用 Optuna 进行贝叶斯优化调参 #### 超参数优化的重要性 超参数的选择对于机器学习模型的表现至关重要。使用专门的超参数优化库能够更高效地进行超参数,提供多种优化方法和工具,帮助用户快速找到最的超参数组合[^2]。 #### Optuna 的势 Optuna 是一种先进的超参数优化框架,它不仅支持传统的随机搜索和网格搜索,还特别擅长利用贝叶斯优化技术来提高搜索效率。这种基于贝叶斯的方法允许 Optuna 动态整采样策略,从而更快地收敛到全局解附近[^1]。 #### 基本流程概述 为了实现高效的贝叶斯优化,需遵循几个关键步骤: - **定义目标函数**:创建一个返回损失值的目标函数,该函数接受一组超参数作为输入并输出相应的评价指标。 - **指定搜索空间**:明确各个待优化超参数的具体取值范围及其分布特性(连续型、离散型等),这决定了后续探索的方向与边界条件。 - **启动优化过程**:用 `study.optimize()` 方法执行实际的寻操作,在此期间系统将持续尝试不同的配置直至满足预设终止准则为止。 下面给出一段完整的 Python 示例代码展示如何应用上述原则完成一次典型的超参数优化任务: ```python import optuna from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split, cross_val_score from lightgbm import LGBMClassifier def objective(trial): data = load_breast_cancer() X_train, X_valid, y_train, y_valid = train_test_split( data.data, data.target, test_size=0.25, random_state=42) param_grid = { 'n_estimators': trial.suggest_int('n_estimators', 50, 500), 'max_depth': trial.suggest_categorical('max_depth', [None, *range(3, 9)]), 'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.3), 'num_leaves': trial.suggest_int('num_leaves', 20, 80) } model = LGBMClassifier(**param_grid) score = cross_val_score(model, X_train, y_train, cv=5).mean() return score if __name__ == "__main__": study = optuna.create_study(direction='maximize') study.optimize(objective, n_trials=100) print(f'Best parameters found:\n{study.best_params}') ``` 这段脚本展示了怎样借助 Optuna 来寻找 LightGBM 分类器的最佳超参数设置。这里选择了四个重要的超参数——`n_estimators`, `max_depth`, `learning_rate` 及 `num_leaves`—并通过交叉验证的方式评估每组候选方案的好坏程度。最终得到的结果即为能使平均精度达到最高的那一套参数组合[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值