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.1 是 0.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_freq的WOE_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 阶段直接抛出带上下文的
TypeError(from链上原始错误),不再静默把全部类别列降级排除;受支持引擎的列级覆盖缺口仍走软告警路径。 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 副本。