我的数据格式例如为 [‘1’, ‘5’, ‘6’, ‘5’, ‘2’],其中每个标签可以是0到9之间的任意数字字符。我的数据是名义类别数据,因此是无序的,接下来我使用scikit的OneHotEncoder对数据进行类别编码。然而,在测试模型时,如果输入数据是 [‘1’, ‘5’, ‘9’, ‘3’, ‘1’],而在训练数据中数组的第三个索引处没有出现过’9’,就会遇到错误。
我认为这是因为当我编码数据时,如果测试数据中的第三个索引只包含’0’到’8’的数字,OneHotEncoder无法识别第三个索引处的’9’,因此会抛出错误。我想知道是否有办法手动添加这些类别,这样在机器学习模型中这些类别就会存在,只是没有数据点与之对应。
示例:
from sklearn.preprocessing import OneHotEncodera = [['1'], ['2'], ['3'], ['5']]enc = OneHotEncoder()X = enc.fit_transform(a)enc.transform([['4']])
可以看到我的训练数据不包含’4’,尽管’4’是一个可能的标签。因此,当我对其进行编码并转换’4’时,会抛出错误:
ValueError: Found unknown categories ['4'] in column 0 during transform
我想知道如何手动将’4’添加为一个类别。
回答:
这里有两种情况。
- 如果你事先知道所有类别。
在初始化OneHotEncoder时,将所有可能的类别作为列表传递。
enc = OneHotEncoder(categories = [str(i) for i in range(10)])
- 如果你事先不知道某些类别。
# 此参数默认为`error`,因此如果遇到未知类别会抛出错误enc = OneHotEncoder(handle_unknown='ignore')
如果在转换过程中存在未知的分类特征,是否引发错误或忽略(默认为引发错误)。当此参数设置为‘ignore’且在转换过程中遇到未知类别时,该特征的one-hot编码列将全部为零。在逆转换中,未知类别将被标记为None。
此问题也在此处被提问 这里
有关每个参数的详细文档,请参阅 这里