返回顶部
首页 > 资讯 > 精选 >LightGBM调参贝叶斯全局优化方法是什么
  • 197
分享到

LightGBM调参贝叶斯全局优化方法是什么

2023-06-02 04:06:41 197人浏览 薄情痞子
摘要

这篇文章主要介绍“LightGBM调参贝叶斯全局优化方法是什么”,在日常操作中,相信很多人在LightGBM调参贝叶斯全局优化方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LightGBM调参贝叶斯

这篇文章主要介绍“LightGBM调参贝叶斯全局优化方法是什么”,在日常操作中,相信很多人在LightGBM调参贝叶斯全局优化方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LightGBM调参贝叶斯全局优化方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

  这里结合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()

LightGBM调参贝叶斯全局优化方法是什么

  问题是不平衡。这里使用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_leaf': min_data_in_leaf,

  'learning_rate': learning_rate,

  'min_sum_hessian_in_leaf': min_sum_hessian_in_leaf,

  'bagging_fraction': 1.0,

  'bagging_freq': 5,

  'feature_fraction': feature_fraction,

  'lambda_l1': lambda_l1,

  'lambda_l2': lambda_l2,

  'min_gain_to_split': min_gain_to_split,

  'max_depth': max_depth,

  'save_binary': True,

  'seed': 1337,

  'feature_fraction_seed': 1337,

  'bagging_seed': 1337,

  'drop_seed': 1337,

  'data_random_seed': 1337,

  'objective': 'binary',

  'boosting_type': 'gbdt',

  'verbose': 1,

  'metric': 'auc',

  'is_unbalance': True,

  'boost_from_average': False,

  }

  xg_train = lgb.Dataset(train_df.iloc[bayesian_tr_index][predictors].values,

  label=train_df.iloc[bayesian_tr_index][target].values,

  feature_name=predictors,

  free_raw_data = False

  )

  xg_valid = lgb.Dataset(train_df.iloc[bayesian_val_index][predictors].values,

  label=train_df.iloc[bayesian_val_index][target].values,

  feature_name=predictors,

  free_raw_data = False

  )

  num_round = 5000

  clf = lgb.train(param, xg_train, num_round, valid_sets = [xg_valid], verbose_eval=250, early_stopping_rounds = 50)

  predictions = clf.predict(train_df.iloc[bayesian_val_index][predictors].values, num_iteration=clf.best_iteration)

  score = metrics.roc_auc_score(train_df.iloc[bayesian_val_index][target].values, predictions)

  return score

  上面的LGB_bayesian函数将作为贝叶斯优化的黑盒函数。 我已经在LGB_bayesian函数中为LightGBM定义了trainng和validation数据集。

  LGB_bayesian函数从贝叶斯优化框架获取num_leaves,min_data_in_leaf,learning_rate,min_sum_hessian_in_leaf,feature_fraction,lambda_l1,lambda_l2,min_gain_to_split,max_depth的值。 请记住,对于LightGBM,num_leaves,min_data_in_leaf和max_depth应该是整数。 但贝叶斯优化会发送连续的函数。 所以我强制它们是整数。 我只会找到它们的最佳参数值。 读者可以增加或减少要优化的参数数量。

  现在需要为这些参数提供边界,以便贝叶斯优化仅在边界内搜索。

  bounds_LGB = {

  'num_leaves': (5, 20),

  'min_data_in_leaf': (5, 20),

  'learning_rate': (0.01, 0.3),

  'min_sum_hessian_in_leaf': (0.00001, 0.01),

  'feature_fraction': (0.05, 0.5),

  'lambda_l1': (0, 5.0),

  'lambda_l2': (0, 5.0),

  'min_gain_to_split': (0, 1.0),

  'max_depth':(3,15),

  }

  让我们将它们全部放在BayesianOptimization对象中

  from bayes_opt import BayesianOptimization

  LGB_BO = BayesianOptimization(LGB_bayesian, bounds_LGB, random_state=13)

  现在,让我们来优化key space (parameters):

  print(LGB_BO.space.keys)

LightGBM调参贝叶斯全局优化方法是什么

  我创建了BayesianOptimization对象(LGB_BO),在调用maxime之前它不会工作。在调用之前,解释一下贝叶斯优化对象(LGB_BO)的两个参数,我们可以传递给它们进行最大化:

  init_points:我们想要执行的随机探索的初始随机运行次数。 在我们的例子中,LGB_bayesian将被运行n_iter次。

  n_iter:运行init_points数后,我们要执行多少次贝叶斯优化运行。

  现在,是时候从贝叶斯优化框架调用函数来最大化。 我允许LGB_BO对象运行5个init_points和5个n_iter。

  init_points = 5

  n_iter = 5

  print('-' * 130)

  with warnings.catch_warnings():

  warnings.filterwarnings('ignore')

  LGB_BO.maximize(init_points=init_points, n_iter=n_iter, acq='ucb', xi=0.0, alpha=1e-6)

  优化完成后,让我们看看我们得到的最大值是多少。

  LGB_BO.max['target']

