mcpField
A
automl-hyperparameter-optimization

automl-hyperparameter-optimization

github.com/mindrally数据与数据库28772 次安装3 周前更新
代码仓库

关于 automl-hyperparameter-optimization

面向机器学习从业者的 AutoML 与超参数搜索技能,涵盖实验设计、工具选择和结果报告。强调验证集防泄漏、基线对照及搜索资源控制。

主要功能

  1. 01设计验证方案并防止数据泄漏
  2. 02构建结构化超参数搜索空间
  3. 03选择 AutoML 与调参工具
  4. 04通过剪枝和预算限制搜索
  5. 05记录实验并对比基线

适用场景

  1. 01规划可靠的模型调参实验
  2. 02为时序预测选择验证与工具
  3. 03限制昂贵搜索的计算开销

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mindrally/skills --skill automl-hyperparameter-optimization

安装后在 Claude Code 中输入/automl-hyperparameter-optimization确认已加载。

详细介绍

AutoML 和超参数优化

此技能涵盖如何设计合理的超参数搜索,以及如何使用 AutoML 工具(Optuna、Ray Tune、PyCaret、时间序列 AutoML 库),同时不绕过问题定义、验证方案设计或可解释性。

执行超参数搜索的工作流

  1. 先定义目标指标和基线 — 选择工具前先确定指标,并使用固定且精简的搜索训练一个简单的基线模型(线性模型、随机森林或朴素时间序列预测)。
  2. 设计验证方案 — 对任何模型选择结论,使用嵌套交叉验证或最终未触碰的测试集;对于时间序列问题,使用基于时间的划分(绝不打乱顺序)。
  3. 在折内拟合预处理 — 仅使用每个折的训练部分拟合缩放器、编码器和插补器,以防止数据泄漏。
  4. 定义结构化搜索空间 — 对学习率、正则化强度和树的数量使用对数尺度范围;范围应基于领域知识,而不是任意设得过宽。
  5. 选择合适的工具 — 对带剪枝和分布式试验的自定义训练循环,使用 Optuna 或 Ray Tune;对于简单的表格问题,可使用 PyCaret 快速进行低代码比较;如果需要一流的季节性和预测跨度处理,则使用专用时间序列库(AutoTS、Merlion、PyAF)。
  6. 设置资源限制并进行剪枝 — 设置试验次数或时间预算,并使用提前停止/剪枝,避免表现差的试验耗尽全部预算。
  7. 跟踪每次运行 — 将数据集、划分方式、指标定义、随机种子、库版本和搜索空间本身记录到 MLflow、Weights & Biases、TensorBoard 或同等的跟踪工具中。
  8. 与基线对比并报告 — 在称其可用于生产之前,将选出的模型与基线以及至少一种非 AutoML 替代方案进行比较。

实验设计

  • 选择工具前先定义目标指标 — 指标决定搜索空间和剪枝策略,而不是反过来。
  • 在报告模型选择结论时,使用嵌套验证(内层循环用于选择超参数,外层循环用于评估性能),或使用最终未触碰的测试集。
  • 对时间序列问题使用基于时间的划分 — 绝不跨越时间边界打乱数据,因为这会将未来信息泄漏到训练中。
  • 仅在训练折上拟合所有预处理步骤(缩放器、编码器、插补器、特征选择),绝不在验证集或测试集上拟合。
  • 始终包含简单基线:线性/逻辑回归模型、随机森林,或 — 对于时间序列 — 朴素/季节性朴素预测。如果复杂模型无法胜过基线,就不值得承担其运维成本。
  • 对于耗费资源的搜索,使用提前停止和资源限制(最大试验次数、墙钟时间预算),避免失控的搜索消耗无上限的计算资源。
  • 优先选择结构化且基于领域知识的搜索空间,而非任意宽泛的网格 — 在对数尺度上将学习率范围设为 1e-5 到 1e-1,比在线性尺度上设为 0.0001 到 10 更有用。

搜索空间设计

  • 明确列出搜索空间,并由作者之外的人员审核 — 未经审核的搜索空间可能会悄然排除真正的最优解,或将预算浪费在不合理的区域。
  • 对学习率、正则化系数、树的数量以及其他对尺度敏感的超参数使用对数尺度采样。
  • 限制模型复杂度(最大深度、层宽、估计器数量),确保训练时间和内存用量符合部署环境的实际情况。
  • 只有在能够按折应用且不会造成数据泄漏时,才将预处理选项纳入搜索空间。
  • 绝不在测试集上调参 — 调参完成后,测试集仅用于报告最终的无偏估计。

工具

Optuna — 使用剪枝进行精细控制的循环

使用 Optuna 对训练循环、试验剪枝和搜索算法(TPE、CMA-ES)进行精细控制。

import optuna
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score, StratifiedKFold

X, y = load_breast_cancer(return_X_y=True)

