在我的数据集中,我有一个称为 product 的分类功能。
假设在培训集中中,其值在{"apple", "banana", "durian", "orange",....}
中。另一方面,在测试集中,值现在可以为{"banana", "orange", pineapple"}
。 培训集中中没有一些值(例如菠萝)。
我知道,如果我们事先拥有所有可能的值,我们可以创建一个 Label Encoder变量,并将其fit
与该功能可以具有的所有值一起使用。但是在这种情况下,我不能保证训练集可以覆盖测试集中的所有值(即,当一些新产品出现时)。
这使我非常担心,因为恐怕使用标签编码时,培训集可以映射为 {“ apple”: 1,“香蕉”:2,“榴莲”:3,“橙色”:4,... (成千上万) } ,但何时涉及到测试集上的映射,我们将得到 {“ banana”:1,“ orange”:2,pineapple“:3} 。
我的问题是:
product
功能中成为重要值,据我所知,该模型将处理 1 ( apple )。 测试集中的中的 1 是banana
时是否会产生误导?我找到了一些relevant links like this one,但这不完全是我的问题。
更新:请注意,product
可以具有数千个值,这就是为什么我在此处使用 Label Encoder 而不是 One Hot Coding < / strong>。
答案 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.]])