LightGBM调参贝叶斯全局优化方法是什么

  参数的验证AUC是0.89, 让我们看看参数:

  LGB_BO.max['params']

  现在我们可以将这些参数用于我们的最终模型!

  BayesianOptimization库中还有一个很酷的选项。 你可以探测LGB_bayesian函数,如果你对最佳参数有所了解,或者您从其他kernel获取参数。 我将在此复制并粘贴其他内核中的参数。 你可以按照以下方式进行探测:

  LGB_BO.probe(

  params={'feature_fraction': 0.1403,

  'lambda_l1': 4.218,

  'lambda_l2': 1.734,

  'learning_rate': 0.07,

  'max_depth': 14,

  'min_data_in_leaf': 17,

  'min_gain_to_split': 0.1501,

  'min_sum_hessian_in_leaf': 0.000446,

  'num_leaves': 6},

  lazy=True, #

  )

  好的,默认情况下这些将被懒惰地探索(lazy = True),这意味着只有在你下次调用maxime时才会评估这些点。 让我们对LGB_BO对象进行最大化调用。

  LGB_BO.maximize(init_points=0, n_iter=0) # remember no init_points or n_iter

  最后,通过属性LGB_BO.res可以获得探测的所有参数列表及其相应的目标值。

  for i, res in enumerate(LGB_BO.res):

  print("Iteration {}: \n\t{}".fORMat(i, res))

  我们在调查中获得了更好的验证分数!和以前一样,我只运行LGB_BO 10次。在实践中,我将它增加到100。

  LGB_BO.max['target']

  LGB_BO.max['params']

  让我们一起构建一个模型使用这些参数。

  4.训练LightGBM模型

  param_lgb = {

  'num_leaves': int(LGB_BO.max['params']['num_leaves']), # remember to int here

  'max_bin': 63,

  'min_data_in_leaf': int(LGB_BO.max['params']['min_data_in_leaf']), # remember to int here

  'learning_rate': LGB_BO.max['params']['learning_rate'],

  'min_sum_hessian_in_leaf': LGB_BO.max['params']['min_sum_hessian_in_leaf'],

  'bagging_fraction': 1.0,

  'bagging_freq': 5,

  'feature_fraction': LGB_BO.max['params']['feature_fraction'],

  'lambda_l1': LGB_BO.max['params']['lambda_l1'],

  'lambda_l2': LGB_BO.max['params']['lambda_l2'],

  'min_gain_to_split': LGB_BO.max['params']['min_gain_to_split'],

  'max_depth': int(LGB_BO.max['params']['max_depth']), # remember to int here

  'save_binary': True,

  'seed': 1337,

  'feature_fraction_seed': 1337,

  'bagging_seed': 1337,

  'drop_seed': 1337,

  'data_random_seed': 1337,

  'objective': 'binary',

  'boosting_type': 'gbdt',

  'verbose': 1,

  'metric': 'auc',

  'is_unbalance': True,

  'boost_from_average': False,

  }

  如您所见,我将LGB_BO的最佳参数保存到param_lgb字典中,它们将用于训练5折的模型。

  Kfolds数量:无锡妇科检查医院 Http://www.87554006.com/

  nfold = 5

  gc.collect()

  skf = StratifiedKFold(n_splits=nfold, shuffle=True, random_state=2019)

  oof = np.zeros(len(train_df))

  predictions = np.zeros((len(test_df),nfold))

  i = 1

  for train_index, valid_index in skf.split(train_df, train_df.target.values):

  print("\nfold {}".format(i))

  xg_train = lgb.Dataset(train_df.iloc[train_index][predictors].values,

  label=train_df.iloc[train_index][target].values,

  feature_name=predictors,

  free_raw_data = False

  )

  xg_valid = lgb.Dataset(train_df.iloc[valid_index][predictors].values,

  label=train_df.iloc[valid_index][target].values,

  feature_name=predictors,

  free_raw_data = False

  )

  clf = lgb.train(param_lgb, xg_train, 5000, valid_sets = [xg_valid], verbose_eval=250, early_stopping_rounds = 50)

  oof[valid_index] = clf.predict(train_df.iloc[valid_index][predictors].values, num_iteration=clf.best_iteration)

  predictions[:,i-1] += clf.predict(test_df[predictors], num_iteration=clf.best_iteration)

  i = i + 1

  print("\n\nCV AUC: {:<0.2f}".format(metrics.roc_auc_score(train_df.target.values, oof)))

  所以我们在5折交叉验证中获得了0.90 AUC。

  让我们对5折预测进行排名平均。

  5.排名平均值

  print("Rank averaging on", nfold, "fold predictions")

  rank_predictions = np.zeros((predictions.shape[0],1))

  for i in range(nfold):

  rank_predictions[:, 0] = np.add(rank_predictions[:, 0], rankdata(predictions[:, i].reshape(-1,1))/rank_predictions.shape[0])

  rank_predictions /= nfold

  6.提交

  sub_df = pd.DataFrame({"ID_code": test_df.ID_code.values})

  sub_df["target"] = rank_predictions

  sub_df.to_csv("Customer_Transaction_rank_predictions.csv", index=False)

