Commit Graph

25 Commits

Author SHA1 Message Date
f97527598d feat: 各步骤产物改为原子化落盘,复用前校验 .done 完成标记
跳过条件从 Path.exists() 改为 is_file_complete(),产物成功落盘后统一补 mark_file_complete()。涉及 step1 水域掩膜、step3 去耀斑、SHP 栅格化缓存三处快路径。

step3 去耀斑新增清理分支:无 .done 标记的旧文件一律视为半成品,先删除再重跑(Kutser/Goodman/Hedley/SUGAR 四种方法一致)。

模型落盘改为 atomic_filepath:modeling_batch 批量建模与 automl_trainer 的 AutoML 结果均先写 .__wip 再原子替换,避免中断产生半个 joblib 文件。
2026-09-15 10:34:34 +08:00
f801b481fe fix: SVR+MNF 训练管线三个致命 Bug 修复
1. SVR y 尺度修复 (modeling_batch.py):
   - TransformedTargetRegressor 包裹 SVR,自动标准化 y 后训练
   - 超参前缀 model__ → model__regressor__ (穿透包裹层)
   - _find_svr_in_pipeline 兼容新的 TransformedTargetRegressor 嵌套

2. MNF 噪声估计修复 (spectral_Preprocessing.py):
   - 旧: noise = X[1:] - X[:-1] (假设空间连续,对打乱数据错误)
   - 新: noise = X - savgol_filter(X) (SG 滤波残差提取纯光谱噪声)
   - 附带波段数检查和异常兜底

3. DualStream_MNF 补标准 (spectral_Preprocessing.py):
   - FeatureUnion 外再包 Pipeline + StandardScaler
   - MNF 主成分(±10) 和 Physical 指数(0.001) 统一量纲后再送 SVR
2026-08-04 09:10:18 +08:00
f0b9f178da feat: 光谱黄金区间过滤 — 训练波长统一收缩到 400-1000nm
- 新增 WAVELENGTH_RANGE = (400.0, 1000.0) 类常量
- 新增 _is_wavelength_in_range() 范围感知波长列判断
- _extract_train_wavelengths() 自动过滤超出区间的波长
- _extract_feature_columns / train_single_model / pre-scan 三处调用点
  统一切换为范围感知判断
- 效果: 308 波段 → 300 波段 (裁掉 <400nm 的 4 个 + >1000nm 的 4 个)
- 推理端通过 metadata train_wavelengths 自动继承过滤后的网格
2026-07-30 13:12:14 +08:00
b19cb427b9 feat: MNF 诊断系统 + 全局对齐两遍扫描法
【MNFTransformer 增强】(spectral_Preprocessing.py)
  - fit() 存储 eigvals_w_/eigvals_ratio_/eigvals_cumsum_ 实例属性
  - _print_band_selection() 精简 3 行控制台输出 (总成分/选中数/Top3 贡献率)
  - get_diagnostics_dict() 返回结构化诊断字典供 JSON 导出

【模型保存增强】(modeling_batch.py)
  - save_model: joblib.dump 前注入 metadata['mnf_diagnostics']
  - save_model: 并行导出 *_mnf_diag.json 独立诊断文件
  - 部署 npz 新增 mnf_eigvals/_ratio/_cumsum 三个特征值数组

【批量训练报告】(modeling_batch.py)
  - _generate_mnf_report() 生成 batch_mnf_eigenvalue_report.md
  - 按目标列+模型分块,每个选中成分按特征值降序列出具体数值
  - 容错:无 MNF 模型时标注警告,不崩溃

【MNF 全局对齐 — 两遍扫描法】(modeling_batch.py)
  - 第一遍预扫描: 对每个目标 fit MNFTransformer(0.95),记录所需成分数
  - 取全局最大值 global_max_mnf_components (兜底 50)
  - 第二遍正式训练: 所有 Pipeline 统一使用固定整型成分数
  - 仅当启用 DualStream_MNF 时触发,非 MNF 场景透明跳过
  - get_preprocessing_transformer 新增 mnf_n_components 参数透传链
