如果我进行一次热编码,是否总是必须保留一份训练数据副本?

时间:2019-02-27 00:41:41

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

我正在对分类数据进行一次热编码。在测试时,我会执行以下操作:

data.append(train_data_X)
data.append(test_data_X)
one_hot_encode(data)
model.test(data[:test_data_X.shape[0])

我想知道是否有一种方法可以在不访问我的训练数据的情况下测试我的测试数据。

2 个答案:

答案 0 :(得分:2)

通常的最佳做法是使用scikit-learn的{​​{1}}函数,以避免出现问题。

OneHotEncoder

这可确保对测试集实施相同的一次热编码。 因此,您可以使用X_train_encoded训练模型,然后使用X_test_encoded评估模型。

答案 1 :(得分:0)

下面是直接的方法,但这可能并不总能奏效(为什么在代码后会解释为什么总不能奏效)

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()

#fit the encoder
enc.fit(X_train)
#transform the data
X_train_encoded = enc.transform(X_train)
#tranform test data
X_test_encoded = enc.transform(X_test)

但是这种方法存在一个小问题。如果您的火车数据在列中具有2个唯一值,则编码器将创建2个虚拟特征。但是,如果您的测试数据在同一列中具有3个唯一值,则我们将有额外的列,并且我们的模型将引发异常。因此,始终建议先将测试数据和训练数据结合起来,然后再使用一键编码,然后再将其恢复以基于索引将数据拆分回测试和训练中。