You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

category_encoders的TargetEncoder对单样本类别编码异常问题咨询

问题:TargetEncoder设置smoothing=0仍将单样本类别编码为全局均值

问题代码

from category_encoders import TargetEncoder

X = ["a", "a", "a", "b", "b", "c"]
y = [5, 5, 5, 6, 7, 4]
encoder = TargetEncoder(smoothing = 0, min_samples_leaf = 0)
print(encoder.fit_transform(X, y))

预期输出

[5, 5, 5, 6.5, 6.5, 4]

实际输出

[5, 5, 5, 6.5, 6.5, 5.333]

原因分析

category_encoders v2.5.0的TargetEncoder存在实现缺陷:即使显式设置smoothing=0和min_samples_leaf=0,当类别仅包含单个样本时,内部计算逻辑仍会触发全局均值的 fallback 机制,而非使用该样本对应的目标值进行编码。参数配置未按预期覆盖默认的平滑逻辑。

解决方案

  • 升级库版本:将category_encoders升级至v2.6.0及以上版本,后续版本修复了该参数生效问题,设置smoothing=0和min_samples_leaf=0后,单样本类别会正确编码为对应目标值。
  • 手动处理单样本类别(无法升级时):
    1. 统计每个类别的出现频次,筛选出仅出现一次的类别;
    2. 为这些单样本类别直接赋值对应的目标值;
    3. 对剩余多样本类别使用TargetEncoder编码,最后合并结果。

手动处理的示例代码:

from category_encoders import TargetEncoder
import pandas as pd

X = pd.Series(["a", "a", "a", "b", "b", "c"], name='category')
y = pd.Series([5, 5, 5, 6, 7, 4], name='target')

# 统计类别出现频次
category_counts = X.value_counts()
single_sample_cats = category_counts[category_counts == 1].index

# 初始化编码结果
encoded = X.copy().astype(float)

# 处理单样本类别
for cat in single_sample_cats:
    encoded[X == cat] = y[X == cat].values[0]

# 处理多样本类别
multi_sample_cats = category_counts[category_counts > 1].index
encoder = TargetEncoder(smoothing=0, min_samples_leaf=0)
encoded_multi = encoder.fit_transform(X[X.isin(multi_sample_cats)], y[X.isin(multi_sample_cats)])
encoded.update(encoded_multi)

print(encoded.values)

内容的提问来源于stack exchange,提问作者Carlos Navarro Astiasarán

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:57:22