DEBUG.WIKI
晚安云;香港 CN2 ¥15/月
PanstarCloud:部署应用,接入 AI,云服务器与 AI 网关
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →

TargetEncoder 开启元数据路由后报 KeyError: groups

合法的非分组目标编码在启用 metadata routing 后可能因缺少 groups 键失败。局部关闭未使用的路由或明确传入 None,并保留训练交叉拟合。

TargetEncoder().fit_transform(X, y) 在普通配置下能运行,开启 enable_metadata_routing=True 后却报 KeyError: 'groups'。数据并不一定缺少一个必须的业务字段;scikit-learn 1.9.1 的一条路径直接读取了尚未传入的参数键。

该实现只在启用元数据路由时进入 params["groups"],而 params 包含的只是调用方实际传入的参数。因此不使用分组、未提供 groups 的合法调用,也可能在内部交叉拟合开始前失败。默认 cv=5 与普通 StratifiedKFold 都不要求为了避开这个异常随意创建分组。

独立调用且没有元数据时,局部关闭路由

若这一次编码确实没有需要路由的 groups、权重或其他元数据,可以把配置限制在当前直接调用:

from sklearn import config_context
from sklearn.preprocessing import TargetEncoder

encoder = TargetEncoder(random_state=0)
with config_context(enable_metadata_routing=False):
    encoded_train = encoder.fit_transform(X, y)

X、y 使用原训练数据,其他编码参数按原任务保留。上下文退出后恢复外部配置,避免全局切换影响其他组件。示例没有关闭交叉拟合;fit_transform 仍按 TargetEncoder 的训练规则运行。

若实际是依赖元数据路由的 Pipeline、ColumnTransformer 或分组拆分器,不能把整个组合的路由关掉而丢失元数据。先确定堆栈确实是缺少该键,再评估直接对编码器传 groups=None:在这条路径中,显式 None 可让键存在,并表示没有分组。组合估计器如何向内部组件传参,仍须遵守其当前路由接口,不能把直接调用的参数位置照搬进去。

不要用 fit 再 transform 绕过训练入口

TargetEncoder.fit(X,y).transform(X) 与 fit_transform(X,y) 不等价。后者利用内部交叉拟合减少训练数据中目标信息的泄漏;前者对同一训练数据转换时会使用全量拟合的统计。仅为让缺键异常消失而替换调用方式,可能让验证分数变得过于乐观。

也不要制造一列每行都相同的 groups,或将每一行编成独立分组来填参数。若实际存在组隔离要求,应提供真实组标识并选用匹配的 splitter;那属于评估设计,不能由一个内部缺键异常替你决定。

验收关注编码规则而非只看返回数组

先用同一份数据和固定随机状态,对照原先未启用路由的 fit_transform 与局部处理后的结果。核对样本行序、输出形状、类别处理、未知值政策以及交叉拟合拆分。若原流程含有其他路由元数据,再单独确认它们仍到达正确组件。

正式 1.9.1 仍包含直接读取 params["groups"] 的实现,不能根据后续问题关闭就认定当前正式安装包已修复。升级后应在干净配置下分别运行未传 groups、显式 None 和真实分组场景,再决定是否移除局部处理。恢复原配置前保留旧模型与编码参数,避免新旧编码统计混用。