编码和交叉验证

数据挖掘 交叉验证 一热编码 分类编码
2022-02-18 18:53:20

最近我一直在考虑在交叉验证方案中正确使用编码。通常建议的编码特征的方法是:

  1. 将数据拆分为训练和测试(保留)集
  2. 在火车组上安装编码器(或LabelEncoder或)OneHotEncoder
  3. 使用拟合编码器转换训练集和测试集。

据称这种方式可以防止任何数据泄露。然而,这似乎在交叉验证过程中经常被忽略。假设我正在对上述火车集进行交叉验证。如果我对训练集进行编码然后执行交叉验证,它并不能真正模仿上述步骤。那么编码不应该在“内部”交叉验证中执行吗?例如,假设我们执行 5 折交叉验证,我们不应该在每个交叉验证步骤中将编码器拟合到 4 折并在第 5 折进行转换吗?我相信这是通常在目标编码中所做的,但不是真正的标签或单热编码。

因此,我的问题是:

  1. 如果我们真的想防止过度拟合,我是否需要在每个交叉验证步骤中将编码器安装在 4 折上而不是在第 5 次验证折上?
  2. 如果不是,为什么在处理训练和测试(保持)集时真的有必要执行前面提到的所有 3 个步骤?
1个回答

你是对的,编码步骤本身可能是数据泄漏的来源,通常应该只使用当前训练集在 CV 循环内完成,正如你所描述的。

原因确实是您在评论中提到的原因:如果在 CV 期间在特定训练集中没有偶然出现的类标签或特征类别,则模型甚至不应该知道该类/类别存在。

总的来说,我认为这个问题只会降低测试集的性能,所以它可能没有其他类型的数据泄漏那么严重。尽管如此,仅使用训练集进行编码绝对是一种更简洁的实验设计。

NLP 中一个密切相关的问题是,当系统不是为处理词汇外 (OOV) 词而设计时:如果训练集和测试集中的所有词都被编码(同样的错误),那么它看起来好像是错误的任何文本都可以被完全编码,这可能会在以后造成严重的意外。

话虽如此,丢弃稀有特征或标签值通常是一个好主意,如果这样做,那么无论使用正确的方法还是草率的方法,结果都应该是相同的。