【问题标题】:Correct way for one hot encoding [closed]一种热编码的正确方法[关闭]
【发布时间】:2021-01-08 17:21:24
【问题描述】:

我对在线 RE one hot encoding 有点困惑。我正在使用get_dummies 方法,但我不清楚是在train_test_split 之前或之后应用一种热编码。例如它是否正确?这是一种流行的方法,但这不会导致数据泄漏吗?

features = pd.get_dummies(features, columns=['country'], dummy_na=True)

X_train, X_test, y_train, y_test = train_test_split(features, y, random_state=0)

例如在我的情况下,火车包含所有国家,但测试集包含除德国以外的所有国家,但使用上述方式将使德国在我的测试集中使用一系列 0 和 1 进行热编码,因此不仅仅是一系列 0,因为它不存在。这对我来说似乎是错误的。

【问题讨论】:

  • 请注意DataScienceSE 是解决这类非编程问题的更好地方。
  • 我投票结束这个问题,因为它与 help center 中定义的编程无关,而是关于 ML 理论和/或方法 - 请参阅介绍和 注意machine-learningtag info.

标签: python machine-learning scikit-learn categorical-data one-hot-encoding


【解决方案1】:

tl;dr:总是先拆分。仅使用训练集来确定特征表示的任何方面。

任何编码都应该只在训练集上计算,以避免数据泄漏。然后将相同的编码应用于测试集。

当然,有可能某个特定值没有出现在训练集中,但出现在测试集中。有不同的处理方法,视情况而定:

  • 只需忽略测试集中的未知值,或者用缺失值替换即可。
  • 从一开始就删除所有稀有值(例如频率低于 N)并替换为特殊类别“未知”。在测试集上应用相同的原则。

此外,请注意,如果训练集中存在稀有值,则会带来过度拟合的风险。如果训练集中不存在,则该值是无用的,因为模型不知道它。这就是为什么从一开始就删除它们几乎总是一个好主意。

【讨论】:

  • 保持上面的,因为 OHE 是一个固定的转换,我认为它可以在拆分之前应用
  • @mathella 是的,从技术上讲它可以,但这是一个逻辑错误,因为至少在理论上应该可以将模型应用于任何新实例,并且如果新实例包含未知值。这就是为什么一个好的 ML 设计会预见到这种情况:仅使用训练集进行编码是一门很好的学科,因为它迫使您解决问题并将测试集视为真实的新鲜实例。
【解决方案2】:

有时,您有很多小类别。这是一个信息量不大的类别,您可以尝试在培训中将它们合并为一个类别。让我们将此类别称为 C0。因此,您进行推理(测试)。在推断你得到新的类别。您可以将未定义的类别添加到 C0 类别并进行预测。

当然,你需要在交叉验证上测试这个案例。

不要忘记,数据在现实世界中会随时间变化。我认为您需要找到来源到达新类别。

如果你说的是发明任务,例如kaggle -problem,那么好主意就是在交叉验证和排行榜上对这个案例进行实验。之后,您可以了解最好的方法。

在 kaggle 中,有时测试中有很大的类别。它把不合理的大类放在C0上。你需要研究你的问题。大概,这是解决的关键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 2020-07-26
    • 2016-03-19
    • 2014-10-20
    • 2021-12-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多