Python 一个热编码的正确方法

Python 一个热编码的正确方法,python,machine-learning,scikit-learn,categorical-data,one-hot-encoding,Python,Machine Learning,Scikit Learn,Categorical Data,One Hot Encoding,我有点被网上的热门编码搞糊涂了。我正在使用get\u dummies方法,但我不清楚的是,我是否在train\u test\u split之前或之后应用了一个热编码。e、 这是正确的吗?这是一种流行的方法,但这不会导致数据泄漏吗 features = pd.get_dummies(features, columns=['country'], dummy_na=True) X_train, X_test, y_train, y_test = train_test_split(features,

我有点被网上的热门编码搞糊涂了。我正在使用
get\u dummies
方法,但我不清楚的是,我是否在
train\u test\u split
之前或之后应用了一个热编码。e、 这是正确的吗?这是一种流行的方法,但这不会导致数据泄漏吗

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)

e、 g.在我的例子中,列车包含所有国家,但测试集包含除德国以外的所有国家,但使用上述方法将使德国在我的测试集中保留一个热编码的0和1序列,因此不只是一个0序列,因为它不存在。这对我来说似乎是错误的。

有时候,你有很多小类别。这是nit信息类别,您可以尝试在培训中将它们合并到一个类别中。让我们把这个类别称为C0。所以,你需要推理(测试)。在推论中,你会得到一个新的类别。您可以将未定义的类别添加到C0类别并进行预测

当然,您需要在交叉验证中测试这个案例

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

例如,若你们提到发明的任务,-问题,那个么好主意就用这个案例进行交叉验证,也许还有领导委员会。在那之后,你就会明白最好的方法是什么


在卡格尔考试中,有时会出现大类考试。它将不可感知的大类别设置为C0。你需要研究你的问题。也许,这是解决问题的关键。

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

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

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

  • 只需忽略测试集中的未知值,或者用缺少的值替换它
  • 从开始处删除任何罕见值(例如,频率低于N),并替换为特殊类别“未知”。在测试集上应用相同的原理

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

请注意,对于这种非编程问题,这是一个更好的地方。我投票结束这个问题,因为它不是关于在中定义的编程,而是关于ML理论和/或方法-请参阅机器学习中的介绍和说明与上述内容保持一致,因为OHE是一个固定的转换,我认为它可以在split@mathella是的,技术上可以,但这是一个逻辑错误,因为至少在理论上,应该可以将模型应用于任何新实例,并且如果新实例包含未知值,则不可能重新编码。这就是为什么一个好的ML设计会预见到这种情况:只使用训练集进行编码是一个很好的规程,因为它迫使您解决这个问题,并将测试集视为真正的新实例。