2026-07-30 12:43:49 +08:00
88dd1ae1d8 revert: 回退 StandardScaler — 跨传感器场景下双重归一化导致推理坍缩
- 删除 Pipeline 中 scaler(StandardScaler) 步骤
- 删除 save_model 中 scaler_mean/scaler_scale 导出
- 删除 StandardScaler import
- 恢复: imputer → FeatureUnion → cleaner → SVR
- MNF 白化本身就是尺度对齐,无需额外标准化
2026-07-29 15:54:05 +08:00
67900c7aa6 fix: 补充 StandardScaler 导入 2026-07-29 15:46:14 +08:00
3edb73b652 fix: DualStream Pipeline 三项修复 — StandardScaler + 部署导出 + 推理拆弹
任务1: Pipeline 插入 StandardScaler
  imputer → FeatureUnion → cleaner → scaler(StandardScaler) → SVR
  MNF(≈1e4量级)与物理指数(≈1e0量级)统一尺度后入SVR

任务2: .npz 导出 scaler_mean / scaler_scale
  C++端可复现 (X - mean) / scale

任务3: 推理端 train_wavelengths 缺失时直接抛异常
  不再静默裸退308列导致 SimpleImputer 维度不匹配崩溃
2026-07-29 15:41:25 +08:00
6849ff6877 feat: 新增 Physical_Only 预处理分支 — 纯物理特征+标准化,与 MNF A/B 对比
spectral_Preprocessing.py:
- 新增 Physical_Only 分支: Pipeline[PhysicalFeatureExtractor + StandardScaler]
- 纯物理特征流: 20个指数 → StandardScaler → SVR
- DualStream_MNF 逻辑完全不变

modeling_batch.py:
- preprocessing_methods 新增 Physical_Only
- 训练时 Physical_Only 也只取纯光谱50列
- 波长列表传递覆盖 Physical_Only

GUI:
- 两个面板同步新增「纯物理特征 (指数+标准化)」选项
2026-07-29 14:32:59 +08:00
f4a927386b refactor: DualStream 纯光谱输入 — 消除 WQI 冗余双向断层
训练端:
- DualStream_MNF 时只取纯光谱列(50列)传给 Pipeline
- PhysicalFeatureExtractor + MNFTransformer 都只收纯光谱
- 不再从 CSV 预读 WQI 列混入输入

推理端:
- 只做 308→50 光谱重采样,不补 WQI
- pipeline.predict() 自动完成 Physical 指数计算 + MNF 降维
- 删除 30+ 行 WQI 补齐代码

训练/推理完全对称: 纯光谱入 → FeatureUnion → SVR 出
2026-07-29 13:15:10 +08:00
40f12b569e fix: 部署导出 _feat_cols_ 解包适配新4元组(name,ftype,ia,ib) 2026-07-29 10:42:17 +08:00
58bad4081e feat: PhysicalFeature 扩展到全部63个水色指数 + MNF成分数自动确定
PhysicalFeatureExtractor:
- 废弃硬编码3指数(NDVI/NDWI/AlgaeRatio),改为调用
  WaterQualityIndexCalculator.calculate_many() 计算全部63个公式
- 涵盖 BGA(25)/Chl(16)/Turb(10)/TSM(3) 等完整指数集

MNFTransformer:
- n_components 支持 float(0~1): 根据累积方差比自动确定成分数
  n_components=0.95 → 保留95%方差的成分
- fit 后保存 n_components_ (实际成分数) 供部署导出使用
- Wp 显式按特征值降序排列
2026-07-29 10:37:09 +08:00
495857913d refactor: RandomizedSearchCV → GridSearchCV — SVR 超参全量穷举
- SVR 参数网格仅 216 种组合(4×6×3×3),全量搜索 ~2s 完成
- 之前 n_iter=10 只抽样 4.6%,靠运气撞最优参数
- 删除 n_iter 和 random_state 参数(GridSearchCV 不需要)
- 保留 RandomizedSearchCV import 供其他模型(参数空间大的)使用
2026-07-29 10:28:17 +08:00
6aaaea5abd fix: inf→NaN 清洗兼容 ndarray(spxy/ks 返回 ndarray 无 .replace) 2026-07-29 10:22:47 +08:00
80189a9f44 fix: 补充 BaseEstimator/TransformerMixin 导入 2026-07-29 10:20:57 +08:00
12866f12b0 fix: Pipeline 安全网 — preproc 与 model 间插入 _SafeFiniteTransformer
- 新增 _SafeFiniteTransformer: np.nan_to_num + clip(±1e15)
- 放在 Pipeline preproc→model 之间,无论 MNF 数值溢出还是
  PhysicalFeatureExtractor 除零,SVR 收不到 inf/NaN
