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

如何高效对高基数分类列执行Target Encoding并迁移至测试集

批量实现Target Encoding并映射到测试集

我准备训练机器学习模型的数据集包含20个无顺序的高基数分类列,Label Encoding不适用,需要用Target Encoding将这些分类列转为数值列。现有逐个列编码的方式效率极低,同时需要将训练集生成的编码规则映射到测试集。

数据集示例

原始训练集(截取4列):

targetcat_col1cat_col2cat_col3cat_col4
10city1james25-55abc
20city2adam30-40bcc
15city1charles30-40bcc

期望编码后的训练集:

targetcat_col1cat_col2cat_col3cat_col4
1015101010
2020201717
1515151717

低效的现有实现

encoder = TargetEncoder()
train['cat_col1'] = encoder.fit_transform(train['cat_col1'], train['target'])
train['cat_col2'] = encoder.fit_transform(train['cat_col2'], train['target'])
train['cat_col3'] = encoder.fit_transform(train['cat_col3'], train['target'])
train['cat_col4'] = encoder.fit_transform(train['cat_col4'], train['target'])

批量处理方案

通过循环遍历所有分类列,同时用字典保存每个列的编码器,既实现批量编码,又能快速映射到测试集:

from category_encoders import TargetEncoder

# 定义所有分类列的列表(替换为你实际的20个列名)
cat_cols = ['cat_col1', 'cat_col2', 'cat_col3', 'cat_col4']

# 存储每个列对应的编码器
encoder_dict = {}

# 批量编码训练集
for col in cat_cols:
    encoder = TargetEncoder(handle_unknown='value')  # 处理测试集可能出现的未知类别
    train[col] = encoder.fit_transform(train[col], train['target'])
    encoder_dict[col] = encoder

# 将训练集的编码规则映射到测试集
for col in cat_cols:
    test[col] = encoder_dict[col].transform(test[col])

关键说明

  • 使用字典encoder_dict保存每个分类列的编码器,避免重复训练,同时确保测试集使用训练集拟合的规则进行转换,防止数据泄露。
  • handle_unknown='value'参数可以处理测试集中出现但训练集没有的类别,用全局目标均值填充,避免编码报错。

内容的提问来源于stack exchange,提问作者Datalearner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:16:13