如果我的测试数据在列中缺少值,我该如何解决一个热编码?

Posted

技术标签:

【中文标题】如果我的测试数据在列中缺少值,我该如何解决一个热编码?【英文标题】:How do I resolve one hot encoding if my test data has missing values in a col? 【发布时间】:2018-05-07 16:59:42 【问题描述】:

例如,如果我的训练数据在 col 中有分类值 (1,2,3,4,5),那么一个热编码将给我 5 cols。但是在我拥有的测试数据中,5个值中只有4个,即(1,3,4,5)。所以一个热编码只会给我4个cols。因此,如果我将训练有素的权重应用于测试数据,我会收到一个错误,因为火车和测试数据中 cols 的尺寸不匹配,dim(4)!=dim(5)。关于如何处理缺少的 col 值的任何建议? 我的代码图片如下:

image

【问题讨论】:

【参考方案1】:

请大家不要犯这个错误!

是的,你可以通过连接训练和测试来欺骗自己,但真正的问题是在生产中。在那里,您的模型有一天会面临未知级别的分类变量,然后崩溃。

实际上,一些更可行的选择可能是:

    定期重新训练您的模型以考虑新数据。 不要使用一热。说真的,还有很多更好的选择,比如留一编码 (https://www.kaggle.com/c/caterpillar-tube-pricing/discussion/15748#143154) 条件概率编码 (https://medium.com/airbnb-engineering/designing-machine-learning-models-7d0048249e69)、目标编码等等。一些分类器(例如 CatBoost)甚至具有内置的编码机制,Python 中有成熟的库(例如 target_encoders),您可以在其中找到许多其他选项。 嵌入分类特征,这可以让您免于重新训练 (http://flovv.github.io/Embeddings_with_keras/)

【讨论】:

就生产级别而言,不能再同意了。【参考方案2】:

您可以先组合两个数据帧,然后 get_dummies 然后拆分它们,以便它们可以具有确切的列数,即

#Example Dataframes 
Xtrain = pd.DataFrame('x':np.array([4,2,3,5,3,1]))
Xtest = pd.DataFrame('x':np.array([4,5,1,3]))


# Concat with keys then get dummies
temp = pd.get_dummies(pd.concat([Xtrain,Xtest],keys=[0,1]), columns=['x'])

# Selecting data from multi index and assigning them i.e
Xtrain,Xtest = temp.xs(0),temp.xs(1)

# Xtrain.as_matrix()
# array([[0, 0, 0, 1, 0],
#        [0, 1, 0, 0, 0],
#        [0, 0, 1, 0, 0],
#        [0, 0, 0, 0, 1],
#        [0, 0, 1, 0, 0],
#        [1, 0, 0, 0, 0]], dtype=uint8)

# Xtest.as_matrix()

# array([[0, 0, 0, 1, 0],
#        [0, 0, 0, 0, 1],
#        [1, 0, 0, 0, 0],
#        [0, 0, 1, 0, 0]], dtype=uint8)

不要遵循这种方法。这是一个有很多缺点的简单技巧。 @Vast 院士的回答解释得更好。

【讨论】:

有没有办法可以指定编号。 cols like for (1,2,3) 我想要 5 cols 而不是 3 ,所以如果在训练数据中它像 (1,2,3,4,5) 它在测试中不会出现任何问题数据也有(1,2,3) 你能建议如何在 get_dummies() 中使用 sparse=True 参数吗?

以上是关于如果我的测试数据在列中缺少值,我该如何解决一个热编码?的主要内容,如果未能解决你的问题,请参考以下文章

在列中的两个值之间重复值

SQL - 在列中查找具有特定值组合的行

计算 PySpark SQL Join 中每个不同值在列中出现的次数

如何使用 Pandas 在列中添加值的超链接?

如何使用 Spark 数据框中的 lit 在列中插入值?

列中的重复值