三种Target Encoding方式总结

本文探讨了Target Encoding这一有监督特征工程方法,用于类别特征转为数值。尽管存在未知类别、空值处理和长尾类别等问题,但通过平滑处理能有效缓解。Target Encoding适用于高维数据和领域经验特征。文章提到了Beta Target Encoding,一种在Avito Demand Prediction Challenge中表现出色的编码方式,它可以提取更多特征,并且在时间效率和模型效果上优于传统方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前看到的大多数特征工程方法都是针对数值特征的。本文介绍的Target Encoding是用于类别特征的。这是一种将类别编码为数字的方法,就像One-hot或Label-encoding一样,但和这种两种方法不同的地方在于target encoding还使用目标来创建编码,这就是我们所说的有监督特征工程方法。

09311ac10126c88c7c65548b8db0c5a1.png

Target Encoding是任何一种可以从目标中派生出数字替换特征类别的编码方式。这种目标编码有时被称为平均编码。应用于二进制目标时,也被称为bin counting。(可能会遇到的其他名称包括:likelihood encoding, impact encoding, and leave-one-out encoding。)

每种方法都有其缺点,target encoding的缺点主要有:

  • 未知类别,会产生过拟合风险;
  • 空值,采用填充的方法不能很好的进行评估;
  • 长尾类别,对长尾类别这种少量数据的编码会导致过拟合;

鉴于以上缺点的存在,一般会加入平滑来进行处理。

encoding = weight * in_category + (1 - weight) * overall
weight = n / (n + m)

083784bf94bb90d4b7307e7a38ae3aa7.png

说了半天它的缺点和如何解决这些缺点,该方式的优点有哪些呢?

  • 高维数据特征:具有大量类别的可能很难编码:One-hot会生成太多维度,而替代方案(如标签编码)可能不适合该类型。Target encoding在此处就很好的解决了这个问题;
  • 领域经验特征:根据之前的经验,即使某项数据它在特征度量方面得分很低,你也可能会觉得一个分类特征应该很重要。Target encoding有助于揭示特征的真实信息。

38879b68f93f544f43e4d9bd2006256c.png

在kaggle竞赛宝典中,有一篇《Kaggle Master分享编码神技-Beta Target Encoding》,很好的介绍了Beta Target Encoding,该编码方案来源于kaggle曾经的竞赛Avito Demand Prediction Challenge 第14名solution。从作者开源出来的代码,我们发现该编码和传统Target Encoding不一样。

  • Beta Target Encoding可以提取更多的特征,不仅仅是均值,还可以是方差等等;
  • 从作者的开源中,是没有进行N Fold提取特征的,所以可能在时间上提取会更快一些;

从作者的对比上我们可以看到,使用Beta Target Encoding相较于直接使用LightGBM建模的效果可以得到大幅提升。

85340af90e82573527bf5981b91a7e9a.png
class BetaTargetEncoder(object):
    def __init__(self, group):
        self.group = group
        self.stats = None
        self.whoami = "DOTA"
    # get counts from df
    def fit(self, df, target_col):
        # 先验均值
        self.prior_mean = np.mean(df[target_col]) 
        stats           = df[[target_col, self.group]]<
C#中的编码(Encoding)是指将字符转换为字节序列或将字节序列转换为字符的过程。通过使用编码器(Encoding)类,可以在C#中进行编码和解码操作。在给定编码的情况下,可以使用编码器的静态方法对字符串或字符数组进行编解码。 在C#中,可以使用Encoding类的GetBytes()方法将字符串转换为字节数组。例如,使用UTF8编码可以将字符串转换为UTF8字节数组。 同样地,可以使用GetChars()方法将字节数组转换为字符数组。例如,使用Unicode编码可以将字节数组转换为Unicode字符数组。 然而,有时候在对整个片段进行编解码时可能会出现问题。为了解决这个问题,可以使用调用UTF8的解码器对字符或字符数组进行解码。可以使用Encoding类的GetDecoder()方法获取UTF8解码器,并通过调用解码器的GetChars()方法将字节数组转换为字符数组。 总结来说,C#中的编码操作可以通过Encoding类的静态方法和解码器来实现,从而实现字符串和字节数组之间的相互转换。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C# Encoding](https://blog.csdn.net/weixin_34242819/article/details/85914171)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值