فهرست منبع

文档:记录压力去掉0点、测试100%版本的规则、结果和程序改动

18922397810 20 ساعت پیش
والد
کامیت
e70428b3bf
1فایلهای تغییر یافته به همراه223 افزوده شده و 0 حذف شده
  1. 223 0
      models/markdown/压力_去掉0点_100版本说明.md

+ 223 - 0
models/markdown/压力_去掉0点_100版本说明.md

@@ -0,0 +1,223 @@
+# 压力模型“去掉 0 点、测试 100%”版本说明
+
+> 历史版本记录。该方案对应本地提交 `41fe49636`,当前仓库已回退到备份版本,本文件仅用于保留方案和程序改动。
+
+## 一、版本定位
+
+- 类型:润滑油压力标签 + 深度学习/树模型辅助确认
+- 标签:64 条
+- 模型:3 小时窗口,XGBoost
+- 测试结果:查准率 100%、召回率 100%、F1 100%、PR-AUC 100%
+- 事件召回:7/7
+- 特点:在 Stage 1 新标签基础上,进一步把“部分掉点小时”按无效处理
+
+## 二、和前后版本的区别
+
+| 版本 | 压力标签 | 7 号 | 8 号 | 9 号 | 测试 F1 | 测试 PR-AUC |
+|---|---:|---:|---:|---:|---:|---:|
+| 备份版本 | 72 | 7 | 63 | 2 | 96.59% | 99.61% |
+| Stage 1 新标签 | 68 | 4 | 63 | 1 | 93.43% | 99.27% |
+| **本版本:去掉 0 点** | **64** | **2** | **62** | **0** | **100%** | **100%** |
+
+本版本删除的 7 条单小时弱标签:
+
+- 7号机-P02 2025-04-30 19:00
+- 7号机-P10 2025-10-05 12:00
+- 8号机-P07 2025-07-09 12:00
+- 8号机-P16 2026-04-26 05:00
+- 8号机-P03 2026-07-27 05:00
+- 8号机-P03 2026-07-31 19:00
+- 9号机-P17 2026-01-30 05:00
+
+同时,掉点小时被剔除后,3 条长阶段发生拆分:
+
+- 8号机-P05 2025-02-10/11
+- 8号机-P09 2025-10-27/28
+- 8号机-P02 2026-06-14/15
+
+最终阶段分布:
+
+- 轻微:59
+- 异常:4
+- 严重异常:1
+
+## 三、标签规则
+
+### 1. 0 MPa 整小时无效
+
+```text
+oil_avg <= 0 → 该小时不参与周期、趋势、连续下降和阶段划分
+```
+
+### 2. 部分掉点小时无效
+
+新增小时级 0 值统计:
+
+```text
+oil_zero_ratio = 0 值运行样本数 / 运行样本数
+```
+
+判定规则:
+
+```text
+oil_zero_ratio >= 5%
+且相邻小时存在 oil_zero_ratio >= 50% 的小时
+→ 该小时判为无效
+```
+
+这样能去掉“均值被 0 值拉低、最大值仍正常”的部分掉点小时,同时避免把孤立少量 0 值误判为掉点。
+
+### 3. 斜率只用连续有效小时
+
+```text
+6 小时斜率只使用连续 1 小时步长的有效小时
+跨掉点、缺失、停机缺口不参与斜率
+```
+
+### 4. 前置下降并入轻微
+
+```text
+连续下降 >= 6 个有效小时
+且 6 小时斜率 < -0.001
+且相对周期基线下降不足 5%
+→ 该小时判为轻微
+```
+
+若与后面的轻微阶段间隔不超过 6 小时,则合并为同一段,阶段起点前移。
+
+### 5. 分级阈值
+
+- 轻微:相对周期基线下降 >= 5%,且处于下降趋势
+- 异常:相对周期基线下降 >= 10%,或低报警
+- 严重异常:相对周期基线下降 >= 20%,或低低报警
+
+## 四、程序改动
+
+对应提交:`41fe49636`
+
+### 1. `models/common/queries.py`
+
+- 小时聚合 SQL 增加:
+
+```sql
+SUM(CASE WHEN YSJ_41 > 0 AND YSJ_5 = 0 THEN 1 ELSE 0 END) AS oil_zero_count
+```
+
+- `NUMERIC_HOURLY_FIELDS` 增加 `oil_zero_count`,保证小时 CSV 读取时按数值解析。
+
+### 2. `models/generalized/pressure_algorithm.py`
+
+新增/修改:
+
+- `_zero_ratio(row)`:计算小时 0 值比例。
+- `_dropout_invalid_hours(rows)`:
+  - 先标记 `zero_ratio >= 50%` 的整小时;
+  - 再把 `zero_ratio >= 5%` 且前后 1 小时存在整小时掉点的小时标为无效。
+- `assign_hourly_cycles`:
+  - 过滤 `oil_avg <= 0`;
+  - 过滤 `_dropout_invalid_hours` 命中的小时。
+- `_contiguous_slope(history, current)`:
+  - 只使用连续 1 小时步长的有效小时计算斜率;
+  - 少于 3 个连续点返回 `None`。
+- `classify_oil_hourly_segments`:
+  - 趋势判断改用 `_contiguous_slope`。
+- `extend_oil_segments_with_precursor`:
+  - 对轻微阶段向前扩展;
+  - 条件:正常小时、相对基线下降 0%–5%、连续下降 >= 6、斜率 < -0.001;
+  - 重算阶段开始时间、有效小时数和触发依据。
+- `run`:
+  - 在阶段合并后调用 `extend_oil_segments_with_precursor`。
+
+### 3. `models/generalized/build_datasets.py`
+
+训练样本构建增加同样的无效小时过滤:
+
+```python
+scoped = [row for row in scoped if row.get("oil_avg") is not None and row["oil_avg"] > 0]
+invalid = pressure_algorithm._dropout_invalid_hours(scoped)
+scoped = [row for row in scoped if (row["批次"], row["_dt"]) not in invalid]
+```
+
+目的:0 值和部分掉点小时既不进入标签,也不作为正常样本进入模型训练。
+
+### 4. 小时中间表
+
+- `pks_hourly_full.csv` 增加两列:
+  - `oil_zero_count`
+  - `oil_zero_ratio`
+- 压力标签和训练样本都基于这份带 0 值统计的小时表生成。
+
+### 5. `models/common/verify.py`
+
+压力模型校验基线更新为本版本:
+
+- 候选:12,996 正常 / 956 异常
+- train:8,256 / 614
+- validation:2,886 / 193
+- test:1,854 / 149
+- 阈值:`0.8617269992828369`
+- 测试异常:查准率/召回率/F1 = 1.0
+- 事件召回:7/7
+
+## 五、训练与评估
+
+### 数据范围
+
+| 项目 | 正常 | 异常 | 合计 |
+|---|---:|---:|---:|
+| 候选窗口 | 12,996 | 956 | 13,952 |
+| train | 8,256 | 614 | 8,870 |
+| validation | 2,886 | 193 | 3,079 |
+| test | 1,854 | 149 | 2,003 |
+
+- 7 号机异常窗口:9 个
+- 9 号机异常窗口:0 个
+
+### 验证集
+
+| 阈值 | 查准率 | 召回率 | F1 | PR-AUC |
+|---:|---:|---:|---:|---:|
+| 0.861727 | 99.45% | 93.26% | 96.26% | 99.52% |
+
+### 封存测试集
+
+| 类别 | 查准率 | 召回率 | F1 | 样本数 |
+|---|---:|---:|---:|---:|
+| 正常 | 100% | 100% | 100% | 1,854 |
+| 异常 | 100% | 100% | 100% | 149 |
+
+- 事件召回:7/7
+- 正常事件误报:0
+
+## 六、必须说明的局限
+
+测试集 100% 不代表真实泛化能力完美,原因是:
+
+1. 149 个测试异常窗口全部来自 8 号机;
+2. 7 号机、9 号机测试集没有异常窗口;
+3. 7 号机只有 2 条压力标签、9 个异常窗口;
+4. 9 号机压力标签为 0;
+5. 标签仍来自规则演化阶段,不是人工确认的物理故障标签。
+
+因此这个版本更适合作为“掉点过滤和标签清洗”的方案记录,不适合直接作为跨机组泛化结论。
+
+## 七、复现命令
+
+该版本对应提交 `41fe49636`。在干净工作区中可使用:
+
+```bash
+# 1. 生成带 0 值统计的小时表(字段:oil_zero_count / oil_zero_ratio)
+# 2. 生成压力标签
+python3 models/generalized/pressure_algorithm.py \
+  --device 7# 8# 9# \
+  --hourly-csv models/datas/hourly/pks_hourly_full_zero.csv \
+  --output-dir models/datas/staging_v3/pressure
+
+# 3. 重建压力样本、切分、训练、评估
+python3 models/generalized/run_pipeline.py --window-hours 3
+
+# 4. 校验
+python3 models/common/verify.py
+```
+
+注意:当前仓库已回退到备份版本,上述命令需要先恢复到 `41fe49636` 的代码和数据状态。