- X_train/X_test 入口先 replace(inf→NaN),SimpleImputer 接力填充
2026-07-29 10:20:00 +08:00
09f8d89b56 fix: PhysicalFeatureExtractor 修复 ndarray 输入时波长丢失问题
- SimpleImputer 把 DataFrame → ndarray,PhysicalFeatureExtractor.fit()
  收不到列名导致 ValueError: 必须在 __init__ 中提供 wavelengths
- get_preprocessing_transformer 新增 wavelengths 可选参数
- train_single_model 在 DualStream_MNF 时提取 X_raw 波长列表传入工厂
- PhysicalFeatureExtractor 已有 ndarray + wavelengths 参数的处理分支
2026-07-29 10:11:01 +08:00
4347988ab2 feat: 训练框架适配 DualStream_MNF + 部署矩阵 .npz 导出
modeling_batch.py:
- preprocessing_methods 新增 DualStream_MNF
- save_model 新增 C++/Rust 部署导出逻辑:
  自动检测 Pipeline 中的 MNFTransformer + SVR,
  提取 mean_/W_mnf_/dual_coef_/support_vectors_/
  intercept_/gamma/kernel 等纯量矩阵,
  保存为 *_deploy.npz 文件
- 新增 _find_mnf_in_pipeline / _find_svr_in_pipeline /
  _find_physical_extractor_in_pipeline 辅助方法,
  支持 FeatureUnion 嵌套递归查找
2026-07-29 10:02:37 +08:00
89b67fbd34 fix: ML Pipeline 缺失值填充 + 推理端外部模型 dict 兼容
- modeling_batch: Pipeline 首步新增 SimpleImputer(median) 填充 NaN
- inference_batch: 外部模型支持完整 dict(含 metadata/train_wavelengths),
  兼容旧版裸 Pipeline 对象
- step9_ml_predict_panel: 模型加载保留完整 dict 而非仅 model 对象,
  确保推理端可从 train_wavelengths 做光谱重采样
2026-07-28 14:59:11 +08:00
92e8c90370 feat: ML模型波长记忆 + 跨传感器光谱重采样 + 数据加载规范化
训练端 (modeling_batch.py):
- _extract_train_wavelengths() 从列名提取训练波长写入 metadata
- load_data_batch/load_data_single 改为基于列名语义智能提取特征
- 废除 feature_start_column 硬编码位置索引

推理端 (inference_batch.py):
- preprocess_spectra() 分支A: train_wavelengths存在→np.interp精确重采样
- preprocess_spectra() 分支B: 无波长元数据→解析列名→np.interp到400-800nm标准网格
- 废除暴力截断和零值填充
2026-07-27 14:52:30 +08:00
DXC
e337f01312 全局修正 2026-06-29 16:16:55 +08:00
DXC
d6c003a211 fix: Step7 UI坍塌修复+EventBus打通 + DRY抽离spxy/ks + GridSearchCV→RandomizedSearchCV + smoke test死链修复 2026-06-18 11:18:27 +08:00
DXC
91881d564a fix: 修复 Step8 模型生成路径错误及特征分离未过滤坐标列导致的 0 模型 Bug
- view 层 Step8View.update_work_directory 不再生成 <work_dir>/indices/<basename>_indices.csv,改为生成标准的 <work_dir>/8_Modeling/ 模型存放目录;FileSelectWidget 标签与文件过滤器同步调整为目录语义(输出模型目录 / All Files (*.*)),消除'保存目录被存成 csv 文件'导致的 train_models 跳过判定。
2026-06-17 14:15:34 +08:00
DXC
170d347e21 内容部分修改 2026-05-11 17:38:29 +08:00
8025869b76 调整缩放、多核运行、图标显示 2026-04-09 17:25:52 +08:00
91e36407ae Initial commit of WQ_GUI 2026-04-08 15:25:08 +08:00