research(rectification): v5 verdict for scoring-method research — LR weights, absence and precision follow-up all fail hard line 1 (BUG-1091 closed_by_design)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
a29fbe0333
commit
fa2e7d17f5
@@ -105,3 +105,4 @@
|
||||
|
||||
- §1.3「加权重类改法全部不过门」说的是**人拍权重**。2026-09-29 研究单换了路线:每条规则的权重由数据估(似然比,leave-one-case-out),允许负权重(只奖不罚是结构性问题),KP / Pranapada / D60 作为特征进入由数据定权重;另测「缺席证据」与「对已说事件追问月份」。
|
||||
- 脚手架与 v4 流水线见 `docs/research/rectification_scoring_research_2026_09_29.md`;**判定必须在 v5(≥60 例)上做**,v4 上的数字只是调试参考(BUG-1090 / BUG-1091)。本页 §1–§7 的结论不因此改变。
|
||||
- **2026-09-30 v5 判定(77 例,留一法按案例,`raw` 口径):全部不过门。** R-A 三个方案(只奖 / 加 KP·Pranapada·D60 / 允许负权重)在 ±10 / ±30 / ±60 × truth/opposite 六格头名全降(±10 0.68 → 0.57–0.60,±60 0.32 → 0.22–0.25);42 个特征里 36–39 个的 bootstrap 区间跨 0,其余 |log LR| ≤ 0.15,**v4 与 v5 同时稳定同号的特征为 0**。R-B 缺席年扣分按卡片强度把真值在区间从 76 / 76 / 75 压到 55 / 33 / 19,低强度不挤真值但头名全降。结论:**线上 11 条规则连同分钟级观察,对"哪一分钟"几乎没有信息;可校准的权重不存在。** §1.3 的结论由此从"人拍权重不过门"升级为"数据驱动权重也没有东西可校准"。BUG-560 维持 blocked,BUG-1091 closed_by_design。R-C(对已说的经历追问月份)与同子集基线比也没有一致收益(`rectification_scoring_research_2026_09_29.md` §4)。三条路都关闭。
|
||||
|
||||
@@ -1,139 +1,167 @@
|
||||
# 生时校正打分方法研究:似然比权重 / 缺席证据 / 精度追问(脚手架阶段,2026-09-29)
|
||||
# 生时校正打分方法研究:似然比权重 / 缺席证据 / 精度追问(2026-09-29,v5 判定 2026-09-30)
|
||||
|
||||
- 任务书:`docs/tasks/TASK-rectification-scoring-research-20260929.md`;进度:`docs/tasks/PROGRESS-rectification-scoring-research-20260929.md`
|
||||
- 分支:`codex/rectification-scoring-research-20260929`,基线 `origin/staging` @ `6e393780`(开工时 head;任务书写作时为 `5febb111`,其间只有文档提交)。
|
||||
- 分支:`codex/rectification-scoring-research-20260929`。脚手架阶段基线 `origin/staging` @ `6e393780`(已合入 staging,`84aaeadf`);判定阶段基线 `origin/staging` @ `0120765f`(v5 已合入)。
|
||||
- 性质:**离线测量,不改线上代码、打分、阈值、出题闸门、Skill、冻结文件。** 研究计分器是 `precision_gate_lib.score_event_with_policy`(09-14 / 09-26 已证与线上逐分相同)加上不计分的"额外观察",通过 `build_event_contribution_matrix(row_provider=…)` 走线上同一条矩阵 / 出题 / 六题回放链。
|
||||
- 数据:`references/real_case_calibration/minute_rectification_holdout_v4.json`,20 例公开 Rodden-AA。**这是开放集回放,不是盲测;本页所有数字都是 v4 调试参考,任务书规定判定只能在 v5(≥60 例)上做,所以每一项的判定栏都是 `pending_v5`。**
|
||||
- 口径:ayanamsa `raman`,node mode `mean`,步长 2 分钟,半径 ±10 / ±30 / ±60;六题回放(`ASK_COUNT = 6`,按真值作答,题目由线上 G0 出题器按**线上矩阵**出一次、各方案共用);交付区间 = 未淘汰且落后头名不足 8 分的簇并集。两种先验都报:`raw`(引擎行原始分,09-14 / 09-26 口径)与 `percent`(线上 `relative_support` 百分比口径;似然比方案用带温度的 softmax 后验,见 R-A)。
|
||||
- 复跑:`PYTHONHASHSEED=0 python3 scripts/research/scoring_research.py --cache-dir <临时目录>`(约 14 分钟)→ `docs/research/scoring_research_{lr,absence,precision_followup}_2026_09_29.json`。同机两次运行 JSON 逐字节一致(见进度记录)。
|
||||
- 判门:`precision_gate_lib.gate_verdict`(头名不降**且**宽度下降、覆盖不降);JSON 里以 `debug_verdict_v4` 记录,`verdict` 字段一律 `pending_v5`。
|
||||
- 数据:判定用 `references/real_case_calibration/minute_rectification_holdout_v5.json`(77 例公开 Rodden-AA,964 件事件:day 244 / month 143 / year 577;v4 的 20 例原样继承)。v4(20 例)只用于脚手架调试,数字保留在 §6。**开放集回放,不是盲测;数字不是准确率。** v5 已知风险例(两例 LMT 时代记录先验即排除真值、一例 ±60 六题后挤出)按原样计入,未剔除。
|
||||
- 口径:ayanamsa `raman`,node mode `mean`,步长 2 分钟,半径 ±10 / ±30 / ±60;六题回放(`ASK_COUNT = 6`,按真值作答);交付区间 = 未淘汰且落后头名不足 8 分的簇并集(`unionStillValidRange`)。两种先验都报:`raw`(引擎行原始分,09-14 / 09-26 / 09-29 口径)与 `percent`(线上 `relative_support` 百分比口径)。**主判口径 = `raw`**(理由见 §2.1)。
|
||||
- 复跑:`PYTHONHASHSEED=0 python3 scripts/research/scoring_research.py --holdout references/real_case_calibration/minute_rectification_holdout_v5.json --dataset-label v5 --cache-dir <临时目录> --probes-per-variant --out-suffix v5_2026_09_29`(约 48 分钟,静态 context 走磁盘缓存;一次只驻留一个半径)→ `docs/research/scoring_research_{lr,absence,precision_followup}_v5_2026_09_29.json`。同机两次运行三份 JSON `cmp` 逐字节一致(见进度记录)。
|
||||
- 判门:`precision_gate_lib.gate_verdict`(头名不降**且**宽度下降、覆盖不降)+ 任务书硬红线 1(每格真值在区间的例数不低于基线、头名不降)。
|
||||
|
||||
## 结论
|
||||
## 1. 结论
|
||||
|
||||
| 项 | 一句话结论(v4 调试参考) | 判定 |
|
||||
| 项 | 一句话结论(v5,77 例,留一法按案例) | 是否立实现单 |
|
||||
| --- | --- | --- |
|
||||
| R-0 脚手架 | 研究计分器与线上 `score_candidates` 在 20 例 × 3 档 = 60 个 case-radius 上**逐分对账 0 差**(分数与规则 id 都相同);每个 (候选, 事件, 采样日期) 记录 42 个特征(线上规则 25 个 + 额外观察 17 个) | 完成 |
|
||||
| R-A 似然比权重 | 流水线跑通。v4 上:留一法 `raw` 口径头名 / 覆盖与基线持平或略动(±30 A3 头名 0.55 → 0.65、宽度 33 → 31),引擎自身头名(答题前)±10 0.30 → 0.40–0.45;`percent` 口径的 softmax 后验即使按训练集拟合温度仍过度自信,把真值挤出区间(±10 squeezed 3–5 例)。20 例上 42 个特征里 31–38 个的置信区间跨 0 | `pending_v5` |
|
||||
| R-B 缺席证据 | 流水线跑通。v4 上按卡片同等强度(2 分)扣分会大量挤出真值(±60 覆盖 1.00 → 0.40)——**v4 的事件表是传记摘录,不是完整时间线,空白年不等于没发生**;真人口述同样不完整。0.5 分档不挤真值但头名下降 | `pending_v5`(v4 信号明确为负,v5 上若不翻转即关闭) |
|
||||
| R-C 精度追问 | 流水线跑通。把日精度经历降成"只记得年"后,**每例平均只有 0.2 / 0.45 / 0.7 件经历在知道月份后能把候选分到两边**(±10 只有 2/20 例有);对这些例子把那一件恢复到月精度重算先验(`C1_prior`)在 ±30 上 7 例头名 0.71 vs 该 7 例的 C0,其余档位样本太少 | `pending_v5` |
|
||||
| R-0 脚手架 | 研究计分器与线上 `score_candidates` 在 77 例 × 3 档 = 231 个 case-radius 上逐分对账 0 差;42 个特征(线上规则 25 + 额外观察 17) | 完成 |
|
||||
| R-A 似然比校准权重 | **不过门,三个方案六格全部未过硬红线 1。** `raw` 口径头名 ±10 0.68 → 0.57 / 0.55 / 0.60,±30 0.49 → 0.45 / 0.42 / 0.47,±60 0.32 → 0.25 / 0.25 / 0.22;真值在区间 A3 三档 77 / 77 / 75(基线 76 / 76 / 75)但头名全降,A1 / A2 在 ±60 各丢 3 例。**42 个特征里 36 / 38 / 39 个的置信区间跨 0,剩下的 \|log LR\| ≤ 0.15;v4 与 v5 都不跨 0 且同号的特征:0 个。** 数据说这些规则对"哪一分钟"几乎没有信息 | **不立**(BUG-1091 `closed_by_design`) |
|
||||
| R-B 缺席证据 | **不过门,六格全部未过。** 按卡片强度(2 分)扣把真值在区间压到 55 / 33 / 19(基线 76 / 76 / 75);0.5 / 1.0 分不挤(77 / 75 / 75,73 / 71 / 70)但头名一律降、宽度不降。v5 每例平均 49 个缺席年——公开传记的空白年不是"没发生",真人口述同样不完整 | **不立** |
|
||||
| R-C 精度追问 | **不过门。** 可追问的经历每例平均只有 0.44 / 0.71 / 1.09 件(有得问的例子 20 / 34 / 45);对这些例子与同子集口述基线比,恢复到月精度重算先验只在 ±30 持平(头名 0.47 = 0.47、宽度 36 vs 37),±10 / ±60 头名降(0.70 vs 0.75、0.36 vs 0.42);当作答"是"的卡三档头名都降。v4 上的正向信号在 77 例上消失 | **不立** |
|
||||
|
||||
## R-0 · 脚手架与对账
|
||||
## 2. R-A · 似然比校准权重
|
||||
|
||||
- `scripts/research/scoring_research_lib.py`
|
||||
- `make_recording_provider`:对每个 legacy 单事件请求,用 `score_event_with_policy`(V0 基线)+ 线上的过运 / Ashtakavarga / Shadbala 辅助(取 context 里线上算好的结果)产出**与线上完全相同**的 evidence,同时把该候选在该事件下的额外观察写进 `FeatureStore`:
|
||||
- 线上规则(记为特征):`vim_{md,ad,pd}_domain_{house,lord,varga}`、`{label}_functional_{benefic,malefic}_auxiliary`、`narayana_{md,ad}_domain_house`、`{label}_arudha_auxiliary`、`controlled_transit_{jupiter,saturn}_domain_house`、`ashtakavarga_target_house_{support,pressure}_auxiliary`、`shadbala_sthana_drik_naisargika_{support,pressure}_auxiliary`。`event_kind:*`、`no_domain_activation`、`*_auxiliary_not_primary` 不作特征。
|
||||
- 额外观察(线上算了没计分):`kp_target_cusp_{sublord,starlord}_is_vim_{md,ad,pd}`、`kp_asc_sublord_is_vim_{md,ad,pd}`(`feature.kp_cusps.houses`,Placidus + Krishnamurti)、`vim_{md,ad,pd}_domain_varga_d60`(D60 现算)、`{pranapada,hora_lagna,ghati_lagna,bhava_lagna}_in_target_house`(`_fine_minute_indices`)。
|
||||
- `reconcile_rows`:逐分比较分数与规则 id。**60/60 case-radius 差异 0。**
|
||||
- `event_feature_matrix`:特征值 = 该规则在该事件采样日期上命中的比例(年精度 12 个采样日、月 3 个、日 1 个),与线上按采样日平均分数同口径。
|
||||
- 真值标签:候选属于真值所在的**签名簇**(`raw_signature_clusters`)。
|
||||
- 测试:`tests/test_scoring_research.py`(10 条:LR 估计、留一法不泄漏、特征矩阵、规则过滤、加权 provider、缩放答案、缺席年、精度升降、百分比、以及 v4 公开案例 ±10 对账 0 差)。
|
||||
### 2.1 后验标定(缺口 2)与主判口径的选择
|
||||
|
||||
## R-A · 似然比校准权重
|
||||
线上先验是 `relative_support` 的比例百分比;似然比方案的自然后验是 softmax(Σ log LR)。脚手架阶段(v4)发现 softmax 后验**过度自信**:即使按训练折拟合单温度(Platt,网格 0.25–256,最大化训练例真值簇的对数后验),仍有 15–25% 的例子被挤出区间。本轮的处理:
|
||||
|
||||
**方法。** 对每个特征 f,`log LR_present = log P(f | 真值簇) − log P(f | 非真值簇)`,拉普拉斯平滑 α = 1(`(Σx + 1) / (N + 2)`);`log LR_absent` 为朴素贝叶斯互补项。每档半径单独估。
|
||||
1. **主判口径用 `raw`**:研究分乘一个只从训练折估的 `scale`(研究分例内极差中位 → 线上极差中位),直接进 `unionStillValidRange`。理由:(a) 这是 09-14 / 09-26 / 09-29 三轮研究和定论页的口径,与既有数字可比;(b) ±2 / 8 分线的意义不变,判的是"先验换了之后六题还能不能把真值留在区间里",不掺入后验标定这一层的好坏;(c) 不给"挑口径"留空间——口径在看到 v5 数字之前就写进了脚手架文档。
|
||||
2. **`percent` 口径照常报**(拟合温度的 softmax),用来回答"后验能不能标定"。v5 上拟合出的温度大得多(A1 16、A2 8–16、A3 4–16;v4 是 0.5–4),校准曲线在 ±30 / ±60 上几乎全部落在 [0,0.1) 桶(预测 0.03–0.06、实际 0.03–0.06),也就是说**标定之后后验接近均匀分布**——过自信解决了,代价是先验几乎不携带信息。这与 `raw` 口径的结论一致,不是口径差异。
|
||||
3. 两个口径下六格硬红线 1 都没过,所以口径选择不影响判定方向。
|
||||
|
||||
| 方案 | 特征 | 权重规则 |
|
||||
| --- | --- | --- |
|
||||
| A1 | 只用线上 25 条规则 | 只奖不罚:`max(log LR_present, 0)`,不用 absent 项 |
|
||||
| A2 | 加 17 个额外观察 | 同上 |
|
||||
| A3 | 同 A2 | 朴素贝叶斯:present + absent 两项都用,允许负权重 |
|
||||
### 2.2 六格硬红线 1(真值在区间例数 ≥ 基线且头名不降;`raw` 口径,留一法)
|
||||
|
||||
候选分 = Σ 事件 Σ 特征(x·w_present + (1−x)·w_absent),经线上矩阵的事件类型系数、精度权重、采样日平均与大运边界邻近项(后者按线上原样附加,不重加权)。两个只从**训练折**估的标定量:`scale`(研究分的例内极差中位 → 线上极差中位,让 `raw` 回放的 ±2 / 8 分线意义不变)、`temperature`(Platt 单温度,最大化训练例真值簇的对数后验;网格 0.25–256),`percent` 先验 = softmax(分 / T) × 100。**留一法按案例留**(`loo_folds`),全集拟合另报只作参照。
|
||||
D1(09-29 止血单,已上线)之后训练门开后不再注入口述 / 引导经历,truth 与 opposite 两个方向的格子是同一次回放;下表每行即一档的两格。
|
||||
|
||||
### 六题回放(留一法;括号内为全集拟合)
|
||||
| 半径 | 基线 真值在区间 / 头名 | A1 | A2 | A3 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| ±10(truth = opposite) | 76 / 0.675 | 76 / 0.571 **不过** | 75 / 0.545 **不过** | 77 / 0.597 **不过**(头名降) |
|
||||
| ±30(truth = opposite) | 76 / 0.494 | 77 / 0.455 **不过** | 76 / 0.416 **不过** | 77 / 0.468 **不过** |
|
||||
| ±60(truth = opposite) | 75 / 0.325 | 72 / 0.247 **不过** | 72 / 0.247 **不过** | 75 / 0.221 **不过** |
|
||||
|
||||
`raw` 口径:
|
||||
`percent` 口径:A1 76 / 77 / 77,A2 71 / 76 / 77,A3 66 / 75 / 76(基线 77 / 77 / 77);头名全部低于基线 0.79 / 0.81 / 0.77。六格同样全部不过。
|
||||
|
||||
| 半径 | 方案 | 头名命中 | 真值在区间 | 宽度中位 | 引擎头名(答题前) | 挤出真值 | debug 判定 |
|
||||
### 2.3 六题回放全表(留一法;括号内为全集拟合)
|
||||
|
||||
| 半径 | 方案 | 头名命中 | 真值在区间 | 宽度中位 | 引擎头名(答题前) | 挤出 | gate_verdict |
|
||||
| --- | --- | ---: | ---: | ---: | ---: | ---: | --- |
|
||||
| ±10 | 基线 | 0.80 | 1.00 | 15 | 0.30 | 0 | — |
|
||||
| ±10 | A1 | 0.70 (0.75) | 1.00 | 14 | 0.45 | 0 | no_benefit |
|
||||
| ±10 | A2 | 0.75 (0.80) | 1.00 | 15 | 0.40 (0.50) | 0 | no_benefit |
|
||||
| ±10 | A3 | 0.80 (0.85) | 1.00 | 15 | 0.40 (0.50) | 0 | no_benefit |
|
||||
| ±30 | 基线 | 0.55 | 1.00 | 33 | 0.20 | 0 | — |
|
||||
| ±30 | A1 | 0.55 (0.70) | 1.00 | 32 | 0.25 | 0 | benefit(宽度 −1) |
|
||||
| ±30 | A2 | 0.60 (0.65) | 1.00 | 34 | 0.10 (0.30) | 0 | no_benefit |
|
||||
| ±30 | A3 | 0.65 (0.75) | 1.00 | 31 | 0.20 (0.45) | 0 | benefit(宽度 −2) |
|
||||
| ±60 | 基线 | 0.40 | 1.00 | 56 | 0.05 | 0 | — |
|
||||
| ±60 | A1 | 0.45 (0.50) | 1.00 | 61 | 0.15 (0.20) | 0 | no_benefit |
|
||||
| ±60 | A2 | 0.55 (0.60) | 1.00 | 61 | 0.00 (0.10) | 0 | no_benefit |
|
||||
| ±60 | A3 | 0.50 (0.70) | **0.95** | 61 | 0.05 (0.30) | 1 | no_benefit |
|
||||
| ±10 | 基线 | 0.675 | 0.987 | 15 | 0.169 | 1 | — |
|
||||
| ±10 | A1 | 0.571 (0.571) | 0.987 | 13 | 0.195 (0.182) | 1 | no_benefit |
|
||||
| ±10 | A2 | 0.545 (0.545) | 0.974 | 15 | 0.156 (0.169) | 2 | no_benefit |
|
||||
| ±10 | A3 | 0.597 (0.649) | 1.000 | 15 | 0.117 (0.182) | 0 | no_benefit |
|
||||
| ±30 | 基线 | 0.494 | 0.987 | 35 | 0.091 | 1 | — |
|
||||
| ±30 | A1 | 0.455 (0.532) | 1.000 | 35 | 0.052 (0.091) | 0 | no_benefit |
|
||||
| ±30 | A2 | 0.416 (0.494) | 0.987 | 35 | 0.065 (0.078) | 1 | no_benefit |
|
||||
| ±30 | A3 | 0.468 (0.494) | 1.000 | 35 | 0.078 (0.091) | 0 | no_benefit |
|
||||
| ±60 | 基线 | 0.325 | 0.974 | 63 | 0.052 | 2 | — |
|
||||
| ±60 | A1 | 0.247 (0.325) | 0.935 | 61 | 0.013 (0.078) | 5 | no_benefit |
|
||||
| ±60 | A2 | 0.247 (0.325) | 0.935 | 67 | 0.013 (0.026) | 5 | no_benefit |
|
||||
| ±60 | A3 | 0.221 (0.299) | 0.974 | 73 | 0.026 (0.052) | 2 | no_benefit |
|
||||
|
||||
`percent` 口径(基线 = 线上比例百分比;A* = 拟合温度的 softmax 后验):
|
||||
基线与扩集单发布的 v5 成绩单逐格一致(头名 0.68 / 0.49 / 0.32,真值在区间 76 / 76 / 75,宽度 15 / 35 / 63)。
|
||||
|
||||
| 半径 | 方案 | 头名命中 | 真值在区间 | 宽度中位 | 挤出真值 | 温度(各折) |
|
||||
| --- | --- | ---: | ---: | ---: | ---: | --- |
|
||||
| ±10 | 基线 | 0.90 | 1.00 | 11 | 0 | — |
|
||||
| ±10 | A1 / A2 / A3 | 0.60 / 0.50 / 0.55 | 0.80 / 0.85 / 0.75 | 7 / 7 / 5 | 4 / 3 / 5 | 1–2 / 1 / 0.5–1 |
|
||||
| ±30 | 基线 | 0.85 | 1.00 | 33 | 0 | — |
|
||||
| ±30 | A1 / A2 / A3 | 0.65 / 0.55 / 0.55 | 0.95 / 0.80 / 0.90 | 31 / 10 / 13 | 1 / 4 / 2 | 2–4 / 1–2 / 1–2 |
|
||||
| ±60 | 基线 | 0.80 | 1.00 | 53 | 0 | — |
|
||||
| ±60 | A1 / A2 / A3 | 0.65 / 0.50 / 0.40 | 1.00 / 0.80 / 0.80 | 57 / 32 / 38 | 0 / 4 / 4 | 4–8 / 2–4 / 2 |
|
||||
- **缺口 3(按方案矩阵重出六题)已做**:`--probes-per-variant` 对每个留一法方案用它自己的矩阵重新出题再回放。结果与共用题目**逐格相同**(每档每方案头名 / 覆盖 / 宽度完全一致,每例题数 4.9 / 7.1 / 7.3)。原因:`discriminating_event_probes` 按代表候选与静态 context 判定分边,不读矩阵分数,所以先验换了题不换。这条缺口对判定方向无影响,可以关闭。
|
||||
- 稳健性(留一法,`raw`):±7 天抖动真值在区间 A1 / A2 / A3 ±10 0.99 / 0.97 / 1.00,±30 1.00 / 0.99 / 1.00,±60 0.94 / 0.94 / 0.97;±1–3 月平移 0.99 / 0.99 / 1.00,0.99 / 0.99 / 1.00,0.94 / 0.95 / 1.00;答错 1 题 0.99 / 0.99 / 1.00,0.97 / 0.97 / 0.99,0.90 / 0.93 / 0.96;答错 2 题 0.94 / 0.95 / 0.98,0.91 / 0.89 / 0.94,0.82 / 0.87 / 0.86。与 09-26 基线(答错 2 题 ±60 0.90)同量级或更差,没有一项能补回头名的损失。
|
||||
|
||||
**读法(v4,仅供 v5 前设计参考,不是结论)。**
|
||||
### 2.4 特征表:v4 与 v5 都稳定有信号的特征 —— 没有
|
||||
|
||||
1. 对账通过后,`raw` 口径的留一法数字与基线基本持平:似然比权重没有让真值掉出区间(±60 A3 一例除外),也没有明显收窄;引擎答题前的头名在 ±10 从 0.30 到 0.40–0.45、±60 A1 从 0.05 到 0.15,全集拟合再高一些——**全集与留一法的差距就是 20 例过拟合的量**。
|
||||
2. `percent` 口径下 softmax 后验**过度自信**:即使温度按训练折拟合,仍把 15–25% 例子的真值挤出区间。校准曲线(A3 留一法)在 ±10 上 [0.20,0.30) 桶预测 0.24 / 实际 0.40、[0.50,0.70) 预测 0.58 / 实际 0.40、[0.70,1.00) 只有 1 个点且错;±30 / ±60 高桶几乎无样本。要上线必须先解决后验的标定,而不是先验本身。
|
||||
3. **42 个特征里 31 / 36 / 38 个(±10 / ±30 / ±60)的 5–95% 置信区间跨 0**(案例级 bootstrap 200 次)。±10 上区间不跨 0 的:`ashtakavarga_target_house_pressure_auxiliary`(+0.41)、`vim_ad_domain_varga`(+0.30)、`vim_md_domain_varga`(+0.27)、`ghati_lagna_in_target_house` / `hora_lagna_in_target_house`(+0.31)、`pranapada_in_target_house`(**−0.36**)、`vim_ad_arudha_auxiliary`(−0.21)、`narayana_ad_domain_house`(−0.21)、`kp_target_cusp_sublord_is_vim_ad`(−0.19)。方向与线上手拍权重相反的几条(Arudha、Narayana AD、KP AD 子主为负)正是 20 例上说不清的地方——这就是任务书要先扩集的原因。
|
||||
4. 稳健性(留一法 A3,`raw`):±7 天抖动与 ±1–3 月平移三档真值在区间 0.95–1.00;答错 1 题 0.96–1.00、答错 2 题 0.91–0.99(与 09-26 基线同量级)。`percent` 口径下三项都更差(0.70–0.90),同样是后验过自信的表现。
|
||||
案例级 bootstrap 200 次的 5–95% 区间,v5 上**不跨 0** 的特征只剩:
|
||||
|
||||
## R-B · 缺席证据
|
||||
| 半径 | 特征 | log LR(命中) | 区间 |
|
||||
| --- | --- | ---: | --- |
|
||||
| ±10 | `vim_md_domain_varga_d60` | −0.15 | [−0.27, −0.03] |
|
||||
| ±10 | `kp_asc_sublord_is_vim_ad` | −0.11 | [−0.22, −0.00] |
|
||||
| ±10 | `kp_target_cusp_starlord_is_vim_md` | +0.08 | [0.00, 0.16] |
|
||||
| ±10 | `kp_target_cusp_starlord_is_vim_ad` | +0.06 | [0.00, 0.13] |
|
||||
| ±10 / ±30 / ±60 | `shadbala_sthana_drik_naisargika_support_auxiliary` | −0.06 | [−0.10, −0.01] 三档 |
|
||||
| ±10 / ±30 / ±60 | `shadbala_sthana_drik_naisargika_pressure_auxiliary` | +0.05 | [0.01, 0.08] 三档 |
|
||||
| ±30 / ±60 | `vim_md_domain_varga_d60` | −0.15 / −0.14 | [−0.25, −0.05] / [−0.23, −0.04] |
|
||||
| ±30 | `kp_target_cusp_starlord_is_vim_md` | +0.09 | [0.00, 0.17] |
|
||||
|
||||
其余 36 / 38 / 39 个跨 0。v4 上不跨 0 的九条(Ashtakavarga 压力、D-varga 命中、Hora / Ghati lagna、Pranapada 为负、Arudha 为负、Narayana AD 为负、KP AD 子主为负)在 v5 上**全部回到跨 0**;v5 上不跨 0 的几条在 v4 上也都跨 0。**没有一个特征在两套数据上同时稳定、同号。** 剩下的几条量级 0.05–0.15 nat(命中概率相差 1–2 个百分点),而且方向与线上手拍权重相反的居多(D60 命中、Shadbala 支持为负;Shadbala 压力为正)。
|
||||
|
||||
**读法。** 这是本轮最硬的结果:线上 11 条规则加 17 个额外观察,对"真值分钟 vs 邻近分钟"的区分几乎为零;v4 上看到的"信号"是 20 例的噪声。让数据定权重(R-A)不是没做对,而是没有可校准的东西。定论页 §1.3"加权重类改法不过门"的结论被 77 例、留一法、数据驱动权重的方式再次确认,并且说明了原因。
|
||||
|
||||
## 3. R-B · 缺席证据
|
||||
|
||||
**方法。** 只用训练事件(留一件 holdout 不用)。每个领域取第一件与最后一件带年月事件之间的年份,没有该领域事件的年份 = 缺席年。对每个缺席 (领域, 年) 用出题器同一判定函数 `_evaluate_contexts(month=None)` 在代表候选上求"这一年该领域是否激活"的分边;分得开就当作一道答了"没有"的题,按 0.5 / 1.0 / 2.0 分扣(卡片是 2.0;低于卡片强度的扣分不计强冲突、不会淘汰)。之后照常六题。漏说稳健性:随机删掉 1–2 件训练事件再算缺席年(每例 5 次,种子固定)。
|
||||
|
||||
`raw` 口径六题回放(`percent` 口径同向,见 JSON):
|
||||
### 3.1 六格硬红线 1(`raw` 口径;truth = opposite)
|
||||
|
||||
| 半径 | 方案 | 头名命中 | 真值在区间 | 宽度中位 | 挤出真值 | 漏说 1 件(100 次回放)真值在区间 | 漏说 2 件 |
|
||||
| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
||||
| ±10 | B0 | 0.80 | 1.00 | 15 | 0 | — | — |
|
||||
| ±10 | 缺席 @0.5 分 | 0.70 | 1.00 | 15 | 0 | 1.00 | 1.00 |
|
||||
| ±10 | 缺席 @1.0 分 | 0.70 | 1.00 | 14 | 0 | 1.00 | 1.00 |
|
||||
| ±10 | 缺席 @2.0 分(=卡片) | 0.55 | **0.85** | 13 | 3 | 0.94 | 0.94 |
|
||||
| ±30 | B0 | 0.55 | 1.00 | 33 | 0 | — | — |
|
||||
| ±30 | 缺席 @0.5 分 | 0.50 | 1.00 | 34 | 0 | 1.00 | 1.00 |
|
||||
| ±30 | 缺席 @1.0 分 | 0.45 | 1.00 | 33 | 0 | 1.00 | 1.00 |
|
||||
| ±30 | 缺席 @2.0 分 | 0.25 | **0.70** | 19 | 6 | 0.80 | 0.87 |
|
||||
| ±60 | B0 | 0.40 | 1.00 | 56 | 0 | — | — |
|
||||
| ±60 | 缺席 @0.5 分 | 0.35 | 1.00 | 68 | 0 | 1.00 | 1.00 |
|
||||
| ±60 | 缺席 @1.0 分 | 0.25 | 1.00 | 61 | 0 | 1.00 | 1.00 |
|
||||
| ±60 | 缺席 @2.0 分 | 0.10 | **0.40** | 9 | 12 | 0.54 | 0.73 |
|
||||
| 半径 | 基线 真值在区间 / 头名 | @0.5 分 | @1.0 分 | @2.0 分(=卡片) |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| ±10 | 76 / 0.675 | 77 / 0.662 **不过**(头名降) | 73 / 0.649 **不过** | 55 / 0.481 **不过** |
|
||||
| ±30 | 76 / 0.494 | 75 / 0.442 **不过** | 71 / 0.429 **不过** | 33 / 0.169 **不过** |
|
||||
| ±60 | 75 / 0.325 | 75 / 0.221 **不过** | 70 / 0.195 **不过** | 19 / 0.091 **不过** |
|
||||
|
||||
每例平均缺席年 17.95;能分边的缺席题 2.05 / 4.30 / 6.15 道(有题的例子 12 / 17 / 17)。三档 debug 判定全部 no_benefit。
|
||||
`percent` 口径同向(@2.0 分 54 / 33 / 20,@0.5 分头名 0.74 / 0.69 / 0.49 vs 基线 0.79 / 0.81 / 0.77)。
|
||||
|
||||
读法:
|
||||
### 3.2 全表与漏说稳健性(`raw`)
|
||||
|
||||
1. **按卡片强度扣,真值被大量挤出**(±60 覆盖 1.00 → 0.40)。原因不是方法错,而是 v4 的事件表是传记摘录:那些"空白年"里公众人物多半确有该领域的事,只是没进数据集;扣分等于用不完整的时间线否定真值。真人口述同样不完整(用户不会把每年的事都说全),所以这条在 v5 上大概率也是负的——**若 v5 上不翻转,R-B 关闭**。
|
||||
2. 0.5 / 1.0 分档不挤真值(覆盖 1.00)但头名一律下降、宽度不降,等于只加噪声。漏说 1–2 件在低强度下不伤覆盖,在卡片强度下把覆盖压到 0.54–0.94。
|
||||
| 半径 | 方案 | 头名 | 真值在区间 | 宽度中位 | 漏说 1 件(385 次)真值在区间 | 漏说 2 件 |
|
||||
| --- | --- | ---: | ---: | ---: | ---: | ---: |
|
||||
| ±10 | B0 | 0.675 | 0.987 | 15 | — | — |
|
||||
| ±10 | @0.5 | 0.662 | 1.000 | 15 | 1.000 | 0.997 |
|
||||
| ±10 | @1.0 | 0.649 | 0.948 | 15 | 0.953 | 0.953 |
|
||||
| ±10 | @2.0 | 0.481 | 0.714 | 9 | 0.751 | 0.753 |
|
||||
| ±30 | B0 | 0.494 | 0.987 | 35 | — | — |
|
||||
| ±30 | @0.5 | 0.442 | 0.974 | 35 | 0.974 | 0.974 |
|
||||
| ±30 | @1.0 | 0.429 | 0.922 | 33 | 0.932 | 0.945 |
|
||||
| ±30 | @2.0 | 0.169 | 0.429 | 5 | 0.465 | 0.488 |
|
||||
| ±60 | B0 | 0.325 | 0.974 | 63 | — | — |
|
||||
| ±60 | @0.5 | 0.221 | 0.974 | 71 | 0.974 | 0.969 |
|
||||
| ±60 | @1.0 | 0.195 | 0.909 | 57 | 0.917 | 0.933 |
|
||||
| ±60 | @2.0 | 0.091 | 0.247 | 5 | 0.301 | 0.369 |
|
||||
|
||||
## R-C · 精度追问可行性
|
||||
每例平均缺席年 48.9;能分边的缺席题 3.9 / 7.6 / 10.8 道(有题的例子 60 / 72 / 73)。
|
||||
|
||||
**方法。** 把每例所有日精度经历降成"只记得年"(v4 没有月精度)作为口述形态 `C0_spoken`,先验按线上重算。对每件训练中的日精度经历,用 `_evaluate_contexts(month=真实月份)` 判断"知道月份后能否把代表候选分到两边";能分的按信息增益排序取前 1 / 2 件:`C{k}_prior`(那件恢复到月精度重算先验)、`C{k}_probe`(当作答"是"的卡)、`C{k}_both`。
|
||||
**读法。** 缺席年扣分在三档、三档强度、两种口径下没有一格过门。卡片强度下区间是窄了(5–9 分钟)但真值多半不在里面——这正是定论页 §6 第 3 条警告的"把区间做窄很容易"。原因是"时间线上没有"不等于"没发生":公开传记如此,真人口述更如此。**关闭。**
|
||||
|
||||
## 4. R-C · 精度追问可行性
|
||||
|
||||
**方法。** 把每例所有日 / 月精度经历降成"只记得年"作为口述形态 `C0_spoken`,先验按线上重算。对每件训练中的日 / 月精度经历,用 `_evaluate_contexts(month=真实月份)` 判断"知道月份后能否把代表候选分到两边";能分的按信息增益排序取前 1 / 2 件:`C{k}_prior`(那件恢复到月精度重算先验,走线上已有的打字经历通道)、`C{k}_probe`(当作答"是"的卡)、`C{k}_both`。**方案臂只覆盖"有得问"的子集,所以与同一子集上的 `C0`(`subset_C0`)比**,不与全集比。
|
||||
|
||||
| 半径 | 每例可追问件数均值 | ≥1 件的例子 | ≥2 件的例子 |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| ±10 | 0.20 | 2 / 20 | 1 / 20 |
|
||||
| ±30 | 0.45 | 7 / 20 | 1 / 20 |
|
||||
| ±60 | 0.70 | 10 / 20 | 3 / 20 |
|
||||
| ±10 | 0.44 | 20 / 77 | 10 / 77 |
|
||||
| ±30 | 0.71 | 34 / 77 | 12 / 77 |
|
||||
| ±60 | 1.09 | 45 / 77 | 23 / 77 |
|
||||
|
||||
| 半径 | 方案 | n | 头名命中(raw) | 真值在区间 | 宽度中位 | 同 n 例的 C0(raw 头名 / 宽度) |
|
||||
| --- | --- | ---: | ---: | ---: | ---: | --- |
|
||||
| ±10 | C1_prior / C1_probe | 2 | 1.00 / 0.50 | 1.00 | 16 | 见 JSON per-arm(样本太少) |
|
||||
| ±30 | C1_prior | 7 | 0.71 | 1.00 | 31 | debug 判定 benefit(percent 口径头名 1.00) |
|
||||
| ±30 | C1_probe | 7 | 0.57 | 1.00 | 33 | no_benefit |
|
||||
| ±60 | C1_prior / C1_probe | 10 | 0.40 / 0.40 | 1.00 | 58 / 63 | no_benefit |
|
||||
六格硬红线 1 与同子集 C0 比(`raw`;truth = opposite):
|
||||
|
||||
**读法。** 可追问的经历很少(与 09-29 打字经历研究一致:绝大多数经历落在所有候选都一样的大运段),但在 ±30 上"恢复到月精度重算先验"(走线上已有的打字经历通道,不加卡片)对那 7 例有正向信号;"当作答是的卡"没有。样本太少,只能说值得在 v5 上按同口径重测;产品层实现(只对落在候选分歧点的那一件追问月份,算在定向追问 2 条额度内)要等 v5 判定。
|
||||
| 半径 | 方案 | n | 真值在区间(方案 / 子集 C0) | 头名(方案 / 子集 C0) | 宽度中位(方案 / 子集 C0) | 硬红线 1 | gate_verdict |
|
||||
| --- | --- | ---: | --- | --- | --- | --- | --- |
|
||||
| ±10 | C1_prior | 20 | 20 / 20 | 0.70 / 0.75 | 13 / 13 | **不过** | no_benefit |
|
||||
| ±10 | C1_probe | 20 | 20 / 20 | 0.60 / 0.75 | 12 / 13 | **不过** | no_benefit |
|
||||
| ±10 | C2_prior | 10 | 10 / 10 | 0.70 / 0.80 | 11 / 11 | **不过** | no_benefit |
|
||||
| ±30 | C1_prior | 34 | 34 / 34 | 0.47 / 0.47 | 36 / 37 | 过(头名持平,宽度 −1) | benefit |
|
||||
| ±30 | C1_probe | 34 | 34 / 34 | 0.41 / 0.47 | 32 / 37 | **不过** | no_benefit |
|
||||
| ±30 | C2_prior | 12 | 12 / 12 | 0.42 / 0.50 | 31 / 36 | **不过** | no_benefit |
|
||||
| ±60 | C1_prior | 45 | 44 / 44 | 0.36 / 0.42 | 71 / 71 | **不过** | no_benefit |
|
||||
| ±60 | C1_probe | 45 | 44 / 44 | 0.38 / 0.42 | 63 / 71 | **不过** | no_benefit |
|
||||
| ±60 | C2_prior | 23 | 22 / 22 | 0.48 / 0.52 | 75 / 75 | **不过** | no_benefit |
|
||||
|
||||
## 给产品的话
|
||||
`percent` 口径:`C1_prior` ±30 头名 0.79 vs 0.71、宽度 35 vs 32(宽度变宽,gate no_benefit)、±10 0.80 vs 0.85、±60 0.76 vs 0.80;`C1_probe` ±30 0.74 vs 0.71 且宽度 31 vs 32(gate benefit)但 ±10 / ±60 头名降。两个口径下没有一个臂在三档同时过。
|
||||
|
||||
- 三条流水线都跑通、与线上对账 0 差,**但没有任何一条在 v4 上能下结论**,20 例上 42 个特征有四分之三分不清正负。这一轮交付的是"能在 v5 上一键复跑的测量工具",不是新打分。
|
||||
- v4 上唯一方向明确的信号是负的:把口述时间线的空白当"没发生"会伤真值(R-B)。
|
||||
- v5 交付后的复跑命令:`PYTHONHASHSEED=0 python3 scripts/research/scoring_research.py --holdout references/real_case_calibration/minute_rectification_holdout_v5.json --dataset-label v5 --out-suffix v5_<日期>`。
|
||||
**读法。** (1) 能追问的经历确实少:±10 上 77 例只有 20 例有一件"知道月份就能分开候选"的经历,与 09-29 打字经历研究一致。(2) 对这些例子,"恢复到月精度重算先验"(走现有通道)在 ±30 上持平、±10 / ±60 上头名反而降;"当作答是的卡"在 ±10 / ±60 也降。之前 v4 上 ±30 的 7 例正向信号(0.71)在 77 例、同子集比较下消失。(3) 结论:**精度追问没有一致收益,不立实现单。** 产品若仍想做"只追问一件落在候选分歧点的经历",那是交互层面的取舍,本研究给不出精度上的理由。
|
||||
|
||||
## 5. 给产品的话
|
||||
|
||||
- **打分层这条路可以收口了。** 77 例、留一法、让数据定权重、加进 KP / Pranapada / D60,结果是:线上规则对"哪一分钟"的区分几乎为零,没有可校准的权重;把口述时间线的空白当"没发生"会伤真值。BUG-560(换尺度)继续 blocked、BUG-1091 按设计关闭。收窄仍然只能靠带年月的选择题——这与 09-14 定论一致,现在有了 77 例的证据。
|
||||
- 产品层的"对已说的事追问月份"(§4)与同子集基线比也没有一致收益:能追问的例子少(±10 只有 20 / 77),追问后头名多半不升。若要做,是交互层面的决定,不是精度收益。
|
||||
- 复跑:本页顶部命令;判定所用 JSON `dataset: v5`。
|
||||
|
||||
## 6. v4 脚手架阶段的数字(20 例,仅调试参考)
|
||||
|
||||
- 对账:20 例 × 3 档 = 60 个 case-radius 差异 0;两次复跑 JSON 逐字节一致(`scoring_research_*_2026_09_29.json`)。
|
||||
- R-A `raw` 留一法头名:±10 A1 / A2 / A3 0.70 / 0.75 / 0.80(基线 0.80);±30 0.55 / 0.60 / 0.65(0.55);±60 0.45 / 0.55 / 0.50(0.40)。真值在区间除 ±60 A3 0.95 外全 1.00。`percent` 口径挤出 3–5 例。42 个特征里 31 / 36 / 38 个跨 0。
|
||||
- R-B:@2.0 分覆盖 0.85 / 0.70 / 0.40;@0.5 / 1.0 覆盖 1.00 但头名降。
|
||||
- R-C:可追问件数每例均值 0.20 / 0.45 / 0.70;±30 C1_prior 7 例头名 0.71。
|
||||
- 这些数字与 v5 方向一致,但 v4 上看似"有信号"的九个特征在 v5 上全部回到噪声——扩集单(BUG-1090)的必要性由此坐实。
|
||||
|
||||
## 附:复跑命令
|
||||
|
||||
```bash
|
||||
PYTHONHASHSEED=0 python3 scripts/research/scoring_research.py --cache-dir /tmp/scoring_ctx # 约 14 分钟,写三份 JSON
|
||||
PYTHONHASHSEED=0 python3 scripts/research/scoring_research.py --limit 3 --radii 10 --fast --no-write # 开发用
|
||||
PYTHONHASHSEED=0 python3 scripts/research/scoring_research.py --holdout references/real_case_calibration/minute_rectification_holdout_v5.json --dataset-label v5 --cache-dir /tmp/scoring_ctx --probes-per-variant --out-suffix v5_2026_09_29 # 约 48 分钟
|
||||
PYTHONHASHSEED=0 python3 scripts/research/scoring_research.py --cache-dir /tmp/scoring_ctx # v4,约 13 分钟
|
||||
PYTHONHASHSEED=0 python3 scripts/research/scoring_research.py --limit 3 --radii 10 --fast --no-write # 开发用
|
||||
python3 -m pytest tests/test_scoring_research.py -q
|
||||
```
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user