DEBUG.WIKI
丽萨主机;为跨境业务选好 IP;原生 / 住宅 IP · 按套餐选择;查看 IP →
晚安云;香港 CN2 ¥15/月
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS

OrdinalEncoder 逆变换把缺失值和低频类别对调

OrdinalEncoder 同时处理低频类别与 NaN 时,inverse_transform 可能给出相反标签。按编码器已拟合映射核对往返结果,避免改几个编码值掩盖错误。

OrdinalEncoder.transform() 给低频类别编码 2、给缺失值保留 NaN,看起来没有问题;调用 inverse_transform(),低频类别却变成 NaN,缺失值变成 infrequent_sklearn。检查编码阶段通过,不能证明逆变换也保持了含义。

scikit-learn 1.9.1 的具体触发条件是同一特征同时有缺失类别和低频分组,例如 min_frequency=2。逆变换计算低频组编码时把缺失类别也计入类别总数,可能与缺失类别的位置撞在一起。

用两种行分别检查往返

下面的输入明确包含高频 a,b、一次出现的 c,以及两个缺失值:

import numpy as np
from sklearn.preprocessing import OrdinalEncoder

X = np.array(
    ["a"] * 5 + ["b"] * 5 + ["c"] + [np.nan] * 2,
    dtype=object,
).reshape(-1, 1)
encoder = OrdinalEncoder(min_frequency=2).fit(X)
codes = encoder.transform(X)
restored = encoder.inverse_transform(codes)

最后三行在编码后应为 2、NaN、NaN;逆变换的正确含义是低频组标记、缺失、缺失。低频分组本来就会丢失原来的具体标签,因此不能要求这个 c 必然原样还原;需要保护的是“低频”和“缺失”这两个不同类别。

记录 categories_、infrequent_categories_、encoded_missing_value、unknown_value 与拟合数据列序。不要仅凭自己猜测的最大编码值,给已保存模型改几个数字。

必须可靠还原时,评估是否停用低频分组

如果下游确实要保留每一个已知类别,且资源允许,不启用低频分组可以避开这项组合:

plain_encoder = OrdinalEncoder(
    min_frequency=None,
    max_categories=None,
).fit(X)
plain_codes = plain_encoder.transform(X)
plain_restored = plain_encoder.inverse_transform(plain_codes)

此时 c 作为独立类别保留,而不是归入 infrequent_sklearn。这会改变特征表示和类别数量;真实流水线中的编码器、模型及缓存结果必须按新的契约一起重新拟合或重建,不能只把旧编码器的参数改掉后继续用其已拟合状态。

如果模型必须使用低频合并,保留原始缺失掩码和类别映射,在错误路径修复前避免把受影响逆变换当作业务标签来源。对必须恢复到原始行的报告,可按保存的原数据关联,不能从低频组编码反推出已经合并掉的具体类别。

不能把全部 NaN 改成一个随意字符串再不加说明地拟合。那个字符串会成为新类别,还可能因频次不足被再次并入低频组,缺失语义与部署规则都需要重新设计。

还要区分未知类别

未知类别、拟合时的缺失值和低频类别是三种情形。验收分别覆盖它们,并检查输出类型和占位值;只比较行数不变,无法发现相互调换。若使用 handle_unknown="use_encoded_value",核对未知编码没有与其他有效编码冲突。

正式 1.9.1 仍有上述计数路径,不能仅凭问题关闭宣称正式安装包已经修复。更换版本后,用同一编码器配置重做编码与逆变换对照,确认缺失行仍是缺失、低频行仍按约定归组,再恢复依赖逆变换的展示或导出。