Answers:
我也在学习这个主题,这些是我发现的:
这种编码方式称为似然编码,影响编码或目标编码
这个想法是使用目标变量(根据任务是连续的还是分类的)对分类变量进行编码。例如,如果您有回归任务,则可以使用目标均值对分类变量进行编码。对于每个类别,您都要计算目标的相应平均值(在该类别中),然后用该平均值替换类别的值。
如果您有分类任务,则可以针对每个类别值计算目标的相对频率。
从数学的角度来看,此编码表示目标的概率,取决于每个类别值。
如果按照我上面的描述,以简单的方式进行操作,则可能会得出有偏差的估计。这就是为什么在Kaggle社区中,他们通常使用2个级别的交叉验证。在此处阅读raddar的评论。相应的笔记本在这里。
报价单:
它取y的平均值。但不是简单的意思,而是在交叉验证方式内进行交叉验证;
假设我们有20倍的交叉验证。我们只需要使用#2-#20折的信息,就需要以某种方式计算#1折的特征的平均值。
因此,您进行#2-#20折,在其中创建另一个交叉验证集(我做了10折)。为每一个留一倍的弃牌计算平均值(最后得到10个平均值)。您将这10次平均值取平均值,并将该向量应用于主要的#1验证集。重复此操作,剩下的19折。
这很难解释,很难理解和掌握:)但是,如果做得正确,可以带来很多好处:)
这种编码的另一种实现在这里。
在R库vtreat中,他们实现了影响编码。看到这篇文章。
在CatBoost库中,它们有很多用于分类变量编码的选项,包括目标编码。
sklearn中尚无此类编码。
现在,可以通过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在上述评论中指出的。
scikit learning仍无法使用似然编码。您可以通过创建字典来执行此操作,然后执行替换功能。
dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
df.iloc[i] = dict1[df.iloc[i]]