训练和测试集上的标签编码器值不同是不好的吗?

时间:2018-12-12 03:21:10

标签: python machine-learning label categorical-data encoder

在我的数据集中,我有一个称为 product 分类功能

假设在培训集中中,其值在{"apple", "banana", "durian", "orange",....}中。另一方面,在测试集中,值现在可以为{"banana", "orange", pineapple"}培训集中中没有一些值(例如菠萝)。

我知道,如果我们事先拥有所有可能的值,我们可以创建一个 Label Encoder变量,并将其fit与该功能可以具有的所有值一起使用。但是在这种情况下,我不能保证训练集可以覆盖测试集中的所有值(即,当一些新产品出现时)。

这使我非常担心,因为恐怕使用标签编码时,培训集可以映射为 {“ apple”: 1,“香蕉”:2,“榴莲”:3,“橙色”:4,... (成千上万) } ,但何时涉及到测试集上的映射,我们将得到 {“ banana”:1,“ orange”:2,pineapple“:3}

我的问题是:

    1. 它对分类模型有负面影响吗?例如,如果 apple product功能中成为重要值,据我所知,该模型将处理 1 apple )。 测试集中的中的 1 banana时是否会产生误导?
    1. 有什么方法可以解决在训练和测试集上具有不同值的标签编码器问题?

我找到了一些relevant links like this one,但这不完全是我的问题。

更新:请注意,product可以具有数千个值,这就是为什么我在此处使用 Label Encoder 而不是 One Hot Coding < / strong>。

2 个答案:

答案 0 :(得分:1)

如果我在您的位置,我将使用字典来存储训练数据。同样的字典也将用于测试数据。在某些情况下,测试数据可能具有一些训练数据没有遇到的值/词。在这些情况下,我将使用一个称为未知令牌的特殊索引。因此,我的字典将是: {“ UNK”:0,苹果”:1,“香蕉”:2,“榴莲”:3,“橙色”:4}

然后获取测试数据{“香蕉,橙子,菠萝”},我将得到{2,4,0}

我希望这会有用。

答案 1 :(得分:1)

将分类变量输入ML模型时,必须使用one hot encoding。否则,模型将必须处理apple < banana < durian < orange,实际上并非如此。

对于在测试数据集期间出现的未知值,该变量的所有列将为零,这最终使模型理解在训练期间看不到该值。

X= [["apple"], ["banana"], ["durian"], ["orange"]]
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown='ignore')
enc.fit(X)

enc.categories_

类别:

[array(['apple', 'banana', 'durian', 'orange'], dtype=object)]

在测试数据中,

enc.transform([["banana"], ["orange"], ["pineapple"]]).toarray()

输出:

array([[0., 1., 0., 0.],
       [0., 0., 0., 1.],
       [0., 0., 0., 0.]])