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

时间:2017-11-23 17:00:04

标签: pandas numpy machine-learning one-hot-encoding

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

image

2 个答案:

答案 0 :(得分:6)

请不要犯这个错误!

是的,您可以结合训练和测试来欺骗自己,然后弄个傻瓜,但真正的问题出在生产中。有一天,您的模型将面临未知类别的分类变量,然后中断。

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

  1. 定期重新训练模型以考虑新数据。
  2. 请勿使用一个热炉。认真地讲,有许多更好的选择,例如遗漏编码(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),您会在其中找到许多其他选项。
  3. 嵌入分类功能,这可以使您免于完全重新训练(http://flovv.github.io/Embeddings_with_keras/

答案 1 :(得分:4)

你可以先组合两个数据帧,然后将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)