训练集和测试集上的不同标签编码器值是否不正确



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

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

我知道,如果我们事先有所有可能的值,我们可以创建一个标签编码器变量,并使用该功能可以具有的所有值对其进行fit。但在这种情况下,我无法确保训练集能够覆盖测试集中的所有值(即,当一些新产品出现时(。

这让我非常担心,因为我担心在使用标签编码时,训练集可以映射为{"苹果":1,"香蕉":2,"榴莲":3,"橙色":4,…(数千个(},但当涉及到测试集"香蕉":1,"橙子":2,菠萝":3}.

我的问题是:

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

我找到了一些像这样的相关链接,但这并不完全是我的问题。

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

在将分类变量输入ML模型时,必须使用一个热编码。否则,模型将不得不处理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.]])

如果我在你的位置,我会使用字典来存储训练数据。测试数据中也将使用相同的字典。可能存在这样的情况,即测试数据具有一些训练数据没有遇到的值/字。对于这些情况,我将使用一个名为未知令牌的特殊索引。因此,我的字典应该是:{"UNK":0,"苹果":1,"香蕉":2,"榴莲":3,"橙子":4}

然后对于测试数据{"香蕉、橙子、菠萝"},我将有{2,4,0}

我希望这将是有用的。

最新更新