【问题标题】:Supressing optunas cv_agg's binary_logloss output抑制 optunas cv_agg 的二进制日志丢失输出
【发布时间】:2021-11-24 08:44:38
【问题描述】:

如果我使用 LightGBMTunerCV 调整模型,我总是会得到 cv_agg 的 binary_logloss 的巨大结果。如果我使用更大的数据集执行此操作,则此(不必要的)io 会减慢优化过程的性能。

代码如下:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import optuna.integration.lightgbm as lgb
import optuna

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
warnings.simplefilter(action='ignore', category=UserWarning)
breast_cancer = load_breast_cancer()

X_train, X_test, Y_train, Y_test = train_test_split(breast_cancer.data, breast_cancer.target)

train_dataset = lgb.Dataset(X_train, Y_train, feature_name=breast_cancer.feature_names.tolist())
test_dataset = lgb.Dataset(X_test, Y_test, feature_name=breast_cancer.feature_names.tolist())
callbacks = [lgb.log_evaluation(period=0)]
tuner = lgb.LightGBMTunerCV({"objective": "binary", 'verbose': -1},
       train_set=test_dataset, num_boost_round=10,
       nfold=5, stratified=True, shuffle=True)


tuner.run()

还有输出:

feature_fraction, val_score: 0.327411:  43%|###################2      | 3/7 [00:00<00:00, 13.84it/s]
[1] cv_agg's binary_logloss: 0.609496 + 0.009315
[2] cv_agg's binary_logloss: 0.554522 + 0.00607596
[3] cv_agg's binary_logloss: 0.512217 + 0.0132959
[4] cv_agg's binary_logloss: 0.479142 + 0.0168108
[5] cv_agg's binary_logloss: 0.440044 + 0.0166129
[6] cv_agg's binary_logloss: 0.40653 + 0.0200005
[7] cv_agg's binary_logloss: 0.382273 + 0.0242429
[8] cv_agg's binary_logloss: 0.363559 + 0.03312

有什么办法可以去掉这个输出?

感谢您的帮助!

【问题讨论】:

  • 如果你事先只调用 set_verbosity 到 CRITICAL 会发生什么? optuna.readthedocs.io/en/stable/reference/generated/…(LightGBMTunerCV 的详细参数已被弃用。)
  • 不幸的是,设置optuna.logging.set_verbosity(optuna.logging.CRITICAL) 不会再静音。
  • 耻辱。对于那个调用 stackoverflow.com/a/37989355/1581658 ,使用 contextlib 将 stdout 重定向到 null 怎么样?它可能会节省一些性能?
  • 行得通!虽然我认为这更像是一种解决方法,但由于我将标准输出传送到日志文件,所以我会错过一些可能引发的警告。我认为应该有一个更直接的参数。但我在文档中找不到任何东西。因此,非常感谢您的建议!谢谢!

标签: python lightgbm optuna


【解决方案1】:

您可以在 LightGBMTunerCV() 中传递值为 None 的 verbose_eval 参数。

例子:

tuner = lgb.LightGBMTunerCV({"objective": "binary", 'verbose': -1},
       train_set=test_dataset, num_boost_round=10,
       nfold=5, stratified=True, shuffle=True, verbose_eval=None)

【讨论】:

  • 这正是我想要的。将 verbose_eval 设置为 None 不是我预期的用于静音输出的输入。谢谢!
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多