[数据分析] target encoding

本文整理了target encoding的相关知识,如果你对特征编码的内容不太了解,建议先阅读一下参考资料[1],在对特征编码方法有一定了解后,本文的阅读会更加轻松。

特征编码可以仅基于特征本身进行,也可以结合目标值(target)的信息进行。Target encoding就是一种结合目标值进行特征编码的方式。正式地来讲,target encoding是将特征值替换为给定特征取值,目标值在训练数据中的先验概率和后验概率的混合。后面的例子会帮助你更好地理解这句话的意思。

1. 编码方式#

1.1 二分类#

在二分类中,对于特征i,target encoding在该特征取值为k时的编码值为类别k对应的目标值期望E(y|xi=xki)

在给定训练样本时,估算期望的最直接方式为训练样本中相同类别xki的目标变量y的均值:
x^ki=j=1nI{xji=xki}yij=1nI{xji=xki}

让我们看个例子[4]
image

在这个数据集中,特征i的可能取值为Up, Down, Flat,我们试着对k=Up进行编码。

在样本集中一共有10条记录,其中3条记录中特征Trend的取值为Up,我们关注这3条记录。在k=Up时,目标值的期望为2/3 ≈ 0.66,所以我们将Up编码为0.66。
这种简单的编码方式也被称为Greedy TS,在这里,我们只考虑了目标值在数据中的后验分布。

这种编码方式很简单,但可能存在标签泄露的问题。看一个极端的例子,如果训练集长这个样子:

Trend Target Trend_Encoded
Up 1 1
Down 1 1
Flat 0 0
UpThenFlat 1 1
UpThenDown 0 0
FlatThenDown 1 1

此时,我们编码的特征值原封不动地反映了目标值的信息。
后文会提到针对这个问题,我们可以如何改进编码方式。在此之前,我们先看看如何在多分类问题中进行编码。

1.2 多分类#

在m分类问题中,可以生成m-1个特征,每个特征分别表示第i类的概率。

1.3 缺失值问题#

可将缺失值看为新的一类,计算编码的方式与原来相同

2. 标签泄露(target leakage)#

在特征类别较多或者是数据分布不平均时,使用简单的target encoding容易过拟合训练集,也称为标签泄露。下面我们列举几种处理标签泄露问题的方法。

2.1 Additive smoothing#

结合标签的先验分布来改进编码方式。它的想法是,当某个类别值对应的样本过少时,其均值并不可信。通过结合所有样本的目标值均值可以对编码进行平滑。
目前实现最多的target encoding的定义方式如下
x^ki=j=1nI{xji=xki}yi+apj=1nI{xji=xki}+a
公式中,a为用户自定义参数,用来调节先验在最终编码结果中的贡献程度,p可以设置成全部标签的均值。

2.2 Cross-validation#

Kaggle竞赛中的参赛者较常使用这种方式。
Cross-validation将训练数据分成k份,在计算某一份的target encoding时,我们不使用这一份中对应的目标值进行计算,而是使用剩余k-1份数据,进行对应标签的target encoding计算。
对于同一个属性值,这种方式产生的encoding一般是不一致的。在测试集中,对应的target encoding可以通过将训练集中这些属性的encoding取平均获得。[9]

3. Target encoding的优点与局限#

3.1 优点#

Target encoding是一种简单、快速的编码方式,在二分类的情况下,它不增加数据集的维度。
这种编码方式提取了有助于解释目标值的信息。

3.2 局限性#

Target encoding依赖于目标值的分布,容易出现过拟合的问题。
这种编码方式并不是任何时候都能改进模型结果,能否改进与数据集相关。

4. 参考资料#

  1. 常用的特征编码手段
  2. Target Encoding
  3. 知乎:target encoding
  4. http://www.saedsayad.com/encoding.htm
  5. Kaggle: Likelihood encoding of categorical features
  6. Target Encoding Vs. One-hot Encoding with Simple Examples
  7. Target encoding done the right way
  8. Target Encoding 学习笔记——李家翔
  9. Q&A: Target encoding with cross validation
posted @   千凉_ryou  阅读(2331)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
CONTENTS
点击右上角即可分享
微信分享提示