我正在为分类数据进行一次热编码。当我测试时,我会这样做:
data.append(train_data_X)
data.append(test_data_X)
one_hot_encode(data)
model.test(data[:test_data_X.shape[0])
我想知道是否有办法测试我的测试数据,而无法访问我的训练数据。
通常的最佳做法是使用scikit-learn
的OneHotEncoder
功能,正是为了避免您遇到的问题。
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(categories = "auto", handle_unknown = 'ignore')
X_train_encoded = encoder.fit_transform(X_train)
X_test_encoded = encoder.transform(X_test)
这确保了将为测试集实现相同的One Hot Encoding。因此,您可以使用X_train_encoded来训练您的模型,然后使用X_test_encoded来评估它。
下面是一个简单的方法,但这可能无法正常工作(为什么它不起作用总是在代码后解释)
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个唯一值,我们将有额外的列,我们的模型将抛出异常。因此,建议在使用单热编码之前将测试和训练数据结合起来,然后根据索引将数据恢复为测试和训练。