在分成训练集和测试集之前或之后应用平均编码

数据挖掘 Python 分类数据 编码
2021-10-12 00:04:39

我有一个包含高基数列的 50000 个观察值的数据集。对它们进行编码的最佳方法是使用均值编码,然后使用正则化。我将使用 CV 而不是平滑。但是当我看到人们使用它时,他们会在训练集和测试集上使用它。

我应该首先将我的数据集拆分为训练集和测试集,然后进行编码,还是可以直接从头开始对完整数据集进行编码?

如果我应该先将数据分成训练集和测试集,有人能告诉我为什么吗?

2个回答

拥有测试集或验证集的目的是能够检查模型在以前未见过的数据上的性能。如果您使用存在的测试数据执行特征工程,您将获得数据泄漏。在训练期间向模型提供有关测试数据的信息时会发生这种情况。

使用标签均值进行目标编码时尤其糟糕,因为它会为您的模型提供有关测试集中标签分布的信息。结果是你会得到一个过于乐观的测试分数,它不会反映新的真正看不见的数据的表现。

除了西蒙的回答:您需要在拆分数据后进行平均编码。请注意,您不应该分别对它们进行编码。您需要从训练集中获取均值并将其映射到测试集。但是,这并不能完全消除数据泄漏。

简单平均编码:

means = X_tr.groupby(col).target.mean()
train_new[col+'_mean_target'] = train_new[col].map(means)
val_new[col+ '_mean_target'] = val_new[col].map(means)

有时,由于训练组和测试组之间的不匹配,您最终会在测试集中出现缺失值。在这种情况下,您可能需要用均值填充缺失值。像这样的东西应该工作:

train_new[col+ '_mean_target'].fillna(means.mean(), inplace = True)