paper2skills Playbook

Hyperparameter Optimization(超参调优)

Skill-Hyperparameter-Optimization · 12-ML基础

causalexperimentforecastingoptimizationrecommendation广告与投放推荐与搜索MAS与智能体工程WF-B 广告优化WF-H 复购增长
年化 ROI50-100 万元
实现难度⭐⭐⭐☆☆
业务视角
适用角色数据分析师 / 数据工程师 · 运营负责人 · 产品经理
适用平台选品评分 · 差评预测 · 用户流失预警 · 广告出价预测
什么情况下用想用机器学习解决业务问题,但不知道该选什么模型;模型上线后效果越来越差不知道为什么
成功是什么样的选对算法工具减少 50% 试错时间,模型上线后可监控可解释,数据团队和业务团队建立共同语言
业务痛点
不知道该用什么模型模型准确率不稳定业务不相信模型结果模型黑盒说不清为什么这么预测

1. 解决的问题

默认参数的 XGBoost 流失预测 AUC=0.78,希望通过超参调优提升到 0.82+

2. 核心算法逻辑

模型有一堆"旋钮"(超参),拧对了性能飞跃,拧错了白费算力。 超参调优系统化地搜索最优超参组合,而非手动试错。

3. 业务应用场景

业务问题:默认参数的 XGBoost 流失预测 AUC=0.78,希望通过超参调优提升到 0.82+。关键超参:`max_depth`, `learning_rate`, `n_estimators`, `subsample`, `colsample_bytree`, `scale_pos_weight`。

数据要求:100K 数据,在 10K 子集上快速迭代(Optuna 50 trials),确认方向后再在全集上精调

预期产出: - 最优配置:max_depth=6, lr=0.05, n_estimators=300, subsample=0.8 - AUC 从 0.78 → 0.83,+0.05 - 最佳 trial 在 50 轮内找到(vs Grid Search 需 729 轮)

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI 预估:典型场景下超参调优可提升 AUC 3-5pp(尤其是默认参数在高维/不平衡数据上表现差)。流失预测 AUC +0.05 = 月增收 $18,000。年化贡献 50-100 万元
  • 实施难度:⭐⭐⭐☆☆(3 星)— Optuna API 友好,但需要理解超参含义和搜索策略
  • 优先级评分:⭐⭐⭐⭐☆(4 星)— 是所有模型训练的"最后一步",投入产出比极高(Optuna 50 trials 通常只需 30 分钟)
  • 评估依据:ML 基础层 6 张卡片的最后一张,形成完整闭环:评估 → 交叉验证 → 不平衡处理 → 集成 → 特征选择 → 超参调优

7. 代码模板

代码块数量:1 · 路径:未检测到

"""
Hyperparameter Optimization Toolkit
超参调优工具集 — Grid / Random / Bayesian (Optuna) / Hyperband
"""

import numpy as np
import pandas as pd
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV, StratifiedKFold
from sklearn.metrics import roc_auc_score
from xgboost import XGBClassifier
from typing import Dict, Tuple


def grid_search_xgboost(
    X: np.ndarray, y: np.ndarray,
    cv: int = 3, n_jobs: int = -1
) -> Tuple[object, pd.DataFrame]:
    """XGBoost Grid Search(小空间适用)"""
    param_grid = {
        'max_depth': [3, 5, 7],
        'learning_rate': [0.01, 0.05, 0.1],
        'n_estimators': [100, 200, 300],
        'subsample': [0.7, 0.8, 0.9],
    }
    
    gs = GridSearchCV(
        XGBClassifier(random_state=42, eval_metric='logloss'),
        param_grid, cv=cv, scoring='roc_auc', n_jobs=n_jobs, verbose=0
    )
    gs.fit(X, y)
    
    results = pd.DataFrame(gs.cv_results_)
    results = results.sort_values('rank_test_score')
    
    return gs.best_estimator_, results[['params', 'mean_test_score', 'std_test_score']].head(5)


def random_search_xgboost(
    X: np.ndarray, y: np.ndarray,
    n_iter: int = 50, cv: int = 3, n_jobs: int = -1
) -> Tuple[object, pd.DataFrame]:
    """XGBoost Random Search(中等空间适用)"""
    from scipy.stats import uniform, randint
    
    param_dist = {
        'max_depth': randint(3, 10),
        'learning_rate': uniform(0.01, 0.2),
        'n_estimators': randint(100, 500),
        'subsample': uniform(0.6, 0.4),
        'colsample_bytree': uniform(0.6, 0.4),
        'min_child_weight': randint(1, 10),
        'gamma': uniform(0, 0.5),
    }
    
    rs = RandomizedSearchCV(
        XGBClassifier(random_state=42, eval_metric='logloss'),
        param_dist, n_iter=n_iter, cv=cv, scoring='roc_auc',
        n_jobs=n_jobs, random_state=42
    )
    rs.fit(X, y)

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。