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 卡片。