使用似然估计编码分类变量


22

我试图了解如何使用似然估计对分类变量进行编码,但迄今为止收效甚微。

任何建议将不胜感激。


没有目标标签时在预测时间内该怎么办?
拉吉特·辛格

Answers:


24

我也在学习这个主题,这些是我发现的:

  • 这种编码方式称为似然编码影响编码目标编码

  • 这个想法是使用目标变量(根据任务是连续的还是分类的)对分类变量进行编码。例如,如果您有回归任务,则可以使用目标均值对分类变量进行编码。对于每个类别,您都要计算目标的相应平均值(在该类别中),然后用该平均值替换类别的值。

  • 如果您有分类任务,则可以针对每个类别值计算目标的相对频率。

  • 从数学的角度来看,此编码表示目标的概率,取决于每个类别值。

  • 如果按照我上面的描述,以简单的方式进行操作,则可能会得出有偏差的估计。这就是为什么在Kaggle社区中,他们通常使用2个级别的交叉验证。在此处阅读raddar的评论。相应的笔记本在这里

报价单:

它取y的平均值。但不是简单的意思,而是在交叉验证方式内进行交叉验证;

假设我们有20倍的交叉验证。我们只需要使用#2-#20折的信息,就需要以某种方式计算#1折的特征的平均值。

因此,您进行#2-#20折,在其中创建另一个交叉验证集(我做了10折)。为每一个留一倍的弃牌计算平均值(最后得到10个平均值)。您将这10次平均值取平均值,并将该向量应用于主要的#1验证集。重复此操作,剩下的19折。

这很难解释,很难理解和掌握:)但是,如果做得正确,可以带来很多好处:)

  • 这种编码的另一种实现在这里

  • 在R库vtreat中,他们实现了影响编码。看到这篇文章

  • CatBoost库中,它们有很多用于分类变量编码的选项,包括目标编码。

  • sklearn中尚无此类编码。



如果使用目标编码,如何实现功能交互?例如,您对目标编码的F1和F2。您是否只需将编码值F1 * F2相乘?
Michael Larionov '18

如果您计算每个LOO折叠的均值,然后取它们的平均值,则与#2-#20折叠的均值完全相同,我不明白为什么可以将其视为CV。同样,当我将这10个均值取平均值时,我也不明白他对“向量”的含义。
SiXUlm

最新评论;类别编码器中的目标编码是简单的均值编码;它不执行raddar描述的fold-in-folds正则化。
Dan Scally

7

现在,可以通过category_encoders包在sklearn中使用目标编码

目标编码器

class category_encoders.target_encoder.TargetEncoder(详细== 0,cols =无,drop_invariant = False,return_df = True,impute_missing = True,handle_unknown ='impute',min_samples_leaf = 1,平滑= 1)

用于分类功能的目标编码。基于留一法。

正如josh在上述评论中指出的。


1

scikit learning仍无法使用似然编码。您可以通过创建字典来执行此操作,然后执行替换功能。

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.