BaseAuto

 BaseAuto (cls_model, h, loss, valid_loss, config,
           search_alg=<ray.tune.search.basic_variant.BasicVariantGenerator
           object at 0x7f13e57ffb50>, num_samples=10, cpus=4, gpus=0,
           refit_with_val=False, verbose=False, alias=None, backend='ray',
           callbacks=None)

*自动超参数优化类,它基于 ray 构建,提供了对多种超参数优化工具的访问,包括经典的网格搜索、贝叶斯优化和 HyperBand 算法。

待优化的验证损失由 config['loss'] 字典值定义,config 还包含超参数搜索空间的其他部分。

值得注意的是,此超参数优化的成功很大程度上取决于验证期和测试期之间的强相关性。*

类型默认值详情
cls_modelPyTorch/PyTorchLightning 模型请参阅 neuralforecast.models 集合
hint预测范围
lossPyTorch 模块来自 损失集合 的实例化训练损失类。
valid_lossPyTorch 模块来自 损失集合 的实例化验证损失类。
configdict 或 callable包含 ray.tune 定义的搜索空间的字典,或接受 optuna trial 并返回配置字典的函数。
search_algBasicVariantGenerator<ray.tune.search.basic_variant.BasicVariantGenerator object at 0x7f13e57ffb50>对于 ray,请参阅 https://docs.rayai.org.cn/en/latest/tune/api_docs/suggestion.html
对于 optuna,请参阅 https://docs.optuna.cn/en/stable/reference/samplers/index.html
num_samplesint10超参数优化步骤/样本的数量。
cpusint4优化过程中使用的 CPU 数量。仅与 ray tune 一起使用。
gpusint0优化过程中使用的 GPU 数量,默认为所有可用 GPU。仅与 ray tune 一起使用。
refit_with_valboolFalse最佳模型的重新拟合应保留 val_size。
verboseboolFalse跟踪进度。
aliasNoneTypeNone模型的自定义名称。
backendstrray用于搜索超参数空间的后端,可以是 ‘ray’ 或 ‘optuna’。
callbacksNoneTypeNone优化过程中要调用的函数列表。
ray 参考:https://docs.rayai.org.cn/en/latest/tune/tutorials/tune-metrics.html
optuna 参考:https://docs.optuna.cn/en/stable/tutorial/20_recipes/007_optuna_callback.html

BaseAuto.fit

 BaseAuto.fit (dataset, val_size=0, test_size=0, random_seed=None,
               distributed_config=None)

*BaseAuto.fit

根据 BaseAuto 配置字典 config 执行超参数优化。

优化在 TimeSeriesDataset 上进行,使用时间交叉验证和顺序在测试集之前的验证集。

参数
dataset:NeuralForecast 的 TimeSeriesDataset,详情请参阅 此处
val_size:int,时间验证集的大小(需要大于 0)。
test_size:int,时间测试集的大小(默认为 0)。
random_seed:int=None,用于超参数探索算法的 random_seed,尚未实现。
返回值
self:具有最佳超参数和结果的 BaseAuto 拟合实例。
.*


BaseAuto.predict

 BaseAuto.predict (dataset, step_size=1, **data_kwargs)

*BaseAuto.predict

最佳模型在验证集上的预测。

参数
dataset:NeuralForecast 的 TimeSeriesDataset,详情请参阅 此处
step_size:int,顺序预测之间的步长(默认为 1)。
**data_kwarg:数据集模块的附加参数。
random_seed:int=None,用于超参数探索算法的 random_seed(未实现)。
返回值
y_hatNeuralForecast 模型的 numpy 预测。
*

class RayLogLossesCallback(tune.Callback):
    def on_trial_complete(self, iteration, trials, trial, **info):
        result = trial.last_result
        print(40 * '-' + 'Trial finished' + 40 * '-')
        print(f'Train loss: {result["train_loss"]:.2f}. Valid loss: {result["loss"]:.2f}')
        print(80 * '-')
config = {
    "hidden_size": tune.choice([512]),
    "num_layers": tune.choice([3, 4]),
    "input_size": 12,
    "max_steps": 10,
    "val_check_steps": 5
}
auto = BaseAuto(h=12, loss=MAE(), valid_loss=MSE(), cls_model=MLP, config=config, num_samples=2, cpus=1, gpus=0, callbacks=[RayLogLossesCallback()])
auto.fit(dataset=dataset)
y_hat = auto.predict(dataset=dataset)
assert mae(Y_test_df['y'].values, y_hat[:, 0]) < 200
def config_f(trial):
    return {
        "hidden_size": trial.suggest_categorical('hidden_size', [512]),
        "num_layers": trial.suggest_categorical('num_layers', [3, 4]),
        "input_size": 12,
        "max_steps": 10,
        "val_check_steps": 5
    }

class OptunaLogLossesCallback:
    def __call__(self, study, trial):
        metrics = trial.user_attrs['METRICS']
        print(40 * '-' + 'Trial finished' + 40 * '-')
        print(f'Train loss: {metrics["train_loss"]:.2f}. Valid loss: {metrics["loss"]:.2f}')
        print(80 * '-')
auto2 = BaseAuto(h=12, loss=MAE(), valid_loss=MSE(), cls_model=MLP, config=config_f, search_alg=optuna.samplers.RandomSampler(), num_samples=2, backend='optuna', callbacks=[OptunaLogLossesCallback()])
auto2.fit(dataset=dataset)
assert isinstance(auto2.results, optuna.Study)
y_hat2 = auto2.predict(dataset=dataset)
assert mae(Y_test_df['y'].values, y_hat2[:, 0]) < 200

参考资料