我试图了解如何使用似然估计对分类变量进行编码,但迄今为止收效甚微。
任何建议将不胜感激。
我试图了解如何使用似然估计对分类变量进行编码,但迄今为止收效甚微。
任何建议将不胜感激。
我也在学习这个主题,这些是我发现的:
这种类型的编码称为似然编码、影响编码或目标编码
这个想法是使用目标变量(根据任务连续或分类)对分类变量进行编码。例如,如果您有回归任务,您可以使用目标的平均值对分类变量进行编码。对于每个类别,您计算目标的相应平均值(在此类别中)并用此平均值替换类别的值。
如果您有分类任务,您可以计算目标相对于每个类别值的相对频率。
从数学的角度来看,这种编码意味着目标的概率,取决于每个类别值。
如果你以一种简单的方式来做,就像我上面描述的那样,你可能会得到一个有偏差的估计。这就是为什么在 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]]