尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Optuna 超参数重要性评估完全指南:get_param_importances 与三大 Evaluator 的源码级解析

Optuna 超参数重要性评估完全指南:get_param_importances 与三大 Evaluator 的源码级解析 Optuna 超参数重要性评估完全指南get_param_importances 与三大 Evaluator 的源码级解析【免费下载链接】optunaA hyperparameter optimization framework项目地址: https://gitcode.com/GitHub_Trending/op/optunaoptuna.importance模块负责基于 Study 中已完成的 trials 量化各超参数对目标函数的重要性是 Optuna 优化结果分析的核心组件。本篇技术文章围绕 官方参考文档 展开完整覆盖入口函数get_param_importances的参数语义、默认评估器 PED-ANOVA 及其两个可选替代实现 fANOVA 与 MDI 的原理细节并结合仓库源码深入剖析各评估器的实现机制帮助读者在实际项目中正确选择、调用乃至扩展重要性评估器。模块概览optuna.importance 的定位与组成根据 模块文档optuna.importance提供的核心能力是给定一个已优化的 Study基于其完成的 trials 评估每个超参数的重要性。该模块由一个工具函数和一组评估器组成get_param_importances唯一的对外入口函数接收一个Study和可选的 evaluatorPedAnovaImportanceEvaluator默认评估器实现 PED-ANOVA 算法IJCAI 2023 论文并支持条件参数KDD 2026 的 Conditional PED-ANOVAFanovaImportanceEvaluator基于随机森林回归的 fANOVA 评估器MeanDecreaseImpurityImportanceEvaluator基于随机森林 MDIMean Decrease Impurity的评估器BaseImportanceEvaluator抽象基类所有自定义评估器必须继承它。模块的公开接口统一由 optuna/importance/init.py 导出__all__中恰包含上述五个名字。文档同时指出optuna.visualization.plot_param_importances会对重要性结果作可视化且 Optuna Dashboard 中的参数重要性展示也遵循同一实现即默认评估器 PED-ANOVA。入口函数 get_param_importances 的参数与返回值语义get_param_importances的完整签名与行为定义在 optuna/importance/init.py#L27-L143import optuna def objective(trial: optuna.trial.Trial) - float: x trial.suggest_int(x, 0, 2) y trial.suggest_float(y, -1.0, 1.0) z trial.suggest_float(z, 0.0, 1.5) return x**2 y**3 - z**4 sampler optuna.samplers.RandomSampler(seed42) study optuna.create_study(samplersampler) study.optimize(objective, n_trials100) importances optuna.importance.get_param_importances(study)各参数的精确语义如下参数默认值说明study必填一个已优化的Study评估仅基于其COMPLETE状态的 trialsevaluatorNone即PedAnovaImportanceEvaluator指定评估算法的评估器对象必须是BaseImportanceEvaluator的实例paramsNone要评估的参数名列表None时评估规则因评估器而异见下文targetNone返回评估所用数值的函数签名为Callable[[FrozenTrial], float]单目标缺省时用目标值normalizeTrue是否把重要性总和归一化到 1.0返回值是一个dict键为参数名、值为非负浮点重要性按值降序排列默认总和归一化为 1.0。从源码结构看函数体有几个值得注意的细节归一化与全零兜底normalizeTrue时若原始重要性之和为 0则返回每个参数1/n的均匀分布见 optuna/importance/init.py#L134-L140保证总和始终为 1normalizeFalse是实验特性该参数自 v3.0.0 作为实验性功能加入使用非归一化返回值时会触发warn_experimental_argument(normalize)警告optuna/importance/init.py#L100-L143类型校验evaluator不是BaseImportanceEvaluator子类实例时抛出TypeErroroptuna/importance/init.py#L130-L131空列表特例params[]时直接返回空字典。关于paramsNone的语义差异文档有明确区分PED-ANOVA 评估所有出现在完成 trials 中的参数包括条件参数其他评估器只评估存在于全部完成 trials 中的参数通过搜索空间交集实现见 optuna/importance/_base.py#L72-L77 的_get_distributions。若显式指定paramsPED-ANOVA 要求每个参数至少出现在一个完成 trial 中其他评估器则要求至少一个完成 trial 同时包含全部指定参数否则抛出ValueError。默认评估器PedAnovaImportanceEvaluatorPedAnovaImportanceEvaluator是get_param_importances的默认评估器实现类位于 optuna/importance/_ped_anova/evaluator.py#L51-L337。其构造参数如下参数默认值说明target_quantile0.1评估达到该分位性能的参数重要性。0.1即评估进入前 10% 性能区间时哪些参数起关键作用对应原论文中的 γ′region_quantile1.0定义计算重要性的区域1.0表示整个搜索空间对应原论文中的 γevaluate_on_localTrueTrue时在区域 trials 的经验分布上计算衡量优化过程中的重要性False时以搜索空间的均匀分布为基准构造时的约束optuna/importance/_ped_anova/evaluator.py#L159-L182必须满足0.0 target_quantile region_quantile 1.0违反则断言失败若region_quantile ! 1.0且evaluate_on_localFalse会发出警告——此时region_quantile实际不生效。算法原理。从源码的evaluate实现可以还原出完整计算流程过滤出目标值有限的完成 trials_get_filtered_trials若 trial 数不超过 1会警告并返回所有参数重要性为 0归一化后变为均匀值分别用target_quantile与region_quantile筛选出 target trials 与 region trials对每个参数按regime 划分——同一参数在不同条件下可能对应不同的BaseDistribution条件参数的不同分支每个 regime 内的 target 占比 αᵢ 与 region 占比 βᵢ 参与加权_partition_by_regime在每个 regime 内对 target trials 与 region trials 分别构建Parzen 估计器并计算两者的Pearson 散度pdf_local ((pdf_top / pdf_local - 1) ** 2)_compute_pearson_divergence。散度越大说明该参数在 top 分位 trials 中的分布相对区域分布偏移越明显即越重要各 regime 贡献按αᵢ² / βᵢ × 散度累加最后乘以(γ′/γ)²缩放evaluator.py#L311-L336。其中 Parzen 估计器由 ScottParzenEstimator 实现采用 Scott 规则Scott, 1992选择带宽并加入一个权重为prior_weight1.0的先验核均值取搜索空间中心以稳定小样本下的估计。数值参数被离散化到最多n_steps50的网格上计算 pdf若某个 regime 内 trial 数少于min_n_trials_in_regime2该 regime 被剔除并发出不准确警告。这些超参在__init__的 Advanced Setups 中硬编码evaluator.py#L176-L182。多目标行为是 PED-ANOVA 的独有能力当targetNone且 Study 为多目标时top 分位 trials 的选取方式与多目标TPESampler一致——按非支配排序分层层内用 HSSPhypervolume subset selection problem破平_get_top_quantile_trials。此时重要性可解释为达到 Pareto 前沿所需各参数的重要性不偏向任何特定目标。若要对单一目标评估必须显式传入target且该评估器假设越小越好目标为最大化时应在target中取负例如import optuna from optuna.importance import PedAnovaImportanceEvaluator # 目标 0 是最小化 importances optuna.importance.get_param_importances( study, evaluatorPedAnovaImportanceEvaluator(), targetlambda t: t.values[0], ) # 目标 0 是最大化——取负以满足小为好 importances optuna.importance.get_param_importances( study, evaluatorPedAnovaImportanceEvaluator(), targetlambda t: -t.values[0], )基础用法示例import optuna from optuna.importance import PedAnovaImportanceEvaluator def objective(trial): x1 trial.suggest_float(x1, -10, 10) x2 trial.suggest_float(x2, -10, 10) return x1 x2 / 1000 study optuna.create_study() study.optimize(objective, n_trials100) evaluator PedAnovaImportanceEvaluator() importance optuna.importance.get_param_importances(study, evaluatorevaluator)实践提示源自类文档分析精度依赖target_quantile以上的 trial 数量建议至少 5 个在优化过程中动态修改搜索空间时evaluate_on_localTrue的默认行为更有用。FanovaImportanceEvaluator随机森林 fANOVAFanovaImportanceEvaluator实现 fANOVA 算法Hutter et al., 2014实现在 optuna/importance/_fanova/_evaluator.py#L25-L132参数默认值说明n_trees64森林中树的数量max_depth64每棵树的深度上限seedNone随机种子指定非None值可获得确定性结果import optuna from optuna.importance import FanovaImportanceEvaluator study ... # 已优化完成的 study evaluator FanovaImportanceEvaluator(n_trees64, max_depth64, seed12) importances optuna.importance.get_param_importances(study, evaluatorevaluator)从源码看其工作机制依赖 sklearn底层通过try_import延迟导入sklearn.ensemble.RandomForestRegressor见 _Fanova未安装 sklearn 时无法使用数据变换通过_SearchSpaceTransform把各参数的取值含 categorical 的 one-hot 编码映射为数值特征矩阵且transform_logFalse, transform_stepFalse即以原始尺度建模optuna/importance/_fanova/_evaluator.py#L109-L114重要性定义每棵_FanovaTree计算给定特征对预测方差的分担marginal varianceget_importance返回各树上该特征解释方差 / 总方差的均值_fanova.py#L75-L92即 fANOVA 论文中的方差分解量单值参数直接记 0分布为单值dist.single()的参数不进入森林重要性恒为 0evaluator.py#L92-L103多目标必须指定 targettargetNone且 Study 为多目标时抛出ValueError提示使用如targetlambda t: t.values[0]evaluator.py#L80-L85。类文档还给出两条实践建议fANOVA 的可靠性取决于随机森林的预测精度因此需要充分覆盖搜索空间推荐配合RandomSampler等探索性采样器使用若全部树的方差为 0例如只有一个样本则抛出RuntimeError。MeanDecreaseImpurityImportanceEvaluatorMDI 评估器MeanDecreaseImpurityImportanceEvaluator实现位于 optuna/importance/_mean_decrease_impurity.py#L29-L102构造参数与 fANOVA 相同n_trees64、max_depth64、seedNone同样依赖 sklearnimport optuna from optuna.importance import MeanDecreaseImpurityImportanceEvaluator evaluator MeanDecreaseImpurityImportanceEvaluator(n_trees32, max_depth64, seed0) importances optuna.importance.get_param_importances(study, evaluatorevaluator)从源码看它直接训练一个RandomForestRegressormin_samples_split2、min_samples_leaf1取forest.feature_importances_作为特征级 MDI再通过np.add.at(param_importances, trans.encoded_column_to_column, feature_importances)把 one-hot 编码的多列重要性聚合回单个参数名optuna/importance/_mean_decrease_impurity.py#L93-L100。多目标约束与 fANOVA 一致targetNone时多目标 Study 抛ValueError。三种评估器的对比与选择结合文档与源码三个评估器的关键差异可归纳为维度PedAnovaImportanceEvaluatorFanovaImportanceEvaluatorMeanDecreaseImpurityImportanceEvaluator是否为默认是否否算法思想分位数区域内的 Parzen 密度 Pearson 散度随机森林方差分解fANOVA随机森林 MDI额外依赖无仅 numpysklearnsklearnparamsNone的范围所有出现过的参数含条件参数所有完成 trials 的交集所有完成 trials 的交集多目标targetNone支持非支配排序 HSSP不支持须显式target不支持须显式target动态/条件搜索空间通过 regime 划分支持不支持动态空间 指定params时抛错不支持可调超参target_quantile、region_quantile、evaluate_on_localn_trees、max_depth、seedn_trees、max_depth、seed其中动态搜索空间 指定params抛错来自公共辅助函数_get_distributions当各 trial 中同名参数的BaseDistribution不一致时抛出ValueError: Parameters importances cannot be assessed with dynamic search spaces...optuna/importance/_base.py#L99-L106。因此存在条件参数或搜索空间随优化变化的场景下应优先使用默认 PED-ANOVA 评估器。结果可视化plot_param_importances文档的 seealso 指向的可视化函数optuna.visualization.plot_param_importances实现于 optuna/visualization/_param_importances.py#L118-L184其参数与入口函数对齐evaluator默认 PED-ANOVA、params、target另有图表专用参数target_name图例中目标名若 Study 设置过metric_names会优先使用。import optuna import optuna.visualization as vis fig vis.plot_param_importances(study, params[x, y, z]) fig.write_html(param_importances.html)从源码实现可以确认几个行为细节内部直接调用get_param_importancesvisualization/_param_importances.py#L59-L61条形图按重要性升序绘制使最大值位于顶端小于 0.01 的标签显示为0.01visualization/_param_importances.py#L66多目标 Study 在targetNone时为每个目标各画一条重要性序列_get_importances_infos。此外仓库还提供 matplotlib 后端与对应示例optuna/visualization/matplotlib 下的同名函数以及示例脚本 plot_param_importances.py 与 matplotlib 版示例。文档同时说明Optuna Dashboard 的参数重要性视图同样基于该默认实现。实现自定义评估器文档明确指出实现自定义评估器时应参考三个内置评估器的代码特别注意evaluate方法的返回值格式。抽象基类定义在 optuna/importance/_base.py#L23-L69from __future__ import annotations from typing import Callable from optuna.importance import BaseImportanceEvaluator from optuna.study import Study from optuna.trial import FrozenTrial class MyEvaluator(BaseImportanceEvaluator): def evaluate( self, study: Study, params: list[str] | None None, *, target: Callable[[FrozenTrial], float] | None None, ) - dict[str, float]: # 返回 {参数名: 重要性}取值需为非负浮点数 # get_param_importances 会对其做降序排序与归一化。 ...需要遵守的接口约定对照BaseImportanceEvaluator文档与三个参考实现paramsNone时自行确定评估范围如 PED-ANOVA 取全部出现过的参数其余评估器取交集targetNone且多目标时的行为需自行定义三个内置实现中两个抛ValueErrorPED-ANOVA 走 Pareto 逻辑返回值经get_param_importances的normalize逻辑处理因此评估器自身只需返回非负原始量公共工具函数_get_filtered_trials、_get_distributions、_sort_dict_by_importance等可复用见 optuna/importance/_base.py。验证入口测试用例仓库中的测试可作为行为验证的依据get_param_importances与各评估器的一般性行为见 tests/importance_tests/test_evaluator.pyPED-ANOVA 的专门测试包括 tests/importance_tests/pedanova_tests/test_evaluator.py 与 Scott Parzen 估计器测试 tests/importance_tests/pedanova_tests/test_scott_parzen_estimator.pyfANOVA 的树与评估器测试位于 tests/importance_tests/fanova_tests/。阅读这些用例可以快速确认边界行为例如 trial 数过少时的均匀化兜底、空params列表的空字典返回等。小结optuna.importance以get_param_importances为统一入口通过可插拔的BaseImportanceEvaluator体系支持三种算法默认 PED-ANOVA 无需额外依赖且原生支持条件参数与多目标fANOVA 与 MDI 则基于 sklearn 随机森林提供可解释的方差/不纯度分解。选择建议可归纳为条件或动态搜索空间、多目标研究选 PED-ANOVA有 sklearn 且希望模型式评估时用 fANOVA对搜索空间覆盖更敏感或更轻量的 MDI。所有 API 行为均可在 optuna/importance 源码与 tests/importance_tests 测试中逐一验证。【免费下载链接】optunaA hyperparameter optimization framework项目地址: https://gitcode.com/GitHub_Trending/op/optuna创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表