我需要为训练和测试数据集分别进行热编码吗?

2024-10-01 15:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个分类问题,我已经将我的列车数据分为列车和测试集。在

我有几个分类列(大约4-6个),我正在考虑使用pd.get_dummies将我的分类值转换为OneHotEncoding。在

我的问题是,我必须为火车和测试分开单独进行一次热编码吗?如果是这种情况,我必须使用sklearnonehotcoder,因为它支持fit和transform方法。在


Tags: 数据方法编码get分类情况transformfit
1条回答
网友
1楼 · 发布于 2024-10-01 15:30:31

通常,您希望将测试集视为在培训期间没有它。无论你对列车集做了什么样的转换,都应该在你做出预测之前对测试集进行。所以,是的,您应该单独进行转换,但要知道您正在应用相同的转换。在

例如,如果测试集缺少其中一个类别,那么对于缺失的类别(可以在训练集中找到)仍然应该有一个虚拟变量,因为您训练的模型仍然需要该虚拟变量。如果测试集有一个额外的类别,这可能应该用一些“其他”类别来处理。在

类似地,当缩放连续变量时,比如说[0,1],在缩放测试集时使用序列集的范围。这可能意味着新缩放的测试变量在[0,1]之外。在


为了完整起见,下面是一个热编码的外观:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

### Correct
train = pd.DataFrame(['A', 'B', 'A', 'C'])
test = pd.DataFrame(['B', 'A', 'D'])

enc = OneHotEncoder(handle_unknown = 'ignore')
enc.fit(train)

enc.transform(train).toarray()
#array([[1., 0., 0.],
#       [0., 1., 0.],
#       [1., 0., 0.],
#       [0., 0., 1.]])

enc.transform(test).toarray()
#array([[0., 1., 0.],
#       [1., 0., 0.],
#       [0., 0., 0.]])


### Incorrect
full = pd.concat((train, test))

enc = OneHotEncoder(handle_unknown = 'ignore')
enc.fit(full)

enc.transform(train).toarray()
#array([[1., 0., 0., 0.],
#       [0., 1., 0., 0.],
#       [1., 0., 0., 0.],
#       [0., 0., 1., 0.]])

enc.transform(test).toarray()
#array([[0., 1., 0., 0.],
#       [1., 0., 0., 0.],
#       [0., 0., 0., 1.]])

注意,对于不正确的方法,D有一个额外的列(它只显示在测试集中)。在培训期间,我们根本不知道D,所以不应该有一个专栏。在

相关问题 更多 >

    热门问题