如何用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
相关产品推荐
相关产品推荐

