You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ray Tune同时优化多目标:最小化MSE与最大化R²

同时最小化MSE_test与最大化R²_test的同步优化方案

你需要同步优化两个冲突的指标:最小化测试集均方误差(MSE_test)和最大化测试集决定系数(R²_test),以下是两种可行的实现方案:

方案一:加权组合单指标优化

将两个指标归一化后组合成一个单一目标函数,通过调整权重平衡两个指标的优先级。

步骤1:修改训练函数,输出组合指标

在train_model函数中,计算完mse_test和r2_test后,生成组合目标(示例中给R²更高权重,可根据需求调整):

def train_model(config, X_train, Y_train, X_test, Y_test):
    # 原有训练逻辑(模型定义、训练、评估)...
    mse_test = ... # 计算得到的测试集MSE
    r2_test = ...  # 计算得到的测试集R²

    # 归一化指标(可选,确保量级一致,需根据实际数据范围调整)
    norm_mse = mse_test / 10  # 假设MSE大致范围0-10
    norm_r2 = r2_test         # R²范围通常0-1

    # 组合目标:最小化该值(R²取负因为要最大化,MSE正因为要最小化)
    combined_score = -0.7 * norm_r2 + 0.3 * norm_mse

    # 向Ray Tune报告所有指标
    tune.report(
        mse_train=mse_train,
        r2_train=r2_train,
        mse_test=mse_test,
        r2_test=r2_test,
        combined_score=combined_score
    )

步骤2:修改主函数,优化组合指标

def main():
    config = {
        "lr": tune.loguniform(0.0001, 0.1),
        "epochs": tune.randint(70, 100)
    }

    analysis = tune.run(
        tune.with_parameters(train_model, X_train=X_train_normalized, Y_train=Y_train, X_test=X_test_normalized, Y_test=Y_test),
        config=config,
        num_samples=15,
        metric="combined_score",  # 优化组合后的单一指标
        mode="min",
        progress_reporter=CLIReporter(metric_columns=["mse_train", "r2_train", "mse_test", "r2_test", "combined_score"])
    )

    best_config = analysis.get_best_config(metric="combined_score", mode="min")
    print("最优超参数:", best_config)

if __name__ == "__main__":
    main()

方案二:多目标Pareto优化

利用Ray Tune的多目标优化功能,直接同时优化两个指标,得到Pareto最优解集——每个解都无法在不恶化一个指标的前提下提升另一个指标。

修改主函数配置

def main():
    config = {
        "lr": tune.loguniform(0.0001, 0.1),
        "epochs": tune.randint(70, 100)
    }

    analysis = tune.run(
        tune.with_parameters(train_model, X_train=X_train_normalized, Y_train=Y_train, X_test=X_test_normalized, Y_test=Y_test),
        config=config,
        num_samples=15,
        # 指定多个优化指标及对应模式
        metric=["mse_test", "r2_test"],
        mode=["min", "max"],
        progress_reporter=CLIReporter(metric_columns=["mse_train", "r2_train", "mse_test", "r2_test"])
    )

    # 获取Pareto最优配置集合
    pareto_best_configs = analysis.get_best_configs(metric=["mse_test", "r2_test"], mode=["min", "max"])
    print("Pareto最优超参数集合:")
    for i, config in enumerate(pareto_best_configs):
        print(f"第{i+1}组:{config}")

if __name__ == "__main__":
    main()

说明

  • Pareto解集里的每个配置都是权衡后的最优选择,你可以根据业务需求挑选最合适的配置(比如更看重R²就选R²更高、MSE可接受的配置)。
  • 确保你的Ray Tune版本支持多目标优化(建议使用较新版本)。

内容的提问来源于stack exchange,提问作者Hozaifa Owaisi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:40:37