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

数据挖掘 特征工程
2021-09-16 22:40:27

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

任何建议将不胜感激。

3个回答

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

  • 这种类型的编码称为似然编码影响编码目标编码

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

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

  • 从数学的角度来看,这种编码意味着目标的概率,取决于每个类别值。

  • 如果你以一种简单的方式来做,就像我上面描述的那样,你可能会得到一个有偏差的估计。这就是为什么在 Kaggle 社区中他们通常使用 2 个级别的交叉验证。在此处阅读raddar 的此评论对应的笔记本在这里

报价单:

它取y的平均值。但不是简单的意思,而是在cross-validation中的cross-validation中;

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

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

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

  • 这种编码的另一种实现是here

  • 在 R 库vtreat 中,他们实现了影响编码。看到这个帖子

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

  • sklearn 中还没有这样的编码。


更新: sklearn 模型和管道有一个不错的包!https://github.com/scikit-learn-contrib/category_encoders

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

目标编码器

类 category_encoders.target_encoder.TargetEncoder(verbose=0,cols=None,drop_invariant=False,return_df=True,impute_missing=True,handle_unknown='impute',min_samples_leaf=1,smoothing=1)

分类特征的目标编码。基于留一法。

正如乔希在上面的评论中指出的那样。

scikit learn 上仍然无法使用似然编码。您可以通过创建字典来完成,然后执行替换功能。

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]]