# 压力模型“去掉 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` 的代码和数据状态。