def objective(trial: optuna.Trial) -> float:
    params = {
        "n_estimators": trial.suggest_int("n_estimators", 50, 500, log=True),
        "max_depth": trial.suggest_int("max_depth", 2, 10),
        "learning_rate": trial.suggest_float("learning_rate", 1e-3, 3e-1, log=True),
        "subsample": trial.suggest_float("subsample", 0.5, 1.0),
    }
    model = GradientBoostingClassifier(random_state=42, **params)
    cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
    scores = cross_val_score(model, X, y, cv=cv, scoring="roc_auc")

    # Report the running mean for pruning support
    trial.report(scores.mean(), step=0)
    if trial.should_prune():
        raise optuna.TrialPruned()
    return scores.mean()

study = optuna.create_study(
    direction="maximize",
    sampler=optuna.samplers.TPESampler(seed=42),
    pruner=optuna.pruners.MedianPruner(n_warmup_steps=5),
)
study.optimize(objective, n_trials=100, timeout=1800)

print("Best AUROC:", study.best_value)
print("Best params:", study.best_params)
  • 使用 optuna.pruners.MedianPruner 或 HyperbandPruner 提前停止表现不佳的试验,尤其适用于迭代模型(梯度提升、神经网络)。
  • 同时设置 n_trials 和 timeout,确保搜索始终能在预算范围内结束。
  • 为采样器设置随机种子以确保可复现性,并将 study.trials_dataframe() 记录到实验跟踪工具中。
Ray Tune — 分布式试验

当试验需要在多台机器/多个 GPU 上运行,或需要将 ASHA 等剪枝调度器集成到深度学习训练循环中时,请使用 Ray Tune。

from ray import tune
from ray.tune.schedulers import ASHAScheduler

def train_fn(config):
    # ... build model/optimizer from config, train for several epochs ...
    for epoch in range(config["max_epochs"]):
        val_loss = train_one_epoch(config)  # user-defined training step
        tune.report({"val_loss": val_loss})

search_space = {
    "lr": tune.loguniform(1e-4, 1e-1),
    "batch_size": tune.choice([32, 64, 128]),
    "max_epochs": 20,
}

tuner = tune.Tuner(
    train_fn,
    param_space=search_space,
    tune_config=tune.TuneConfig(
        metric="val_loss",
        mode="min",
        scheduler=ASHAScheduler(max_t=20, grace_period=3),
        num_samples=50,
    ),
)
results = tuner.fit()
best_result = results.get_best_result()
print(best_result.config, best_result.metrics["val_loss"])
PyCaret — 快速低代码比较

对于指标和预处理需求都较简单的常规表格问题,可使用 PyCaret 快速进行初步比较。

from pycaret.classification import setup, compare_models, tune_model, finalize_model

setup(data=df, target="churn", train_size=0.8, session_id=42)
best_model = compare_models(sort="AUC")
tuned_model = tune_model(best_model, optimize="AUC", n_iter=50)
final_model = finalize_model(tuned_model)

将 PyCaret 的排行榜作为调查的起点,而不要仅凭它做出生产决策。

时间序列 AutoML

当季节性检测、预测范围处理、滚动窗口回测等预测相关问题比模型种类更重要时,请使用 AutoTS、Merlion、PyAF 或其他经项目批准的时间序列库。这些库默认内置考虑时间因素的交叉验证,而通用表格 AutoML 工具不具备此功能。

实验跟踪与环境
  • 将运行元数据(指标、参数、随机种子、数据版本、库版本)存储在 MLflow、Weights & Biases、TensorBoard 或经项目批准的跟踪工具中,切勿依赖记忆或临时电子表格。
  • 使用 uv 或项目现有的包管理器,确保搜索环境可复现;固定库版本,因为采样器/剪枝器的行为可能会随版本更新而变化。

报告

  • 报告所选模型、使用的指标、置信区间或方差估计、验证方案以及最终测试结果;单一的点估计不足以支持生产决策。
  • 列出找到的最佳超参数和消耗的搜索预算(试验次数、实际运行时间),以便复现搜索并了解其成本。
  • 将所选模型与基线以及至少一种非 AutoML 方案进行比较。
  • 记录运行约束:推理延迟、内存占用、重新训练成本和可解释性要求;登上排行榜榜首但违反延迟 SLA 的模型不能直接部署。

常见错误

  • 将排行榜排名视为已具备生产就绪性的证明——排行榜指标不考虑延迟、内存和可解释性约束。
  • 在特征工程期间混用训练集和测试集数据(例如,在拆分数据前计算全局统计量,如均值/频率编码)。
  • 在验证标签和数据质量之前就进行大规模搜索——搜索会毫不犹豫地针对有问题的目标进行“优化”。
  • 当优化指标未能体现类别不平衡、校准或业务成本不对称时忽略这些因素(例如,在类别比例为 99:1 的数据集上优化准确率)。
  • 部署 AutoML 选出的模型,却没有可复现的训练代码和固定的依赖项——如果无法重新运行胜出的试验,就无法维护该模型。

评论

支持 Markdown