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

2024-07-07 05:56:20 发布

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

在我的数据集中,我有一个名为产品的分类特征。在

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

我知道,如果我们事先有了所有可能的值,我们就可以创建一个标签编码器变量,并使用该特性可以具有的所有值创建它。但是在这种情况下,我不能保证训练集能够覆盖测试集中的所有值(例如,当一些新产品出现时)。在

这让我非常担心,因为我担心当使用标签编码时,训练集可以映射为{“苹果”:1,“香蕉”:2,“榴莲”:3,“橘子”:4,…(还有数千个)},但在测试集上映射时,我们将得到{“香蕉”:1,“橙色”:2,菠萝:3}。在

我的问题是:

    1. 它是否会对分类模型产生负面影响?例如,如果apple成为product特性中的一个重要值,据我所知,模型将更加关注1(apple的数值)。当1测试集中是banana时,是否会产生误导?在
    1. 有没有什么方法可以解决在训练和测试集上有不同值的标签编码器问题?在

我找到了一些dataset-or-new-label-encoder">relevant links like this one,但这不完全是我的问题。在

更新:请注意,product可以有数千个值,这就是为什么我在这里使用标签编码器而不是一个热编码。在


Tags: 数据模型apple编码产品分类标签特性
2条回答

在将分类变量输入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_

类别:

^{pr2}$

在测试数据期间

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

输出:

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

如果我处在你的位置,我会用字典来记录训练数据。同样的字典也将用于测试数据。可能存在这样的情况:测试数据具有一些列数据未遇到的值/字。对于这些情况,我将使用一个名为unknown token的特殊索引。因此,我的字典是: {“碜”:0,苹果:1,“香蕉”:2,“榴莲”:3,“橙色”:4}

那么对于测试数据{“香蕉,橘子,菠萝”},我将得到{2,4,0}

我希望这会有用。在

相关问题 更多 >