如何通过 toml 在 ray 中配置超参数优化

问题描述

有没有一种方法可以在不使用大量 if-case 的情况下在 toml 文件中完全初始化以下内容

请注意,如果从该 toml 文件中读取变量 parm_dists,最佳方法是精确地使用下面的概念作为输入并获得相同的输出

param_dists = {
    'loss': tune.choice(['squared_hinge','hinge']),'alpha': tune.loguniform(1e-4,1e-1),'epsilon': tune.uniform(1e-2,}

上下文:这个问题是在为没有机器学习背景的技术用户实施机器学习框架时出现的。 主要目标是让这些用户能够在公司的海量数据上使用 ml,使其尽可能简单。 该框架使用 ray 进行超参数调整,目前专注于 sklearn 模型。

从干净代码的角度来看,带有 if 子句的解决方案看起来很可怕。此外,它很难维护。 Image,我们有三个模型,每个模型至少有 2 个超参数和四个在此上下文中有意义的采样算法。因此,这会导致许多错误案例。

但是,如果没有人能想到特定的解决方案,那么一些关于如何处理 toml 文件提示和技巧会很棒。

解决方法

如果您只想解析配置并从中初始化 Ray Tune 搜索空间,您可以执行以下操作:

import toml
from ray import tune

toml_str = """
[params]
    [params.loss]
    type = "choice"
    categories = ["squared_hinge","hinge"]
    
    [params.alpha]
    type = "loguniform"
    lower = 1e-4
    upper = 1e-1
    
    [params.epsilon]
    type = "uniform"
    lower = 1e-2
    upper = 1e-1
"""

params = toml.loads(toml_str)

config = {}
for param,spec in params["params"].items():
    type_ = spec.pop("type")
    config[param] = getattr(tune,type_)(**spec)

请注意,您可能希望捕获 getattr() 部分中的错误。