跳转至

v0.7.1

本次 minor release 将此前已 opt-in、并在 0.6.x 明确预告的治理默认值正式收紧,补齐 G06-2 分类变量 VIF 门,并修复无权重路径 corr 阶段的类别特征回归(R1)。升级后,如需维持旧口径,请显式传入旧值;只有下文明确说明的参数仍以显式 None 保留 0.6.x 行为。

版号说明:为什么没有 v0.7.0

0.7.0 在发布前的现场验证(下游以源码方式预跑)中发现 R1 回归,该版号未发布即作废。0.7.10.7.x 线的首个发布版本,内容 = 原定 0.7.0 全部变更 + R1 修复及其加固。文中"0.7.1 起"的行为,均自本版本起生效。

默认治理收紧

OOT 使用边界

  • synthesize_missing_oot 默认 False:没有真实 OOT 时,不再把 OOS 副本标成 OOT。CMP 不再创建 "oot" split;FVP 保留空 OOT 表示,相关下游步骤会跳过它。
  • CMP 默认 evaluation_splits=["ins", "oos"],默认模型评估、图表和 Excel 不再消费 OOT;extra_eval_datasets 仍是独立的 eval-only 输入。
  • search_eval_splits 默认 ["oos"],LR search 与 Optuna 不再把 OOT 放进候选调参的 eval sets;backward_validation_split 继续是 "oos"backward_report_splits 默认 [],避免逐轮 backward 报告读取 OOT。
  • 真实 OOT 仍可通过显式配置进入相应阶段;forbidden_splits 的消费点硬闸和 split_governance / 模型 metadata 审计字段继续生效。

WOE 与评估方向

  • FVP woe_fit_scope 默认从 "all" 变为 "post_missing_gate":先执行 selection-grade 缺失率门,再对幸存变量拟合顶层 WOE,避免单个高缺失变量使整组 WOE 产物失效。需要历史口径时显式传 "all"
  • MonotoneWOEBinner.refine_min_n_bins_policy 默认从 None 变为 "warn"refine_dtree() 若把普通箱数压到 min_n_bins 以下会留下可见告警;"enforce" / "raise" 仍可按更严格的治理需求使用,显式 None 可关闭该检查。
  • gains_ascending 默认 True:分数升序、bin 1 为低分/低风险。Gains summary、加权 Gains 和评估分布图使用同一方向,消除了旧版表格与图表路径的方向漂移;显式 False 统一降序,显式 None 保留 0.6.x 各路径历史方向。

G06-2:分类变量 VIF 门

selection_params 新增 vif_use_woe_bins,默认 False,并保留原始数值 VIF 的兼容语义:

  • Raw VIF 只把数值幸存变量送入 statsmodels;字符串、object 与其他非数值列会保留在选择结果中,不会因 VIF 被误删。运行会发出 UserWarning,并在 selection summary / VIF stage artifact 中持久记录排除列;数值不足时以 skipped_insufficient_numeric 跳过该门。
  • bool 和 pandas nullable numeric/boolean 只在 VIF 矩阵中转成浮点,普通 NumPy 数值输入保持原有行为。
  • vif_use_woe_bins=True 时,VIF 基于 INS 的 WOE 编码矩阵,分类变量可参与共线性判断。该路径惰性创建 adapter、尊重自定义 WOE 后缀、在副本上 transform,并会对预拟合 engine 覆盖不完整给出可操作的错误。
  • 对声明的分类变量,WOE-VIF 需要 woe_engine="monotone"equal_freqWOE_Master 不支持这一分类拟合路径,会在拟合前明确报错。

FVP 已把该字段透传到筛选配置,并在 selection_config_snapshot 中记录最终值。

R1:无权重路径 corr 阶段的类别特征回归

0.7.0 预发布现场验证发现:无权重(不传 weight_col)的特征筛选 / FVP selection,类别特征(str / StringDtype)到达 corr 去重阶段时整个筛选崩溃(ValueError: could not convert string to float)。根因是两个 CorrelationFilter(基类与 WOE patch 类)的相关矩阵始终基于 raw 值构建——corr_use_woe_bins 此前只影响 IV tie-break 指标、从未影响矩阵基;0.7.x 的默认治理收紧让类别幸存变量真正走到 corr 阶段,潜在缺陷因此显形(0.6.8 同样输入死在更晚的 VIF 门,即 G06-2)。加权路径一直正确,本次零改动——本修复正是把无权重侧对齐到加权侧既有的"排除 + 告警 + 保留"语义。

  • corr_use_woe_bins=True(FVP 默认)且 screening binner 能编码该列:混合矩阵基。 数值列保持 raw(数值-数值去重与旧版逐字节一致),类别列以 WOE 编码值(原列名)进入矩阵、与其它列一同参与去重;完全相同的类别孪生列会正常去重掉一个。binner 未覆盖的列被排除出矩阵、保留在选择结果中,并给出一条 UserWarning(提示 refit 覆盖该列)。
  • corr_use_woe_bins=False 或走基类:数值子集矩阵。 非数值列排除 + 保留 + 一条 UserWarning(提示可开 corr_use_woe_bins=True 让类别参与去重)。
  • 被排除列永不因 corr 被删;纯数值输入在两类上均逐字节保持旧行为、零告警;每次矩阵构建至多一条告警,多轮迭代不重复告警。
  • 引擎不可用响亮失败:配置了不受支持的 WOE 引擎对象且类别列到场时,corr 阶段直接抛出带上下文的 TypeErrorfrom 链上原始错误),不再静默把全部类别列降级排除;受支持引擎的列级覆盖缺口仍走软告警路径。
  • corr_use_woe_bins=True 下加权与无权重的矩阵基刻意不同(加权全列 WOE;无权重数值 raw + 类别 WOE):这是为保住无权重数值路径逐字节兼容的取舍。raw 基(corr_use_woe_bins=False)在全 1 权重下与加权路径选择结果精确一致。

迁移提示

若业务确实需要恢复旧行为,请显式设置相应值,例如:

CreditModelPipelineConfig(
    synthesize_missing_oot=True,
    evaluation_splits=["ins", "oos", "oot"],  # 仅在真实 OOT 存在时
    search_eval_splits=["oos", "oot"],
    backward_report_splits=["oot"],
    gains_ascending=None,  # 精确保留 0.6.x 各评估路径的历史方向
)

FeatureValidationPipelineConfig(
    woe_fit_scope="all",
    monotone_woe_params={"refine_min_n_bins_policy": None},
)

显式消费 OOT 前,应先确认它是业务真实 OOT,而不是历史版本合成的 OOS 副本。