带有预定义类的标签编码

数据挖掘 机器学习 特征构造 标签
2022-02-10 02:05:31

我已经训练了一个模型(随机森林),现在我想用它来预测特定日期的某些数据。我有一个分类列,其中在一段时间内有一些值(比如 a、b、c、d、e)。

现在在特定的一天,只有其中一些值存在(比如 b,d)。现在,在将它们设为 one-hot 编码时,我正在使用 LabelEncoder 和 one-hot 编码器。但是,如果我将该列用于标签编码,它只会标记“b”和“d”(比如 1 和 2),并且单热向量长度为​​ 2。

我需要将实际模型标记为 (a,b,c,d,e) 为 (1,2,3,4,5),现在我需要将 (b,d) 标记为 (2,4 ) 并且 one-hot 向量的大小为 5。

我正在做的是保存训练中使用的标签编码器,并使用该标签编码当天的列。但我没有得到正确的结果,我做对了吗?

我已经给出了onehot_train一天n_values数据的长度。我使用了 sklearn 标签编码器和一个热编码器。

这是我的主要问题,另一个问题是,假设我看到一个我在训练期间没有看到的新类别,如何继续进行,我是否应该将所有新类别视为“未知”类别并将所有这些类别编码为一样的热还是有更好的方法?

def get_onehot(arr):
    label_enc = LabelEncoder()
    onehot_enc = OneHotEncoder(sparse=False)
    int_enc = label_enc.fit_transform(arr)
    int_enc = int_enc.reshape(len(int_enc),1)
    onehot = onehot_enc.fit_transform(int_enc)
    return onehot_train,label_enc_train

def get_onehot_per_day(arr_perday, label_enc_train, length_onehot_train):
    onehot_enc = OneHotEncoder(sparse=False,n_values=length_onehot_train)
    int_enc = label_enc_train.transform(arr)
    int_enc = int_enc.reshape(len(int_enc),1)
    onehot = onehot_enc.fit_transform(int_enc)
    return onehot_per_day
1个回答

目前还不清楚这些函数是如何被调用的。您可能正在创建两个不同的 OneHotEncoder 实例。应该只有一个 OneHotEncoder 实例。

看来您正在使用 scikit-learn。Scikit-learn 有 Pipelines 来自动处理这类问题。如果您从自定义函数切换到流水线,您可以正确处理对训练和测试数据集的正确编码应用。