wechat-robot-skills/skills/xlsx/references/modeling.md

104 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 模型方法与固定接口
先确定目标、对象与粒度、数据和变量、评价指标及需要解释的结论。缺少会改变模型含义的权重、约束或时间粒度时确认;不要假定用户不会回复,也不要编造限制或训练数据。简单业务计算优先工作簿公式,不为求和、比率或格式整理启动机器学习。
## 通用调用
通过 `execute_skill_script` 调用 `scripts/model_workbook.py`:
```text
--input '/usr/local/src/excel/tmp/task/source.xlsx' --spec '<JSON>' --output '/usr/local/src/excel/tmp/task/model.json'
```
`--spec-file` 与 `--spec` 二选一。仅 `task: "optimize"` 可省略输入文件,直接用已确认的系数建模。其他任务共享 [数据分析](data-analysis.md) 的 `source` 结构;建模数据上限 20000 行、100000 单元格。输出 JSON `spec_path` 再交给原 `apply_workbook.py`,不直接覆盖工作簿。
数值字段需有限;除监督学习的特征填补外,模型不自动填补缺失数据。保留异常值和来源行号,避免从数据缺口编造结论。图表可用 `chart` 字段(首结果表),或在原写入脚本中创建。
## 综合评价:`task: "evaluate"`
```json
{
"task": "evaluate",
"source": {"sheet": "供应商"},
"entity": "供应商",
"directions": {"质量合格率": "benefit", "交货准时率": "benefit", "单价": "cost"},
"weighting": "user",
"weights": {"质量合格率": 0.5, "交货准时率": 0.3, "单价": 0.2}
}
```
- `directions`:效益型 `benefit`、成本型 `cost`、中间最优型 `{"target": 7}`。先统一正向化,之后 TOPSIS 的正理想解统一取大值;**不能在已经正向化后再次反转成本方向**。
- `weighting`:默认透明的 `equal`;用户权重用 `user`(全部指标、非负、总和大于零);差异性赋权用 `entropy`;用户给出比较矩阵时可用 `ahp`。
- 熵权高只说明样本差异性较大,不等于业务重要性。不要在没有用户偏好的情况下编造 AHP 比较矩阵。
- AHP 参数 `comparison_matrix`:按 directions 顺序,2–9 阶正数互反矩阵,对角为 1;CR 不小于 0.1 时拒绝输出排名,需修正比较判断。
- 空列、非数值、不可解释编码需先处理。常量指标没有区分度;所有对象相同则并列,得分为中性 0.5,不随行顺序强行选“第一”。
输出:综合排名(原值、得分、并列名次、来源行号)和指标权重(方向、权重、适用时的信息熵、无区分度标记)。解释优劣势时引用原始指标与权重;不把得分当作获胜概率。必要时在合理权重范围重新运行,观察排名是否稳定。
## 时序预测:`task: "forecast"`
```json
{
"task": "forecast",
"source": {"sheet": "月度销量", "dates": {"月份": "%Y-%m-%d"}},
"by": ["城市"], "date": "月份", "value": "销量",
"frequency": "MS", "horizon": 3,
"methods": ["naive", "linear", "moving_average"], "holdout": 6
}
```
- `by` 可省略;每组独立建模。`frequency` 支持 D(日)、W(周末为周日)、MS(月初)、QS(季度初)、YS(年初)。数据需按对应周期锚点记录、连续、无重复,至少 6 期;先按口径处理重复和缺期,不能默认缺期销量为零。
- `horizon` 为 1–120 期。`holdout` 默认最后四分之一且至少 2 期,需保留至少 3 期训练数据。
- `naive` 延续最后值;`linear` 线性趋势;`moving_average` 递归最近最多三期均值;`seasonal_naive` 需明确 `seasonal_period` 且训练长度足够。
- 候选方法仅使用训练时段预测验证时段,按 MAE 选择后用全历史外推。该验证集参与选型,不能称为完全独立的最终测试集。
输出:各组×未来日期的预测值、验证 MAE/RMSE、历史数据。不要在未建区间模型时声称置信区间,不自动把负预测裁为零;检查趋势外推是否符合业务边界并披露限制。不能宣称已经运行 ARIMA、Prophet 或 XGBoost,本接口实际只运行列出的基线方法。
## 回归与分类:`task: "regression" / "classification"`
```json
{
"task": "regression",
"source": {"sheet": "样本"},
"features": ["价格", "促销费用", "城市"],
"categorical": ["城市"], "target": "销量",
"algorithm": "ridge", "test_fraction": 0.2
}
```
- 至少 10 条记录,目标列不能缺失。`categorical` 显式列出分类特征,其余为数值特征。ID、目标列、目标派生字段不作为有效预测特征。
- 回归 `algorithm`:`linear`(默认)、`ridge`、`forest`。分类:`logistic`(默认)、`forest`。森林使用固定种子、100 棵树和最大深度 8;不接受任意估计器或任意模型代码。
- `test_fraction` 为 0.1–0.5,默认 0.2,留出集至少 2 条记录。普通样本固定随机划分,分类进行分层。时序/未来预测必须指定 `time_column` 或使用 forecast,按时间划分;相同时点跨切分边界会被拒绝。若同一实体的重复记录可能泄漏信息,应先设计实体隔离的数据集,不能把随机切分当作有效泛化证据。
- 中位数填补、分类缺失标记、One-hot 与标准化都只在训练集拟合,再应用测试集。不会先在全数据预处理后假装留出测试。
- 回归输出训练/测试 MAE、RMSE、R²;分类输出 Accuracy、macro F1,并与均值/多数类基线对比。没有实际计算的 AUC、交叉验证、p 值不填入报告。
- `predict_source` 可指定另一个已下载文件的 `{path, …source参数}`;先保留测试结果,再用全量训练数据重新拟合并预测新样本。缺少未来特征时不能凭空生成未来回归预测。
输出:留出样本实际值与预测值、模型指标、特征重要性/绝对系数、可选新样本预测。系数与重要性是关联说明,不能推断因果方向;有负 R² 或测试表现不如基线时明确说明,不以高训练分数宣传可靠性。
## 聚类和异常检测
- `task: "cluster"`:`features: [数值字段]`;`algorithm: "kmeans"` 默认,`clusters` 默认 3,需至少为 2 且小于样本数;或 `algorithm: "dbscan"`,`eps` 默认 0.5,`min_samples` 默认 5。
- `task: "anomaly"`:`features`,Isolation Forest;`contamination` 默认 0.05,范围 (0,0.5]。该比例是假设,应与业务目的相符,不表示真实异常率。
- 数值特征标准化后分析,不自动删除异常。输出原记录、来源行号和标签;-1 为异常候选或 DBSCAN 噪声,聚类数字不代表优劣。满足条件时报告排除噪声后的轮廓系数。
- 对类别本身或长文本的深层语义先参见文本指南;当前接口不假装运行主题模型、FP-Growth、SMOTE 或任意外部模型。相关性可用 analyze_workbook;需要额外算法时应新增明确的固定接口并单独评估依赖。
## 资源优化:`task: "optimize"`
```json
{
"task": "optimize",
"variables": ["产品A", "产品B"], "objective": [30, 20], "sense": "max",
"bounds": [[0, 100], [0, 80]], "integer": [true, true],
"constraints": [
{"name": "可用工时", "coefficients": [2, 1], "relation": "<=", "rhs": 160}
]
}
```
- 明确变量、目标、资源限制、数量下限/上限及单位,不自动放松约束。`sense` 默认 min;`bounds` 默认非负无上界,null 表示无界;0–1 决策使用 `[0,1]` 和整数标记。
- `objective` 是按 variables 顺序的线性系数。约束 `relation` 支持 `<=`、`>=`、`==`。最多 200 个变量、1000 条约束。
- 连续/整数/混合整数线性问题使用 SciPy 内置 HiGHS,时间上限 60 秒。仅成功状态、约束与整数性复核通过才输出方案;超时、无解、无界不能当作最优解。
- 可选 `quadratic` 对称矩阵 Q,目标为 `c·x + 0.5*xᵀQx`;只支持连续变量、线性约束、凸最小化或凹最大化。`initial` 可指定初始点,使用 SLSQP。任意非线性函数不在接口范围内。
输出变量方案、目标值、约束左端值和余量。可用参数情景重新运行分析瓶颈;未求解的“增加资源收益”不能编造。所有结果是按给定系数得到的快照,不会自动随着源单元格更新。