覆盖准入规则扫描、风险规划、案件接件审核、抵质押风险管理、关联交易检测、贷前分析、审查备忘录全流程。帮助信贷审查人员提升风险识别能力。
编程
Financial Engineer Digital Employee
试用覆盖数据探查、单变量分析、特征工程、LR评分卡、XGBoost/DNN建模、超参数调优、模型解释、多模型对比、分群建模、DeepModel集成全流程。从数据到模型上线的一站式机器学习建模能力。
它能做什么
覆盖数据探查、单变量分析、特征工程、LR评分卡、XGBoost/DNN建模、超参数调优、模型解释、多模型对比、分群建模、DeepModel集成全流程。从数据到模型上线的一站式机器学习建模能力。
技能文档
Financial Engineer Digital Employee / 金融工程专家数字员工
⚠️ 能力声明 / Capability Notice
- Type: Knowledge reference framework for financial professionals
- Purpose: Provides analytical templates, reference data, and workflow guidance
- No persistent storage, network calls, background execution, or credential collection
- All outputs are for reference only and require human review before real-world application
- This skill does NOT provide financial, legal, or insurance advice
- Users must exercise their own judgment and consult qualified professionals
⚠️ 使用声明
- 本技能提供金融行业专业知识参考框架,辅助专业人员进行分析和决策
- 所有输出仅供专业参考,不构成投资建议、法律意见或合规保证
- 实际业务操作中需结合具体监管要求和机构内部制度执行
- 最终报告和数据须经相关责任人审核确认后方可提交或使用
- 不替代专业培训师、合规官或审核人员的专业判断## Skill Overview / 技能概览
金融工程专家数字员工,集成以下14项核心能力模块:
- Module 1: 数据轮廓速览
- Module 2: 单变量分析
- Module 3: 特征深度分析
- Module 4: LR评分卡建模
- Module 5: LR评分卡调参
- Module 6: XGBoost建模
- Module 7: XGBoost调参
- Module 8: DNN深度学习建模
- Module 9: DNN调参
- Module 10: 多模型效果对比
- Module 11: 模型解释
- Module 12: 自主实验循环
- Module 13: 分群建模
- Module 14: DeepModel深度集成
Module 1: 数据轮廓速览
数据洞察报告 (portable)
基于 scripts/profiler.py 主脚本,对数据集进行轮廓扫描,生成数据概况报告。
参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
--data_path | ✅ | - | 数据文件路径(parquet/csv) |
--output | data_profiling_report.md | 报告输出路径 | |
--output_dir | ./outputs/ | 产物输出目录 | |
--output_name | data_profiling_report | 报告基名(不含扩展名) | |
--config | - | JSON 配置文件路径 |
执行方式
python scripts/profiler.py \
--data_path ./examples/toy.parquet \
--output_dir ./outputs/profile_run
执行结束后:
- 产物目录
/下生成:report.md— 数据概况报告result.json— 结构化产物清单(见 PROTOCOL.md)
- stdout 末行打印
result.json绝对路径,Agent 读这个文件即可
产物示例
{
"skill": "data-profiling",
"status": "success",
"files": [
{"path": ".../report.md", "role": "report"}
],
"metrics": {"n_rows": 10000, "n_cols": 28, "n_missing_cols": 5},
"summary": "中等规模数据集(10,000行),28 个字段,数值型为主,发现 2 个高缺失字段"
}
报告输出结构
| 章节 | 内容 |
|---|---|
| 1. 数据概览 | 文件名、格式、大小、行列数、字段类型分布饼图 |
| 2. 字段详情清单 | 每个字段的类型、缺失率、唯一值数、示例值 |
| 3. 数值特征分析 | 描述性统计(均值/标准差/分位数/偏度/峰度)+ histogram 分布图 |
| 4. 类别特征分析 | 唯一值数、Top 值占比、集中度 + bar chart |
| 5. 缺失值分析 | 缺失率排名表格 + 柱状图 |
| 6. 数据质量 | 重复行、空列、常量列、高缺失列 |
| 7. 样本预览 | 前 5 行数据展示 |
自适应展示
当数值/类别特征数量超过 20 个时,统计表格和图表只展示前 20 个,避免报告过长。
与其他 Skill 的关系
| Skill | 用途区别 |
|---|---|
| data-profiling | 快速了解数据轮廓,不做深度分析 |
| feature-analysis | 深度特征分析(IV、PSI、相关性等),需要目标变量 |
| xgb-modeling | 建模全流程,需要目标变量 |
建议流程:
- 先用
data-profiling了解数据基本情况 - 根据洞察结果,决定是否需要
feature-analysis或xgb-modeling
注意事项
- 无需目标变量:本 Skill 不需要提供目标变量,纯数据描述
- 快速轻量:执行速度快,适合大数据集的快速扫描
- 自动类型推断:识别数值型、类别型、布尔型、时间型、文本型字段
Module 2: 单变量分析
单变量分析 (portable)
基于 scripts/analyzer.py 主脚本,对指定特征进行单变量级别的分布分析或预测力评估。
功能定位
| 模式 | 目标变量 | 核心功能 | 使用场景 |
|---|---|---|---|
| 数据探索模式 | ❌ 无 | 分布分析、交叉分布 | 刚上传数据、初步了解特征分布 |
| 特征筛选模式 | ✅ 有 | IV值、分箱表、筛选建议 | 建模前快速筛选特征 |
参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
--data_path | ✅ | - | 数据文件路径(parquet/csv) |
--features | ✅ | - | 待分析特征列名,逗号分隔,或 "all" |
--target | - | 目标变量列名(可选,有则进入筛选模式) | |
--exclude_cols | - | 排除的列,逗号分隔 | |
--binning_method | quantile | 分箱方式:quantile(等频) / distance(等距) | |
--n_bins | 10 | 分箱数量 | |
--cross | - | 交叉分布的两个特征,逗号分隔 | |
--output | 自动生成 | 报告输出名称 | |
--output_dir | ./outputs/ | 产物输出目录 | |
--config | - | JSON 配置文件路径 |
执行方式
数据探索模式(无目标变量)
python scripts/analyzer.py \
--data_path ./data.parquet --features "age,income,score" \
--output_dir ./outputs/uni_run
特征筛选模式(有目标变量)
python scripts/analyzer.py \
--data_path ./data.parquet --features "age,income,score" --target y_label \
--output_dir ./outputs/uni_run
交叉分布分析
python scripts/analyzer.py \
--data_path ./data.parquet --features "age,income" --cross "age,income" \
--output_dir ./outputs/uni_run
常用场景
场景一:数据探索(无目标变量)
查看单特征分布:
python scripts/analyzer.py --data_path ./data.parquet --features "age,income,score" --output_dir ./outputs/uni_run
指定等距分箱:
python scripts/analyzer.py --data_path ./data.parquet --features "age" --binning_method distance --n_bins 5 --output_dir ./outputs/uni_run
场景二:交叉分布分析
查看两个特征的联合分布:
python scripts/analyzer.py --data_path ./data.parquet --features "age,income" --cross "age,income" --output_dir ./outputs/uni_run
场景三:特征筛选(有目标变量)
计算 IV 值,评估特征预测力:
python scripts/analyzer.py --data_path ./data.parquet --features "age,income,score" --target y_label --output_dir ./outputs/uni_run
报告输出结构
数据探索模式(无目标变量)
| 章节 | 内容 |
|---|---|
| 1. 数据概览 | 样本量、分析特征数 |
| 2. 基础统计 | 各特征的均值、中位数、缺失率、基数等 |
| 3. 分布分析 | 各特征的分箱分布表(区间、样本数、占比)+ 柱状分布图 |
| 4. 交叉分布 | 两特征联合分布表(可选) |
| 5. 数据质量标记 | 缺失率过高、低基数等问题标记 |
特征筛选模式(有目标变量)
| 章节 | 内容 |
|---|---|
| 1. 数据概览 | 样本量、正样本率、分析特征数 |
| 2. 基础统计 | 各特征的均值、中位数、缺失率、基数等 |
| 3. IV值分析 | 各特征 IV 值排名及分箱明细表 |
| 4. 数据质量标记 | 缺失率过高、低基数等问题标记 |
| 5. 筛选建议 | 建议保留/剔除的特征清单 |
分箱说明
等频分箱(quantile)
按数据分位数划分,每箱样本量大致相等。适合分布不均匀的数据。
等距分箱(distance)
按数值区间等间隔划分。适合分布均匀的数据。
特殊值处理
- 缺失值:单独一箱,标记为
Missing - 零值:当零值占比 > 5% 时单独一箱
- 负数:当存在负数时单独处理
输出示例
分布分析表
特征: age | 分箱方式: 等频 | 分箱数: 10
| 区间 | 样本数 | 占比 | 累计占比 |
|---------------|---------|---------|----------|
| Missing | 156 | 1.56% | 1.56% |
| [18, 23) | 984 | 9.84% | 11.40% |
| [23, 28) | 1,012 | 10.12% | 21.52% |
| ... | ... | ... | ... |
交叉分布表
age × income 交叉分布
| | 低收入 | 中收入 | 高收入 | 合计 |
|--------------|----------|----------|----------|---------|
| [18, 25) | 800 | 300 | 134 | 1,234 |
| [25, 35) | 500 | 1,200 | 756 | 2,456 |
| [35, 45) | 200 | 800 | 1,000 | 2,000 |
| ... | ... | ... | ... | ... |
IV 分箱明细表(有目标变量)
特征: age | IV = 0.1523
| 区间 | 样本数 | 正样本数 | 正样本率 | WoE | IV |
|---------------|---------|----------|----------|---------|---------|
| [18, 23) | 984 | 156 | 15.85% | 0.32 | 0.0234 |
| [23, 28) | 1,012 | 98 | 9.68% | -0.15 | 0.0089 |
| ... | ... | ... | ... | ... | ... |
与 feature-analysis 的关系
| 维度 | univariate-analysis | feature-analysis |
|---|---|---|
| 定位 | 单特征快速分析 | 全量特征深度分析 |
| 目标变量 | 可选 | 必须 |
| 相关性分析 | ❌ | ✅ |
| PSI稳定性 | ❌ | ✅ |
| 方案推荐 | ❌ | ✅ 四套方案 |
| 典型用法 | 建模前快速筛选 | 特征工程完整报告 |
推荐工作流:univariate-analysis(快速筛选)→ feature-analysis(深度分析)
注意事项
- 特征数量:建议单次分析不超过 50 个特征,大量特征请分批处理
- 分箱数量:默认 10 箱,可根据数据量调整(数据量少时建议 5 箱)
- 交叉分布:仅支持两个特征的交叉,建议选择离散或已分箱的特征
- IV 计算:需要目标变量为 0/1 二分类
- 产物位置:报告保存到
/
Module 3: 特征深度分析
建模特征分析报告 (portable)
基于 scripts/analyzer.py 主脚本,对数据集特征进行全面分析并生成 Markdown 报告。
参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
--data_path | ✅ | - | 数据文件路径(parquet/csv) |
--target | ✅ | - | 目标变量列名(0/1 二分类) |
--exclude_cols | - | 排除列,逗号分隔 | |
--baseline_filter | - | PSI 基准数据条件(pandas query) | |
--comparison_filter | - | PSI 对比数据条件(pandas query) | |
--top_n | 10 | 输出 IV 排名前 N 的特征分箱明细(默认 10) | |
--specified_features | - | 指定特征分箱明细,逗号分隔 | |
--output | feature_analysis_report.md | 报告输出名称 | |
--output_dir | ./outputs/ | 产物输出目录 | |
--config | - | JSON 配置文件路径 |
执行方式
python scripts/analyzer.py \
--data_path ./data.parquet --target y_label \
--exclude_cols "cust_code,busi_dt" \
--baseline_filter "busi_dt <= '20250501'" \
--comparison_filter "busi_dt > '20250701'" \
--output_dir ./outputs/fa_run
常用场景
场景一:基础分析(不含 PSI)
适用于无时间维度的数据集:
python scripts/analyzer.py --data_path ./data.parquet --target y_label --output_dir ./outputs/fa_run
场景二:完整分析(含 PSI)
适用于有时间切分条件的数据集:
python scripts/analyzer.py --data_path ./data.parquet --target y_label \
--baseline_filter "busi_dt <= '20250501'" \
--comparison_filter "busi_dt > '20250701'" \
--output_dir ./outputs/fa_run
场景三:单变量深度分析
输出 IV Top N 或指定特征的完整分箱明细表:
python scripts/analyzer.py --data_path ./data.parquet --target y_label --top_n 10 --output_dir ./outputs/fa_run
python scripts/analyzer.py --data_path ./data.parquet --target y_label --specified_features "umeng_ALL,bscore" --output_dir ./outputs/fa_run
报告输出结构
生成的 feature_analysis_report.md 包含以下章节:
| 章节 | 内容 |
|---|---|
| 1. 数据概览 | 样本量、特征数、正样本率 |
| 2. 基础统计分析 | 各特征的均值、标准差、缺失率、偏度、峰度等 |
| 3. IV值分析 | IV 排名 Top 20、IV 分布统计 |
| 4. PSI稳定性分析 | PSI 排名、不稳定特征清单 |
| 5. 相关性分析 | 高相关特征对、共线性处理建议 |
| 6. 综合建议 | 推荐保留/移除特征 |
| 7. 建模特征方案 | 四套特征筛选方案(全量/去共线性/高IV/稳定性优先) |
| 8. 单变量深度分析 | 默认输出 Top 10 特征分箱明细,可通过 --top_n 调整 |
特征筛选方案说明
报告自动生成四套建模特征方案:
| 方案 | 筛选条件 | 适用场景 |
|---|---|---|
| 方案一:全量入模 | 基础合格池(IV>=0.02, PSI<0.25, 缺失率<50%) | XGBoost/LightGBM 等树模型 |
| 方案二:去共线性标准 | 基础池 + 贪心去 |r|>=0.7 | 逻辑回归、评分卡 |
| 方案三:高预测力精选 | IV>=0.1 + 去共线性 | 特征受限、可解释性要求高 |
| 方案四:稳定性优先 | PSI<0.1 + 去共线性 | 线上部署、高稳定性要求 |
与其他 Skill 的关系
| Skill | 用途区别 |
|---|---|
| feature-analysis | 全量特征深度分析+方案推荐,需要目标变量 |
| data-profiling | 快速了解数据轮廓,不做深度分析 |
| univariate-analysis | 少量特征快速分析,不含全量相关性和方案推荐 |
建议流程:data-profiling(快速扫描)→ feature-analysis(深度分析+方案推荐)→ xgb-modeling(建模)
注意事项
- 目标变量:必须为数值型
- PSI 分析:需同时提供
baseline_filter和comparison_filter,否则跳过 - 相关性:仅对数值型特征有效,非数值列自动跳过
- 大数据集:报告默认展示 IV Top 20,完整数据在文件中
- 产物位置:报告保存到
/
Module 4: LR评分卡建模
LR 评分卡建模 (portable)
基于 WoE (Weight of Evidence) 编码 + Logistic Regression 进行二分类评分卡建模。
核心流程:原始特征 → WoE 最优分箱编码 → LR 训练 → 评分卡转换
适用场景:
- 风控评分卡开发(标准 A/B/C 卡)
- 需要强可解释性的业务场景
- 监管合规要求模型白盒化
参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
--data_path / -d | ✅ | - | 数据文件路径(parquet/csv) |
--target / -t | ✅ | - | 目标变量列名(0/1 二分类) |
--time_col | busi_dt | 时间列名 | |
--train_filter | 自动切分 | 训练集筛选条件(pandas query) | |
--oot_filter | 按时间切出 | OOT 跨时间测试集条件 | |
--oot_ratio | 0.20 | 未传 --oot_filter 时按时间切 OOT 的比例 | |
--val_ratio | 0.25 | 从 train_full 切 val 的比例 | |
--random_seed | 42 | 随机种子 | |
--exclude_cols | - | 排除列,逗号分隔 | |
--features | - | 指定特征列表,逗号分隔;不传则自动按 IV 筛选 | |
--max_n_bins | 8 | WoE 分箱最大箱数 | |
--min_bin_size | 0.05 | 最小分箱比例 | |
--iv_threshold | 0.02 | IV 筛选阈值(低于此值的特征排除) | |
--regularization | l2 | 正则化类型:l1 / l2 / elasticnet | |
--C | 1.0 | 正则化强度(越小正则化越强) | |
--max_iter | 1000 | LR 最大迭代次数 | |
--base_score | 600 | 评分卡基础分 | |
--pdo | 50 | 评分卡 PDO(分数翻倍点) | |
--base_odds | 50.0 | 基础 Odds(好坏比) | |
--model_name | 自动生成 | 模型名称 | |
--report_output | 自动生成 | 报告输出路径 | |
--output_dir | ./outputs/ | 产物输出目录 | |
--config | - | JSON 配置文件路径 |
执行方式
python scripts/modeling.py \
--data_path ./data.parquet --target y_label \
--time_col busi_dt \
--exclude_cols "cust_code,busi_dt" \
--output_dir ./outputs/lr_run
指定特征建模:
python scripts/modeling.py \
--data_path ./data.parquet --target y_label \
--features "feat1,feat2,feat3,feat4" \
--regularization l1 --C 0.5 \
--output_dir ./outputs/lr_run
常用场景
场景一:默认参数快速建模
python scripts/modeling.py --data_path ./data.parquet --target y_label --output_dir ./outputs/lr_run
场景二:指定特征建模
python scripts/modeling.py --data_path ./data.parquet --target y_label \
--features "feat1,feat2,feat3" --output_dir ./outputs/lr_run
场景三:自定义评分卡参数
python scripts/modeling.py --data_path ./data.parquet --target y_label \
--base_score 650 --pdo 40 --output_dir ./outputs/lr_run
输出产物
- 建模报告(Markdown)— 含数据切分、WoE分箱表、LR系数表、评分卡转换表、三段式评估指标、稳定性分析
- 模型文件(joblib)— LR 模型 + WoE 编码器序列化
- 评分卡表(JSON)— 可直接用于部署的分箱-分数映射
- result.json — 结构化产物清单
与其他建模 Skill 的对比
| 维度 | lr-modeling | xgb-modeling | dnn-modeling |
|---|---|---|---|
| 算法 | Logistic Regression | XGBoost | MLP (PyTorch) |
| 特征编码 | WoE 分箱编码 | 原始特征直接输入 | StandardScaler |
| 可解释性 | 白盒(系数 × WoE = 贡献) | 黑盒(需 SHAP 解释) | 弱 |
| 非线性能力 | 弱(仅通过分箱引入) | 强(树结构天然支持) | 强(多层激活) |
| 适用场景 | 评分卡 / 合规 / 白盒 | 高精度 / 特征交互 | 高维复杂交互 |
| 评估体系 | AUC/KS/BCR/PSI | AUC/KS/BCR/PSI | AUC/KS/BCR/PSI |
上下游关系
- 前置:
data-profiling→feature-analysis/univariate-analysis(特征筛选) - 后续:
lr-tuning(调参优化)、model-comparison(多算法对比) - 平行:与
xgb-modeling/dnn-modeling可做横向对比(同数据不同算法)
注意事项
- 目标变量:必须为 0/1 二分类
- 时间切分:建议按时间切分,确保 OOT 为未来数据
- 特征筛选:不传
--features时自动按 IV 筛选(阈值--iv_threshold) - WoE 分箱:使用
optbinning做最优分箱,每特征最多--max_n_bins箱 - 评分卡公式:
Score = base_score - factor × ln(odds),其中factor = pdo / ln(2) - 不提供调参:需要调参请切
lr-tuning(搜索 WoE 分箱 + LR 正则化参数) - 模型保存:模型和评分卡保存到
/models/
Module 5: LR评分卡调参
LR 评分卡参数调优 (portable)
LR 评分卡调参的唯一入口,基于 _vendor/tuning/lr_engine.LRTuningEngine。
核心设计:WoE 分箱参数与 LR 正则化参数联合搜索,确保最优组合。
调优流程
基线 LR 模型 → 诊断分析(过拟合/欠拟合) → 约束空间构造 → Optuna 搜索 → 最优参数 → 迭代
执行模式
| 模式 | 触发条件 | 行为 |
|---|---|---|
| 交互式(默认) | 用户说"调参"/"帮我调一下LR" | 每轮暂停等待用户反馈 |
| AUTO | 用户说"自动调优"/"帮我调到最优" | Agent 自动迭代直到收敛 |
参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
--data_path / -d | ✅ | - | 数据文件路径 |
--target / -t | ✅ | - | 目标变量列名 |
--features | 自动推断 | 特征列表,逗号分隔 | |
--time_col | busi_dt | 时间列名 | |
--train_filter | 自动切分 | 训练集筛选条件 | |
--val_filter | val_ratio 切出 | 验证集筛选条件 | |
--oot_filter | 按时间切出 | OOT 条件 | |
--oot_ratio | 0.20 | OOT 占比 | |
--val_ratio | 0.25 | Val 占比 | |
--random_seed | 42 | 随机种子 | |
--exclude_cols | - | 排除列 | |
--max_n_bins | 8 | 当前 WoE 分箱数 | |
--iv_threshold | 0.02 | 当前 IV 阈值 | |
--C | 1.0 | 当前正则化强度倒数 | |
--regularization | l2 | 正则化类型 | |
--round / -r | 0 | 当前轮次 | |
--max_rounds | 5 | 最大调优轮数 | |
--auto | - | 自动调优模式(flag) | |
--metric | auc | 评估指标 | |
--model_name | 自动生成 | 模型名称 | |
--output_dir | ./outputs/ | 产物输出目录 | |
--config | - | JSON 配置路径 |
搜索空间
| 参数 | 类型 | 范围 | 说明 |
|---|---|---|---|
| max_n_bins | int | 3-15 | WoE 分箱数(越大越精细) |
| iv_threshold | float(log) | 0.005-0.10 | IV 筛选阈值(越低入模特征越多) |
| C | float(log) | 0.01-100 | 正则化强度倒数(越大正则化越弱) |
| regularization | categorical | l1/l2/elasticnet | 正则化类型 |
诊断驱动策略
| 诊断 | C | iv_threshold | max_n_bins |
|---|---|---|---|
| 过拟合 | ↓ 收紧 | ↑ 抬高(减少特征) | ↓ 减少 |
| 欠拟合 | ↑ 放松 | ↓ 降低(更多特征) | ↑ 增大 |
| 拟合良好 | ±微调 | ±微调 | ±微调 |
执行方式
交互式模式(单轮)
python scripts/tuner.py \
--data_path ./data.parquet --target y_label \
--round 1 --output_dir ./outputs/lr_tuning
AUTO 模式
python scripts/tuner.py \
--data_path ./data.parquet --target y_label \
--auto --max_rounds 5 --output_dir ./outputs/lr_tuning
调优策略
策略1:抗过拟合
适用条件:Train-OOT Gap > 0.05
调整方向:
C: 当前值 × 0.5(收紧正则化)iv_threshold: 当前值 × 1.5(减少入模特征)max_n_bins: 当前值 - 1(降低分箱精细度)
策略2:增强拟合
适用条件:OOT AUC < 0.58 且 Gap < 0.03
调整方向:
C: 当前值 × 2(放松正则化)iv_threshold: 当前值 × 0.5(增加入模特征)max_n_bins: 当前值 + 2(提升分箱精细度)
策略3:精细微调
适用条件:Gap ∈ [0.03, 0.05],模型状态良好
调整方向:
C: 小幅调整 ±20%max_n_bins: 微调 ±1- 其他参数保持不变
策略4:收敛判定
条件:连续2轮 OOT 指标提升 < 0.001
行为:停止调优,输出最终结果
输出格式规范
每轮调优结束后,必须输出以下结构化信息:
### 第 N 轮 LR 调优结果
**参数变化**:
| 参数 | 上一轮 | 本轮 | 调整原因 |
|------|-------|------|----------|
| C | 1.0 | 0.5 | 收紧正则化 |
| iv_threshold | 0.02 | 0.03 | 减少入模特征 |
| max_n_bins | 8 | 6 | 降低过拟合 |
**效果对比**:
| 指标 | 上一轮 | 本轮 | 变化 |
|------|-------|------|------|
| OOT AUC | 0.72 | 0.73 | +0.01 ✓ |
| OOT KS | 0.17 | 0.18 | +0.01 ✓ |
| Gap | 0.06 | 0.04 | -0.02 ✓ |
**诊断结论**: 轻微过拟合(Gap 下降但仍 > 0.03)
**下一步建议**: 可继续微调 C 值,或接受当前结果
与其他技能的关系
| 技能 | 职责 | 关系 |
|---|---|---|
lr-modeling | 基线建模 | 前置:需先用其训练出基线模型 |
model-comparison | 多算法对比 | 后续:可与 XGB/DNN 做公平对比 |
xgb-tuning | XGBoost 调参 | 平行:同数据不同算法的调参 |
注意事项
- 数据要求:目标变量必须为 0/1 二分类
- 联合搜索:WoE 分箱与 LR 参数联合优化,确保最优组合
- 收敛判定:连续2轮提升不足 0.001 自动停止
- 最大轮数:默认最多 5 轮
- 产物位置:模型和报告保存到
/models/和/
Module 6: XGBoost建模
XGBoost 建模 (portable)
基于 XGBoost 进行二分类建模,支持自动特征筛选、多方案对比、稳定性分析。可运行在任何 Python 环境,无平台耦合。调参请用 xgb-tuning。
核心流程:数据加载 → 特征筛选(四大算子)→ 多方案对比 → 最优方案训练 → 三段式评估 → 稳定性分析 → 报告生成
参数
通用参数 spec 定义在
_vendor/xgb_cli.py(domain=modeling)。
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
--data_path / -d | ✅ | - | 数据文件路径(parquet/csv) |
--target / -t | ✅ | - | 目标变量列名(0/1 二分类) |
--time_col | busi_dt | 时间列名 | |
--train_filter | 自动切分 | 训练集筛选条件(pandas query) | |
--val_filter | val_ratio 切出 | 验证集筛选条件 | |
--oot_filter | 按时间切出 | OOT 跨时间测试集条件 | |
--oot_ratio | 0.20 | 未传 --oot_filter 时按时间切 OOT 的比例 | |
--val_ratio | 0.25 | 未传 --val_filter 时从 train_full 切 val 的比例 | |
--random_seed | 42 | 随机种子 | |
--exclude_cols | - | 排除列,逗号分隔 | |
--features | - | 指定单套特征,逗号分隔 | |
--feature_sets | - | JSON 多方案;复杂嵌套优先放到 --config 的 feature_sets 字段 | |
--feature_scheme | - | 指定单套自动筛选方案:full/decorr/high_iv/stable;不传或传空则走 --auto_select 全量对比 | |
--auto_select | true | 自动特征筛选(四大算子全量对比;指定 --feature_scheme 时忽略本参数) | |
--baseline_filter | 同 train | PSI 基准条件 | |
--comparison_filter | 同 oot | PSI 对比条件 | |
--sample_strategy | auto_weight | auto_weight / undersample / none | |
--model_name | 自动生成 | 模型名称(不含扩展名) | |
--report_output | xgb_modeling_report | 报告基名 | |
--output_dir | ./outputs/ | portable 独有:产物输出目录 | |
--config | - | JSON 配置文件路径(命令行 > config > 默认) |
复杂嵌套参数(如
feature_sets)不要用命令行拼转义 JSON,改走--config config.json结构化通道。
执行方式
python scripts/modeling.py \
--data_path ./examples/toy.parquet \
--target y_label \
--time_col busi_dt \
--output_dir ./outputs/run1
复杂 feature_sets 通过 --config 传入:
python scripts/modeling.py \
--data_path ./examples/toy.parquet \
--target y_label \
--config ./config.json \
--output_dir ./outputs/run1
执行结束后 / 下生成:
xgb_modeling_report.md— 建模报告(数据概览、方案对比、最优方案、稳定性分析…)models/.json— XGBoost 模型文件models/_meta.json— 模型元数据(特征列表等)models/_card.json— ModelCardresult.json— 结构化产物清单(见 PROTOCOL.md)
stdout 末行打印 result.json 绝对路径,Agent 读这个文件即可获取全部产物路径与 metrics。
产物示例(result.json)
{
"skill": "xgb-modeling",
"status": "success",
"files": [
{"path": ".../xgb_modeling_report.md", "role": "report"},
{"path": ".../models/xgb_model_20260512_143000.json", "role": "model",
"meta": {"feature_count": 8, "scheme_name": "去共线性", "model_type": "xgboost"}},
{"path": ".../models/xgb_model_20260512_143000_meta.json", "role": "meta"}
],
"metrics": {
"oot_auc": 0.7823, "oot_ks": 0.4215,
"auc_gap": 0.0214, "ks_gap": 0.0312,
"n_features": 8, "overall_score_psi": 0.0423
},
"summary": "xgb-modeling 完成:最优方案「去共线性」,OOT AUC=0.7823,OOT KS=0.4215,特征数=8,Gap=0.0214"
}
跨 skill 串联
下游(如 model-explanation)通过 --model_path 传入上游 result.json 中 role=model 的文件路径:
# 从上游 result.json 提取模型路径
MODEL_PATH=$(jq -r '.files[] | select(.role=="model") | .path' ./outputs/run1/result.json)
python ../model-explanation/scripts/explain.py --model_path "$MODEL_PATH" --data_path ./examples/toy.parquet
常用场景
场景一:自动特征筛选建模
不指定特征,自动执行四大算子生成四套方案对比:
python scripts/modeling.py --data_path ./examples/toy.parquet --target y_label
场景二:指定特征建模
使用指定的特征列表:
python scripts/modeling.py --data_path ./examples/toy.parquet --target y_label --features "feat1,feat2,feat3"
场景二-b:指定单套自动筛选方案
只跑一种筛选方案(如"去共线性"):
python scripts/modeling.py --data_path ./examples/toy.parquet --target y_label --feature_scheme decorr
可选值:full(全量入模) / decorr(去共线性) / high_iv(高预测力) / stable(稳定性优先)
场景三:多方案对比
传入多套特征方案(优先用 --config,避免命令行拼 JSON 转义):
{
"feature_sets": {
"方案A": ["f1", "f2"],
"方案B": ["f1", "f3"]
}
}
python scripts/modeling.py --data_path ./examples/toy.parquet --target y_label --config ./config.json
场景四:保存模型
训练完成后保存最优模型,供后续 model-explanation 使用:
python scripts/modeling.py --data_path ./examples/toy.parquet --target y_label --model_name my_best_model
模型自动保存,输出:
- 模型文件:
/models/my_best_model.json - 元数据文件:
/models/my_best_model_meta.json(含特征列表、参数等)
报告结构
| 章节 | 内容 |
|---|---|
| 执行摘要 | 4 行业务结论:最优方案、Gap 状态、PSI 状态、头部特征风险 |
| 1. 数据概览 | 样本量、正样本率(Train/Test/OOT) |
| 2. 特征方案对比 | 各方案 AUC/KS/Gap 横向对比 |
| 3. 最优方案详情 | AUC/KS/Gini 指标、模型分数 IV 最优分箱、Lift 表、特征重要性、BCR @ Top5/10/20/30%、Brier Score + 校准曲线 |
| 4. 稳定性分析 | 按月 AUC/KS(含 95% Bootstrap 置信区间)、Mann-Kendall 趋势检验、分数 PSI |
| 5. 最终模型总结 | 特征列表、综合表现 |
与其他建模 Skill 的对比
| 维度 | xgb-modeling | lr-modeling | dnn-modeling |
|---|---|---|---|
| 算法 | XGBoost | Logistic Regression + WoE | MLP (PyTorch) |
| 特征处理 | 原始值直接输入 | WoE 分箱编码 | StandardScaler |
| 非线性能力 | 强(树结构) | 弱(仅通过分箱引入) | 强(多层激活) |
| 可解释性 | 中(需 SHAP) | 强(系数 × WoE) | 弱 |
| 训练速度 | 快 | 很快 | 慢 |
| 适用数据量 | 任意 | 任意 | >10k |
| 评估体系 | AUC/KS/BCR/PSI | AUC/KS/BCR/PSI | AUC/KS/BCR/PSI |
上下游关系
- 前置:
data-profiling→feature-analysis(特征筛选) - 后续:
xgb-tuning(调参优化)、model-explanation(SHAP 解释) - 平行:与
lr-modeling/dnn-modeling可做横向对比(同数据不同算法)
依赖
见 requirements.txt(核心:xgboost, scikit-learn, optbinning)。
注意事项
- 目标变量:必须为 0/1 二分类
- 时间切分:建议按时间切分,确保 OOT 为未来数据
- 自动特征筛选:需要数据同时满足 IV、PSI、缺失率条件
- 样本策略:强不均衡场景(正样本率 < 2%)建议
--sample_strategy undersample,一般场景用默认auto_weight - 不提供调参:需要调参请切 xgb-tuning(基于 Optuna TPE + 诊断驱动的约束搜索)
- 模型保存:每次训练自动保存最优模型至
/models/,无需传--save_model;可用--model_name自定义文件名 - 稳定性分析:基准月份取自训练集时间段;Bootstrap CI 需样本量 >= 100 才计算
- BCR/校准曲线:BCR(Bad Capture Rate)反映拒绝 Top K% 人群能捕获多少坏客户;校准曲线反映模型概率输出可信度
Module 7: XGBoost调参
XGBoost 参数调优 (portable)
XGBoost 调参的唯一入口,基于 _vendor/tuning_engine.TuningEngine。核心设计:
- 基线参数智能推断 — 根据数据特征推荐合理起点
- 模型状态诊断 — 过拟合/欠拟合判定(
diagnose_model) - 约束式贝叶斯搜索 — 诊断结论定向收缩 Optuna 搜索空间
- 用户知识融合 — 接受用户领域经验调整策略
调优流程
用户需求 → 数据特征分析 → LLM 推断基线参数 → 训练评估 → 诊断分析 → 参数调整 → 迭代直到满意
↑ ↓
└───────────── 用户反馈/知识输入 ─────────────┘
执行模式
| 模式 | 触发条件 | 行为 |
|---|---|---|
| 交互式(默认) | 用户说"调参"/"帮我调一下"/"优化一下" | 每轮暂停等待用户反馈 |
| AUTO | 用户说"自动调优"/"帮我调到最优"/"一直调到收敛" | Agent 自动迭代直到收敛,每轮输出进度 |
默认模式: 交互式(更安全,用户可控)
交互式模式行为规范
- 单轮调优后必须暂停,输出结构化诊断报告,等待用户反馈
- 用户可能的反馈:
- "继续" / "再调一轮" → 执行下一轮
- "Gap 还是大" / "再保守点" → 调整策略后执行
- "可以了" / "停" → 生成最终报告
- 禁止在交互式模式下连续执行多轮调优
AUTO 模式行为规范
- 每轮调优后同样输出完整的结构化诊断报告(格式同交互式模式),然后自动进入下一轮
- 收敛条件:Gap < 0.03 或 连续2轮提升 < 0.002
- 收敛后自动生成最终报告
参数说明
通用参数 spec 定义在
_vendor/xgb_cli.py(domain=tuning)。
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
--data_path / -d | ✅ | - | 数据文件路径(parquet/csv) |
--target / -t | ✅ | - | 目标变量列名(0/1 二分类) |
--features / -f | ✅ | - | 特征列表,逗号分隔 |
--time_col | busi_dt | 时间列名 | |
--train_filter | 自动切分 | 训练集筛选条件(pandas query) | |
--val_filter | val_ratio 切出 | 验证集筛选条件(已全面替代旧 --test_filter) | |
--oot_filter | 按时间切出 | OOT 测试集条件 | |
--oot_ratio / --val_ratio | 0.20 / 0.25 | 自动切分比例 | |
--random_seed | 42 | 随机种子 | |
--exclude_cols | - | 排除列,逗号分隔 | |
--params / -p | 默认参数 | 当前参数(JSON;推荐放 --config 的 params 字段) | |
--baseline / -b | - | 基线参数(JSON;推荐放 --config 的 baseline 字段) | |
--round / -r | 0 | 当前轮次 | |
--prev_val_metric | - | 上一轮 val 指标(用于收敛判断) | |
--max_rounds | 5 | 最大调优轮数 | |
--auto | - | 启用自动调优模式(flag) | |
--metric | ks | 评估指标(auc/ks) | |
--model_name | 自动生成 | 模型名称(不含扩展名) | |
--report_output / -o | 自动生成 | 报告输出路径 | |
--output_dir | ./outputs/ | portable 独有:产物输出目录 | |
--warm_start | - | WarmStartBundle JSON 字符串或文件路径 | |
--config | - | JSON 配置文件路径(由 --config 自动注入,一般无需手传) |
--params/--baseline传复杂 JSON 时优先放--config,避免命令行双引号转义问题。
基线参数智能推断
Agent 应根据 tuner.py 输出的数据摘要推断合理的基线参数,而非使用固定默认值。
数据摘要字段
tuner.py 会输出以下数据特征供 Agent 分析:
| 字段 | 说明 | 影响参数 |
|---|---|---|
train_samples | 训练集样本量 | max_depth, n_estimators |
oot_samples | OOT 样本量 | subsample |
n_features | 特征数量 | colsample_bytree |
pos_rate | 正样本率 | min_child_weight, scale_pos_weight |
推断规则
样本量与树深度
| 训练集样本量 | max_depth 建议 | 理由 |
|---|---|---|
| < 5万 | 3 | 样本少,低复杂度防过拟合 |
| 5万 - 20万 | 4 | 中等样本,适中复杂度 |
| 20万 - 100万 | 5 | 样本充足,可稍复杂 |
| > 100万 | 5-6 | 大样本支撑更高复杂度 |
正样本率与叶节点
| 正样本率 | min_child_weight 建议 | 理由 |
|---|---|---|
| < 1% | 300+ | 正样本极少,需更大叶节点防止噎声 |
| 1% - 5% | 100-200 | 不平衡,适当约束 |
| 5% - 20% | 50-100 | 较平衡,标准约束 |
| > 20% | 20-50 | 平衡数据,可稍宽松 |
特征数与采样率
| 特征数 | colsample_bytree 建议 | 理由 |
|---|---|---|
| < 20 | 0.9-1.0 | 特征少,充分利用 |
| 20 - 50 | 0.7-0.9 | 中等特征,适度采样 |
| > 50 | 0.5-0.7 | 特征多,增加随机性 |
推断示例
数据摘要:
训练集: 150,000 样本
OOT: 50,000 样本
特征数: 35 个
正样本率: 2.5%
Agent 推断基线参数:
max_depth: 4 <- 样本量中等
min_child_weight: 150 <- 正样本率低
colsample_bytree: 0.8 <- 特征数中等
reg_alpha: 0.3 <- 特征多,适当正则
reg_lambda: 1.0
learning_rate: 0.05
n_estimators: 500
subsample: 0.8
场景化策略
Agent 应根据用户提供的场景信息调整调参策略。
金融风控场景
特点: 模型长期使用,稳定性优先
| 参数 | 建议值 | 理由 |
|---|---|---|
| max_depth | 3-4 | 低复杂度,抗过拟合 |
| min_child_weight | 150+ | 叶节点要稳定 |
| reg_alpha | 0.3-0.5 | 强正则化 |
| reg_lambda | 1.0-2.0 | 强正则化 |
调参优先级: Gap 控制 > KS 提升
终止条件: Gap < 0.02,即使 KS 略低也接受
营销响应场景
特点: 短期使用,效果优先
| 参数 | 建议值 | 理由 |
|---|---|---|
| max_depth | 4-5 | 允许较高复杂度 |
| min_child_weight | 50-100 | 可以稍宽松 |
| reg_alpha | 0.1-0.2 | 适中正则 |
调参优先级: KS 提升 > Gap 控制
终止条件: KS 达标,Gap < 0.05 可接受
平衡场景(默认)
特点: 兼顾效果和稳定性
| 参数 | 建议值 |
|---|---|
| max_depth | 4-5 |
| min_child_weight | 100 |
| reg_alpha | 0.1-0.3 |
| reg_lambda | 0.5-1.0 |
终止条件: KS >= 0.30 且 Gap < 0.03
执行方式
复杂参数(params/baseline)建议通过 --config JSON 文件传入:
# 自动调优(推荐:通过 config.json 传复杂参数)
python scripts/tuner.py \
--data_path ./data.parquet --target y_label --features "f1,f2,f3" \
--auto --max_rounds 5 --output_dir ./outputs/tuning \
--config ./config.json
config.json 示例:
{
"params": {"max_depth": 4, "learning_rate": 0.05, "n_estimators": 500},
"baseline": {"max_depth": 4, "learning_rate": 0.1}
}
交互式模式(单轮调优)
python scripts/tuner.py \
--data_path ./data.parquet --target y_label --features "f1,f2,f3" \
--round 1 --output_dir ./outputs/tuning
AUTO 模式(自动调优循环)
python scripts/tuner.py \
--data_path ./data.parquet --target y_label --features "f1,f2,f3" \
--auto --max_rounds 5 --metric auc \
--output_dir ./outputs/tuning
脚本通过单出口协议 [RESULT:{json}] 输出模型、报告、state 更新;LLM 不要复述脚本已产出的图表。
诊断知识库
模型状态诊断
| 诊断结果 | 判定条件 | 说明 |
|---|---|---|
| 过拟合 | Train-OOT Gap > 0.05 | 训练集表现远超测试集,模型记忆训练数据 |
| 轻微过拟合 | Gap ∈ [0.04, 0.05] | 存在一定过拟合风险,需关注 |
| 拟合良好 | Gap ∈ [0.02, 0.04] | 模型泛化能力正常 |
| 欠拟合 | OOT AUC < 0.55 且 Gap < 0.02 | 模型拟合能力不足 |
| 收敛 | 连续2轮提升 < 0.001 | 优化空间有限,可停止 |
过拟合信号
- Train AUC 持续上升,OOT AUC 下降或停滞
- Train-OOT Gap 逐轮增大
- 验证集效果不稳定
欠拟合信号
- Train AUC 和 OOT AUC 都较低
- 增加训练轮数后效果持续提升
- Gap 很小但整体 AUC 不足
XGBoost 参数语义
| 参数 | 作用 | 取值范围 | 过拟合时 | 欠拟合时 |
|---|---|---|---|---|
max_depth | 树深度,控制模型复杂度 | 2-8 | ↓ 减小 | ↑ 增大 |
min_child_weight | 叶节点最小样本权重 | 10-300 | ↑ 增大 | ↓ 减小 |
reg_alpha | L1 正则化强度 | 0-2.0 | ↑ 增大 | ↓ 减小 |
reg_lambda | L2 正则化强度 | 0.1-10 | ↑ 增大 | ↓ 减小 |
subsample | 样本采样率 | 0.5-1.0 | ↓ 减小 | ↑ 增大 |
colsample_bytree | 特征采样率 | 0.5-1.0 | ↓ 减小 | ↑ 增大 |
learning_rate | 学习率 | 0.005-0.15 | ↓ 减小 | ↑ 增大 |
n_estimators | 树数量 | 100-1000 | ↓ 减小 | ↑ 增大 |
参数调整优先级
过拟合场景(按优先级):
- 增大
reg_alpha/reg_lambda(最直接) - 减小
max_depth(控制复杂度) - 增大
min_child_weight(限制分裂) - 减小
subsample/colsample_bytree(增加随机性)
欠拟合场景(按优先级):
- 增大
max_depth(增加复杂度) - 增加
n_estimators(更多迭代) - 减小正则化参数
- 适当增大
learning_rate
用户指令理解
| 用户表达 | 参数映射 | 调整幅度 |
|---|---|---|
| "正则化大一点" | reg_alpha ↑ 或 reg_lambda ↑ | +50%~100% |
| "正则化小一点" | reg_alpha ↓ 或 reg_lambda ↓ | -30%~50% |
| "树深度深一点" | max_depth ↑ | +1 |
| "树深度浅一点" | max_depth ↓ | -1 |
| "学习率低一些" | learning_rate ↓ | -30%~50% |
| "学习率高一些" | learning_rate ↑ | +30%~50% |
| "多训几轮" | n_estimators ↑ | +50%~100% |
| "少训几轮" | n_estimators ↓ | -30%~50% |
| "防过拟合" | 综合:正则化↑, 深度↓, subsample↓ | 组合调整 |
| "拟合强一点" | 综合:深度↑, 正则化↓ | 组合调整 |
| "更激进一点" | learning_rate ↑, max_depth ↑ | 较大幅度 |
| "更保守一点" | learning_rate ↓, 正则化↑ | 较小幅度 |
| "继续自动调优" | 从当前参数启动新一轮 AUTO | - |
| "就用这个" / "确认" | 结束调优,输出最终配置 | - |
调优策略
策略1:抗过拟合
适用条件:Gap > 0.05
调整方向:
reg_alpha: 当前值 × 2(如 0.1 → 0.2)reg_lambda: 当前值 × 1.5max_depth: 当前值 - 1(最小为 2)min_child_weight: 当前值 × 1.5
策略2:增强拟合
适用条件:OOT AUC < 0.58 且 Gap < 0.03
调整方向:
max_depth: 当前值 + 1(最大为 8)n_estimators: 当前值 × 1.5reg_alpha: 当前值 × 0.5learning_rate: 当前值 × 1.2
策略3:精细微调
适用条件:Gap ∈ [0.03, 0.05],模型状态良好
调整方向:
learning_rate: 小幅调整 ±20%subsample: 小幅调整 ±10%- 其他参数保持不变
策略4:收敛判定
条件:连续2轮 OOT 指标提升 < 0.001
行为:停止调优,输出最终结果
策略 5:约束空间下的定向搜索
tuner.py 在 AUTO 模式下每轮调用 TuningEngine.run_round(diagnosis, tried_directions) 在诊断约束空间内跑 5 个 Optuna trial,直接取本轮最优参数进入下轮。tried_directions 会自动记录每轮参数增减方向及效果,若某个方向未改善,下一轮会自动冻结该维度。Agent 无需手动追踪,但在每轮报告中应说明"本轮诊断为 XX → 搜索空间重点是 XX",帮助用户理解调优推演。
输出格式规范
核心原则:每轮必须完整输出 禁止只输出最终调参报告。每一轮调参完成后,不论交互式还是 AUTO 模式,必须立即输出该轮的完整诊断分析过程和结果,包括:参数变化及调整理由、训练指标详情、与上一轮的对比、诊断结论、下一步建议。用户需要看到每一轮的诊断推理过程,而非仅看到最终参数。
单轮调优输出(每轮必须使用,交互式和 AUTO 模式均适用)
每轮调优结束后,必须输出以下结构化信息:
### 第 N 轮调优结果
**参数变化**:
| 参数 | 上一轮 | 本轮 | 调整原因 |
|------|-------|------|----------|
| max_depth | 4 | 3 | 降低过拟合 |
| reg_alpha | 0.1 | 0.3 | 增强正则化 |
**效果对比**:
| 指标 | 上一轮 | 本轮 | 变化 |
|------|-------|------|------|
| OOT KS | 0.17 | 0.18 | +0.01 ✓ |
| OOT AUC | 0.72 | 0.73 | +0.01 ✓ |
| Gap (KS) | 0.06 | 0.04 | -0.02 ✓ |
**诊断结论**: 轻微过拟合(Gap 下降但仍 > 0.03)
**下一步建议**: 可继续微调正则化,或接受当前结果
最终报告(调优结束时生成,不能替代逐轮输出)
当用户确认结束或 AUTO 模式收敛时,在逐轮输出完毕后,额外生成完整汇总报告:
注意:最终报告是对逐轮输出的汇总补充,不能替代逐轮输出。即使是 AUTO 模式,也必须先逐轮输出再汇总。
# XGBoost 调参报告
## 1. 调优概览
| 项目 | 内容 |
|------|------|
| 执行模式 | 交互式 / AUTO |
| 总轮数 | 3 |
| 收敛原因 | Gap < 0.03 达标 / 用户确认停止 |
## 2. 调参推演记录
| 轮次 | 参数 (depth/eta/reg) | OOT KS | OOT AUC | Gap (KS) | 诊断 | 调整决策 |
|------|---------------------|--------|---------|----------|------|----------|
| 基线 | 4 / 0.1 / 0.1 | 0.16 | 0.71 | 0.08 | 过拟合 | 降低 depth |
| R1 | 3 / 0.1 / 0.2 | 0.17 | 0.72 | 0.05 | 轻微过拟合 | 增强正则化 |
| R2 | 3 / 0.08 / 0.5 | 0.18 | 0.73 | 0.03 | 良好 | 收敛停止 |
## 3. 最终效果
| 指标 | 基线 | 最终 | 提升 |
|------|------|------|------|
| OOT KS | 0.16 | 0.18 | +0.02 |
| OOT AUC | 0.71 | 0.73 | +0.02 |
| Gap (KS) | 0.08 | 0.03 | -0.05 |
## 4. 最终参数
```json
{
"max_depth": 3,
"learning_rate": 0.08,
"reg_alpha": 0.5,
"reg_lambda": 1.0,
"min_child_weight": 100,
"subsample": 0.8,
"colsample_bytree": 0.8,
"n_estimators": 500
}
5. 调参结论
相比基线模型,最终模型:
- OOT KS 提升 0.02(0.16 → 0.18)
- OOT AUC 提升 0.02(0.71 → 0.73)
- Gap (KS) 降低 0.05(0.08 → 0.03)
- 稳定性显著改善,可安全部署
如需进一步探索,请给出您的调优建议。
---
## 与其他技能的关系
| 技能 | 职责 | 关系 |
|------|------|------|
| `xgb-modeling` | 基线建模 | 前置:需先用其训练出基线模型 |
| `model-explanation` | SHAP 解释 | 后续:调参完成后解释最优模型 |
| `model-comparison` | 多算法对比 | 平行:可与 LR/DNN 调参后做公平对比 |
| `auto-experiment` | 特征探索 | 区别:本 Skill 调参数,auto-experiment 探索特征 |
---
## 注意事项
1. **数据要求**:目标变量必须为 0/1 二分类
2. **特征要求**:需提供已筛选的特征列表(`--features` 必填)
3. **基线参数**:可传入自定义基线参数,否则使用默认值
4. **收敛判定**:连续2轮提升不足 0.001 自动停止
5. **最大轮数**:默认最多 5 轮,避免过度调优
6. **复杂 JSON**:`--params` / `--baseline` 等复杂 JSON 优先通过 `--config config.json` 传入
7. **产物位置**:模型和报告保存到 `/models/` 和 `/`
---
## Module 8: DNN深度学习建模
# DNN 深度学习建模 (portable)
基于 PyTorch 实现 MLP (Multi-Layer Perceptron) 进行二分类建模。
**核心流程**:特征标准化 → MLP 训练(BatchNorm + Dropout + Early Stopping) → 概率预测 → 三段式评估
**适用场景**:
- 高维特征交互建模
- 特征间存在复杂非线性关系
- 数据量充足(>10k 样本)
- 对模型性能有极致追求(可与 XGBoost 做 ensemble)
---
## 参数说明
| 参数 | 必选 | 默认值 | 说明 |
|------|:----:|--------|------|
| `--data_path` / `-d` | ✅ | - | 数据文件路径(parquet/csv) |
| `--target` / `-t` | ✅ | - | 目标变量列名(0/1 二分类) |
| `--time_col` | | `busi_dt` | 时间列名 |
| `--train_filter` | | 自动切分 | 训练集筛选条件(pandas query) |
| `--oot_filter` | | 按时间切出 | OOT 跨时间测试集条件 |
| `--oot_ratio` | | `0.20` | 未传 `--oot_filter` 时按时间切 OOT 的比例 |
| `--val_ratio` | | `0.25` | 从 train_full 切 val 的比例 |
| `--random_seed` | | `42` | 随机种子 |
| `--exclude_cols` | | - | 排除列,逗号分隔 |
| `--features` | | - | 指定特征列表,逗号分隔;不传则自动推断 |
| `--hidden_dims` | | `128,64,32` | 隐藏层维度,逗号分隔 |
| `--dropout` | | `0.3` | Dropout 比率 |
| `--learning_rate` | | `0.001` | 学习率 |
| `--batch_size` | | `512` | 批次大小 |
| `--epochs` | | `100` | 最大训练轮次 |
| `--patience` | | `10` | 早停耐心轮数 |
| `--weight_decay` | | `1e-4` | 权重衰减(L2 正则化) |
| `--pos_weight` | | `auto` | 正样本权重(auto=自动计算) |
| `--model_name` | | 自动生成 | 模型名称 |
| `--report_output` | | 自动生成 | 报告输出路径 |
| `--output_dir` | | `./outputs/` | 产物输出目录 |
| `--config` | | - | JSON 配置文件路径 |
---
## 执行方式
默认参数运行:
```bash
python scripts/modeling.py \
--data_path ./data.parquet --target y_label \
--time_col busi_dt \
--exclude_cols "cust_code,busi_dt" \
--output_dir ./outputs/dnn_run
自定义网络结构:
python scripts/modeling.py \
--data_path ./data.parquet --target y_label \
--hidden_dims "256,128,64" \
--dropout 0.4 \
--learning_rate 0.0005 \
--epochs 200 \
--output_dir ./outputs/dnn_run
常用场景
场景一:默认参数快速建模
python scripts/modeling.py --data_path ./data.parquet --target y_label --output_dir ./outputs/dnn_run
场景二:自定义网络结构
python scripts/modeling.py --data_path ./data.parquet --target y_label \
--hidden_dims "256,128,64" --dropout 0.4 --learning_rate 0.0005 \
--output_dir ./outputs/dnn_run
场景三:指定特征建模
python scripts/modeling.py --data_path ./data.parquet --target y_label \
--features "feat1,feat2,feat3" --output_dir ./outputs/dnn_run
输出产物
- 建模报告(Markdown)— 含数据切分、网络结构、训练曲线、三段式评估指标、稳定性分析
- 模型文件(.pt)— PyTorch state_dict + 模型配置
- 训练日志(JSON)— 每 epoch 的 loss/AUC/KS 记录
- result.json — 结构化产物清单
与其他建模 Skill 的对比
| 维度 | dnn-modeling | xgb-modeling | lr-modeling |
|---|---|---|---|
| 算法 | MLP (PyTorch) | XGBoost | LR + WoE |
| 特征处理 | StandardScaler | 原始值 | WoE 分箱 |
| 非线性能力 | 强(多层激活) | 强(树结构) | 弱 |
| 可解释性 | 弱 | 中(SHAP) | 强(系数) |
| 训练速度 | 慢 | 快 | 很快 |
| 适用数据量 | >10k | 任意 | 任意 |
| 评估体系 | AUC/KS/BCR/PSI | AUC/KS/BCR/PSI | AUC/KS/BCR/PSI |
上下游关系
- 前置:
data-profiling→feature-analysis(特征筛选) - 后续:
dnn-tuning(调参优化)、model-comparison(多算法对比) - 平行:与
xgb-modeling/lr-modeling可做横向对比
注意事项
- 数据要求:目标变量必须为 0/1 二分类
- 数据量:建议训练样本 > 10k,DNN 在小样本上易过拟合
- 缺失值:脚本自动使用中位数填充 + 添加缺失指示列
- 标准化:自动对数值特征做 StandardScaler 标准化
- 早停:当 val loss 连续
patience轮不下降时自动停止 - 不提供调参:需要调参请切
dnn-tuning(搜索网络架构 + 训练参数) - GPU:自动检测 CUDA,无 GPU 时回退到 CPU
- 模型保存:模型文件保存到
/models/
Module 9: DNN调参
DNN 深度学习参数调优 (portable)
DNN 调参的唯一入口,基于 _vendor/tuning/dnn_engine.DNNTuningEngine。
核心设计:搜索期间缩减 epochs(加速),诊断驱动动态约束搜索空间。
调优流程
基线 DNN 模型 → 诊断分析(过拟合/欠拟合) → 约束空间构造 → Optuna 搜索(30 epochs) → 最优参数 → 迭代
执行模式
| 模式 | 触发条件 | 行为 |
|---|---|---|
| 交互式(默认) | 用户说"调参"/"帮我调一下DNN" | 每轮暂停等待用户反馈 |
| AUTO | 用户说"自动调优"/"帮我调到最优" | Agent 自动迭代直到收敛 |
默认模式: 交互式(更安全,用户可控)
参数说明
| 参数 | 必选 | 默认值 | 说明 |
|---|---|---|---|
--data_path / -d | ✅ | - | 数据文件路径(parquet/csv) |
--target / -t | ✅ | - | 目标变量列名(0/1 二分类) |
--features | 自动推断 | 特征列表,逗号分隔 | |
--time_col | busi_dt | 时间列名 | |
--train_filter | 自动切分 | 训练集筛选条件 | |
--val_filter | val_ratio 切出 | 验证集筛选条件 | |
--oot_filter | 按时间切出 | OOT 条件 | |
--oot_ratio | 0.20 | OOT 占比 | |
--val_ratio | 0.25 | Val 占比 | |
--random_seed | 42 | 随机种子 | |
--exclude_cols | - | 排除列,逗号分隔 | |
--n_layers | 3 | 隐藏层数 | |
--layer_width | 128 | 首层宽度 | |
--dropout | 0.3 | Dropout 率 | |
--learning_rate | 0.001 | 学习率 | |
--weight_decay | 1e-4 | L2 正则化 | |
--batch_size | 512 | 批次大小 | |
--epochs | 100 | 完整训练 epochs | |
--search_epochs | 30 | 搜索期间 epochs(加速) | |
--round / -r | 0 | 当前轮次 | |
--max_rounds | 5 | 最大调优轮数 | |
--auto | - | 自动调优模式(flag) | |
--metric | auc | 评估指标 | |
--model_name | 自动生成 | 模型名称 | |
--output_dir | ./outputs/ | 产物输出目录 | |
--config | - | JSON 配置路径 |
搜索空间
| 参数 | 类型 | 范围 | 说明 |
|---|---|---|---|
| n_layers | int | 2-4 | 隐藏层数 |
| layer_width | int | 32-256 | 首层宽度(递减结构) |
| dropout | float | 0.1-0.5 | Dropout 比率 |
| learning_rate | float(log) | 1e-4 ~ 0.01 | Adam 学习率 |
| weight_decay | float(log) | 1e-5 ~ 1e-3 | L2 正则化 |
| batch_size | categorical | 128/256/512/1024 | 批次大小 |
诊断驱动策略
| 诊断 | dropout | weight_decay | n_layers | layer_width |
|---|---|---|---|---|
| 过拟合 | ↑ 抬高 | ↑ 增强 | ↓ 减少 | ↓ 缩小 |
| 欠拟合 | ↓ 降低 | ↓ 减弱 | ↑ 增加 | ↑ 增大 |
| 拟合良好 | ±微调 | ±微调 | ±微调 | ±微调 |
执行方式
交互式模式(单轮调优)
python scripts/tuner.py \
--data_path ./data.parquet --target y_label \
--round 1 --output_dir ./outputs/dnn_tuning
AUTO 模式(自动调优循环)
python scripts/tuner.py \
--data_path ./data.parquet --target y_label \
--auto --max_rounds 5 --output_dir ./outputs/dnn_tuning
调优策略
策略1:抗过拟合
适用条件:Train-Val Gap > 0.05
调整方向:
dropout: 当前值 + 0.1(上限 0.5)weight_decay: 当前值 × 2n_layers: 当前值 - 1(最小为 2)layer_width: 当前值 - 32(最小为 32)
策略2:增强拟合
适用条件:Val AUC < 0.58 且 Gap < 0.03
调整方向:
n_layers: 当前值 + 1(最大为 4)layer_width: 当前值 + 32(最大为 256)weight_decay: 当前值 × 0.5learning_rate: 当前值 × 1.2
策略3:精细微调
适用条件:Gap ∈ [0.03, 0.05],模型状态良好
调整方向:
learning_rate: 小幅调整 ±20%dropout: 小幅调整 ±0.05- 其他参数保持不变
策略4:收敛判定
条件:连续2轮 Val 指标提升 < 0.001
行为:停止调优,输出最终结果
输出格式规范
与 xgb-tuning 保持一致的逐轮诊断报告格式。
每轮调优结束后,必须输出以下结构化信息:
### 第 N 轮 DNN 调优结果
**参数变化**:
| 参数 | 上一轮 | 本轮 | 调整原因 |
|------|-------|------|----------|
| n_layers | 3 | 3 | 不变 |
| layer_width | 128 | 96 | 降低过拟合 |
| dropout | 0.3 | 0.4 | 增强正则化 |
**效果对比**:
| 指标 | 上一轮 | 本轮 | 变化 |
|------|-------|------|------|
| Val AUC | 0.72 | 0.73 | +0.01 ✓ |
| OOT AUC | 0.70 | 0.71 | +0.01 ✓ |
| Gap | 0.06 | 0.04 | -0.02 ✓ |
**诊断结论**: 轻微过拟合(Gap 下降但仍 > 0.03)
**下一步建议**: 可继续微调 dropout,或接受当前结果
与其他技能的关系
| 技能 | 职责 | 关系 |
|---|---|---|
dnn-modeling | 基线建模 | 前置:需先用其训练出基线模型 |
model-comparison | 多算法对比 | 后续:可与 XGB/LR 做公平对比 |
xgb-tuning | XGBoost 调参 | 平行:同数据不同算法的调参 |
注意事项
- 数据要求
相关技能
个人金融素养教育工具,提供基础金融概念、理财入门与风险意识培养。Use when 用户需要financial-literacy-tool-free相关功能时使用。不适用于超出本技能能力范围的复杂需求。适用于独立开发者、企业团队和自动化工作流场景。支持中文交互,无需复杂配置即开即用。输出结果可直接使用,减少二次加工成本。
覆盖贷前尽调、行业分析、股权穿透、财报分析、拜访计划、产品路演、授信申请、拜访备忘录全流程。助力对公客户经理高效完成信贷全流程作业。
金融行业经验萃取Skill - 专注于银行、保险、证券、投资管理等金融领域的最佳实践和方法论。涵盖风险管理、客户服务、数字化转型、合规管理等核心能力提升。当用户从事金融业务、要求学习金融行业经验、提炼金融方法论时使用。核心能力:风险管控、客户服务、合规管理、数字化运营。
覆盖行业规则生成、大额风险暴露管理、信贷政策分析、风险协作、风险信息提取、贷后监控预警、贷后管理、VLM验证全流程。帮助银行信用风险管理人员实现风险闭环管理。
由 model-distillation 从教师技能 fintech-engineer 蒸馏并增强的超越型元技能, 在教师能力之上叠加自验证、自我反思、super-agent 编排与持续自进化闭环,逐步超越教师。