如何高效对高基数分类列执行Target Encoding并迁移至测试集
批量实现Target Encoding并映射到测试集
我准备训练机器学习模型的数据集包含20个无顺序的高基数分类列,Label Encoding不适用,需要用Target Encoding将这些分类列转为数值列。现有逐个列编码的方式效率极低,同时需要将训练集生成的编码规则映射到测试集。
数据集示例
原始训练集(截取4列):
| target | cat_col1 | cat_col2 | cat_col3 | cat_col4 |
|---|---|---|---|---|
| 10 | city1 | james | 25-55 | abc |
| 20 | city2 | adam | 30-40 | bcc |
| 15 | city1 | charles | 30-40 | bcc |
期望编码后的训练集:
| target | cat_col1 | cat_col2 | cat_col3 | cat_col4 |
|---|---|---|---|---|
| 10 | 15 | 10 | 10 | 10 |
| 20 | 20 | 20 | 17 | 17 |
| 15 | 15 | 15 | 17 | 17 |
低效的现有实现
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
相关产品推荐
相关产品推荐