到此,关于“LightGBM调参贝叶斯全局优化方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: LightGBM调参贝叶斯全局优化方法是什么

本文链接: https://lsjlt.com/news/228820.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • LightGBM调参贝叶斯全局优化方法是什么
    这篇文章主要介绍“LightGBM调参贝叶斯全局优化方法是什么”,在日常操作中,相信很多人在LightGBM调参贝叶斯全局优化方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LightGBM调参贝叶斯...
    99+
    2023-06-02
  • hadoop参数调优的方法是什么
    这篇文章主要介绍“hadoop参数调优的方法是什么”,在日常操作中,相信很多人在hadoop参数调优的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”hadoop参数调优的方法是什么”的疑惑有所帮助!...
    99+
    2023-06-03
  • JVM常用参数调优方法是什么
    本篇内容介绍了“JVM常用参数调优方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对于调优这个事情来说,一般就是三个过程:性能监控:...
    99+
    2023-06-02
  • Java调优的方法是什么
    本篇内容介绍了“Java调优的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 应用性能优化是一个老生常谈的话题,典型的性能...
    99+
    2023-06-15
  • java jvm调优的方法是什么
    Java虚拟机(JVM)调优是通过优化Java应用程序的运行时环境来提高性能和吞吐量的过程。以下是一些常见的JVM调优方法:1. 增...
    99+
    2023-10-10
    java jvm
  • MySQL优化的方法是什么
    这篇文章主要介绍“MySQL优化的方法是什么”,在日常操作中,相信很多人在MySQL优化的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL优化的方法是什么”...
    99+
    2024-04-02
  • MySQL SQL优化方法是什么
    这篇文章主要讲解了“MySQL SQL优化方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL SQL优化方法是什么”吧!slowlog里查到...
    99+
    2024-04-02
  • sparksql优化的方法是什么
    SparkSQL优化的方法有以下几种: 数据分区:根据数据的特点和查询的需求,将数据划分成多个分区。这样可以提高查询的性能,因为...
    99+
    2023-10-22
    sparksql
  • Tomcat全局或局部https访问配置方法是什么
    Tomcat全局或局部https访问配置方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Tomcat全局/局部https访问配置方法一、全局https访问在Tomc...
    99+
    2023-06-04
  • jvm性能调优的方法是什么
    JVM性能调优的方法包括以下几个方面:1. 内存调优:通过调整JVM的堆内存大小(-Xmx和-Xms参数)来优化内存使用效率,避免过...
    99+
    2023-10-10
    jvm
  • CDH集群调优的方法是什么
    本文小编为大家详细介绍“CDH集群调优的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“CDH集群调优的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。DRF和相关参数DRF: Dominant...
    99+
    2023-06-03
  • Spark内存调优的方法是什么
    这篇文章主要介绍“Spark内存调优的方法是什么”,在日常操作中,相信很多人在Spark内存调优的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spark内存调优的方法是什么”的疑惑有所帮助!接下来...
    99+
    2023-07-05
  • jvm内存调优的方法是什么
    JVM内存调优的方法有以下几种: 调整堆内存大小:可以通过设置-Xmx和-Xms参数来调整堆内存的大小。增大堆内存可以提高应用程...
    99+
    2023-10-27
    jvm
  • Oracle性能调优的方法是什么
    Oracle性能调优的方法包括但不限于以下几种: 使用索引:通过在表中创建适当的索引,可以加快查询的速度。可以使用索引来加速WH...
    99+
    2024-04-19
    Oracle
  • sql优化常用方法是什么
    这篇文章将为大家详细讲解有关sql优化常用方法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。sql优化常用的方法有:1、应尽量避免全表扫描,应考虑在wher ...
    99+
    2024-04-02
  • Vue性能优化方法是什么
    本篇内容主要讲解“Vue性能优化方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue性能优化方法是什么”吧!一、代码层面的优化1.1、v-if 和 v-show 区分使用场景v-if&...
    99+
    2023-07-04
  • mysql oom优化的方法是什么
    OOM(Out of Memory)是指MySQL在执行过程中耗尽了服务器的内存资源,导致MySQL服务异常退出。为了解决OOM问题...
    99+
    2024-04-12
    mysql
  • db2数据库性能调整和优化的方法是什么
    DB2数据库性能调整和优化方法包括以下几个方面: 确保数据库设计良好:合理设计数据库结构、表结构、索引等,避免冗余数据和不必要的...
    99+
    2024-04-09
    db2
  • jenkins参数化构建的方法是什么
    Jenkins支持多种参数化构建的方法,其中包括以下几种常见的方法: 字符串参数:可以在构建过程中定义一个或多个字符串参数,例如...
    99+
    2023-10-25
    jenkins
  • asp定义全局变量的方法是什么
    在ASP中,可以使用Session对象来定义全局变量。全局变量是在整个应用程序中都可以访问的变量,多个页面之间可以共享这些变量的值。...
    99+
    2023-09-25
    asp
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作