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 做光谱重采样
This commit is contained in:
duxin
2026-07-28 14:59:11 +08:00
parent 02592cc181
commit 89b67fbd34
3 changed files with 15 additions and 6 deletions

View File

@ -20,6 +20,7 @@ from sklearn.ensemble import GradientBoostingRegressor, AdaBoostRegressor, Extra
from sklearn.tree import DecisionTreeRegressor
from sklearn.neural_network import MLPRegressor
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from joblib import parallel_backend
# 第三方模型导入
# try:
@ -611,6 +612,7 @@ class WaterQualityModelingBatch:
# ============ 关键:把预处理器塞进 Pipeline ============
preproc = get_preprocessing_transformer(preprocess_method)
pipeline = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('preproc', preproc),
('model', base_model),
])

View File

@ -48,9 +48,15 @@ class WaterQualityInference:
# 规范化 loaded_model_data:始终为 dict,确保 ['model'] 访问不崩溃
if external_model is not None:
# 外部传入的是裸模型对象 → 包装为 dict,统一后续 .get('model') 访问
self.loaded_model_data = {'model': external_model, 'preprocess_method': 'None'}
print(f" 外部模型已规范化: type={type(external_model).__name__}")
# ★ 外部模型可能是完整 dict(含 model + metadata + train_wavelengths),
# 也可能是裸 Pipeline 对象(旧版兼容)
if isinstance(external_model, dict) and 'model' in external_model:
self.loaded_model_data = external_model
print(f" 外部模型已规范化: dict (含 metadata)")
else:
self.loaded_model_data = {'model': external_model,
'preprocess_method': 'None'}
print(f" 外部模型已规范化: type={type(external_model).__name__}")
else:
self.loaded_model_data = None

View File

@ -253,13 +253,14 @@ class Step9MlPredictPanel(QWidget):
try:
loaded = joblib.load(joblib_path)
if isinstance(loaded, dict) and "model" in loaded:
model_obj = loaded["model"]
# ★ 保留完整 dict(含 metadata / train_wavelengths),
# 推理端需要 train_wavelengths 做光谱重采样
models_found[subdir_name] = loaded
elif hasattr(loaded, "predict"):
model_obj = loaded
models_found[subdir_name] = loaded
else:
errors.append(f"{subdir_name}: 无法识别的格式 {type(loaded).__name__}")
continue
models_found[subdir_name] = model_obj
except Exception as e:
errors.append(f"{subdir_name}: {type(e).__name__}: {e}")