问题标签 [optuna]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何使用 optuna 或 hyperopt 调整条件目标函数
我尝试使用 optuna 来调整超参数。但是我的目标函数是有条件的,这会在获得最佳参数方面产生问题。
我只想在满足条件的情况下获得 cwc,否则继续试验下一个超参数。但我想因为条件不满足并且目标函数重新运行 cwc 它给出了错误
UnboundLocalError:分配前引用的局部变量“cwc_train”
UnboundLocalError:分配前引用的局部变量“cwc_train”
optuna - 如何将学习率与修剪相匹配?
该问题的背景是通过study.optimize()
启用默认修剪和学习率作为优化参数来优化神经网络训练的超参数(这个问题可以推广到其他超参数)。
高学习率最初可以产生良好的结果,最初基本上每个中间步骤都会降低损失,但会导致最终结果不佳。
低学习率可能会产生较差的初始结果,但会产生更好的最终值。
启用剪枝后,低学习率不会因为中间结果差而被剪枝吗?这意味着最终的最佳参数将被错误地选择?
如何解决?使用另一个修枝剪有帮助吗?谢谢!
python - 如何修复错误“'_BaseUniformDistribution' 对象没有属性 'to_internal_repr'” - optuna 中的奇怪行为
我正在尝试在 Python 中使用 optuna lib 来优化推荐系统模型的参数。这些模型是自定义的,看起来像标准的拟合预测 sklearn 模型(使用 get/set params 方法)。
我做什么:从统一的int分布中选择两个参数的简单目标函数,将这些参数设置为模型,预测模型(没有拟合阶段,因为它是仅在预测阶段使用参数的简单模型)并计算一些度量。
我得到了什么:第一次试验运行正常,它对参数进行采样并将结果打印到日志中。但是在第二次和下一次试验中,我遇到了一些我无法解决或谷歌的奇怪错误(请看下面的代码)。当我只进行 1 次试验时,一切都很好。
我尝试过:重新排列目标函数的各个部分,将 fit 阶段放入其中,尝试计算更简单的指标 - 没有任何帮助。
这是我的目标函数:
这就是我在三个试验中得到的:
我不明白问题出在哪里以及为什么第一次试验有效。请帮忙。
谢谢!
python - 如何在 optuna 中采样参数而不重复?
我正在使用 optuna 对我的自定义模型进行参数优化。
有没有办法对参数进行采样,直到当前的参数集之前没有测试过?我的意思是,如果过去有一些使用相同参数集的试验,请尝试对另一个参数进行采样。
在某些情况下,这是不可能的,例如,当存在分类分布并且n_trials
大于可能的唯一采样值的数量时。
我想要的是:有一些配置参数num_attempts
,以便num_attempts
在 for 循环中对参数进行采样,直到有一个之前没有测试过的集合,否则 - 在最后一个采样的集合上运行试验。
为什么我需要这个:仅仅因为在相同参数上多次运行重型模型的成本太高。
我现在做什么:只做这个“for-loop”的东西,但它很乱。
如果有另一种聪明的方式来做到这一点 - 将非常感谢信息。
谢谢!
python - Optuna 示例返回测试集的评估指标是否存在缺陷?
我正在使用 Optuna 对某些模型进行参数优化。
在几乎所有示例中,目标函数都会返回测试集上的评估指标,并尝试最小化/最大化它。我觉得这是示例中的一个缺陷,因为 Optuna 然后根据看不见的数据优化了她的参数。
对训练集的 cv 进行优化会更加稳健。想听听其他想法并检查我是否遗漏了什么。
谢谢!
python - 有没有办法将参数传递给 optuna 中的多个工作?
我正在尝试使用 optuna 搜索超参数空间。
在一个特定的场景中,我在一台带有几个 GPU 的机器上训练一个模型。模型和批量大小允许我每 1 个 GPU 运行 1 次训练。因此,理想情况下,我想让 optuna 将所有试验分布在可用的 GPU 上,以便每个 GPU 上始终运行 1 个试验。
在它说的文档中,我应该在一个单独的终端中为每个 GPU 启动一个进程,例如:
我想避免这种情况,因为在那之后整个超参数搜索会继续进行多轮。我不想总是手动启动每个 GPU 的进程,检查所有进程何时完成,然后开始下一轮。
我看到study.optimize
有一个n_jobs
说法。乍一看,这似乎是完美的。
例如我可以这样做:
这会启动多个线程,每个线程都开始训练。但是,内部的培训师objective
不知何故需要知道它应该使用哪个 GPU。有什么诀窍可以做到这一点吗?
python - 将一组特定的参数强制到抽样批次中
我正在尝试使用 Optuna 在 ML 算法中测试不同的参数集。
Optuna 的自动采样非常有用,但是有没有办法将一组特定的参数强制放入 Optuna 定义的建议批次中?
例如,如果我有 ax,y 参数:
我还想将一组 x=0.1, y=0.2 定义为自动生成的一组。这可能吗?
将某些 ML 算法的“直观”值与其他值进行比较可能会很有趣。
python - Python:如何从 Optuna LightGBM 研究中检索最佳模型?
我想获得最好的模型,以便稍后在笔记本中使用来预测使用不同的测试批次。
可重现的示例(取自 Optuna Github):
我的理解是,下面的研究将调整准确性。我想以某种方式从研究中检索最佳模型(不仅仅是参数)而不将其保存为泡菜,我只想在笔记本的其他地方使用该模型。
所需的输出将是
scikit-learn - roc_auc_score, 'roc_auc', 'auc' 的奇怪行为
在优化 xgboost 的参数时,我遇到了 roc_auc_score 指标的问题。与训练数据的结果相比,我在交叉验证期间得到了显着不同的结果。
运行代码后:
我收到了:
所以结果大约是 0.8(train-auc-mean 0.796818)。之后运行:
我收到了:
所以这是不可能的。我也尝试使用自定义功能:
并将它们传递feval
给xgb.cv
,设置param['disable_default_eval_metric'] = 1
和不定义指标,结果是相同的。
然后我尝试使用 RandomizedSearchCV:
输出是:
所以仍然是同样的问题:在交叉验证期间得分约为 0.8,之后为 0.6。我想使用不同的指标。
我找到的解决方案是传入 RandomizedSearchCV: scoring=make_scorer(roc_auc_score)
。这解决了在交叉验证中给出相同结果的问题,之后大约为 0.6。
谁能解释问题是什么,因为我仍然不明白?而且我仍然不知道如何使用 optuna 优化来解决它。