火车验证和测试集中的一种热编码(生产数据)

One hot coding in Train Validation and Test set (Production data)

例如我有以下训练集。

   name     values
0  Tony      100
1  Smith     110
2  Sam       120
3  Shane     130
4  Sam       140
5  Ram       160

一次热编码后变成

    values   0    1    2    3    4   
0   100      1    0    0    0    0
1   110      0    1    0    0    0
2   120      0    0    1    0    0
3   130      0    0    0    1    0 
4   140      0    0    1    0    0
5   160      0    0    0    0    1

现在假设我在生产中有测试数据 Danny name 的新级别:

   name     values
0  Shane      200
1  Danny      210
2  Sam        220
3  Tony       180
4  Danny      150

经过一次热编码后

    values   0    1    2    3    
0   200      1    0    0    0 
1   210      0    1    0    0
2   220      0    0    1    0
3   180      0    0    0    1
4   150      0    1    0    0

基于以上情况我有几个问题:

  1. 如何处理生产测试数据中新的水平条目或分类变量值?
  2. 如何保持模型的输入特征大小(对于上面的例子,训练数据为 6,测试数据为 5)?
  3. 另外 Tony 在训练集中是特征 0,但在测试中它是特征 3;它会影响训练模型的测试输入预测吗?

如何处理生产测试数据中新级别的输入?

OneHotEncoder 有一个针对此问题的超参数:handle_unknown

handle_unknown{‘error’, ‘ignore’}, default=’error’ Whether to raise an error or ignore if an unknown categorical feature is present during transform (default is to raise). When this parameter is set to ‘ignore’ and an unknown category is encountered during transform, the resulting one-hot encoded columns for this feature will be all zeros. In the inverse transform, an unknown category will be denoted as None.

如您所见,此超参数有两个不同的值。如果在你的测试中可以出现新的class(就像你的例子Danny),我建议使用值ignore:

enc = OneHotEncoder(handle_unknown='ignore')

如何保持模型的输入特征尺寸? classes?

的顺序

模型将始终保持拟合数据的输入特征大小。例如,使用您提供的数据,如果您用训练数据拟合 OneHotEncoder,您将始终有 6 个输入。

并且,同样始终,此输入将具有与训练数据相同的类别。我的意思是,在你的数据中,feature 0 将始终引用 Tonyfeature 1史密斯,..

如果你想将安装的 OneHotEncoder 转移到另一个脚本,你可以使用 joblib 库来完成。例如:

import joblib

enc = OneHotEncoder(handle_unknown='error')
enc.fit(data)
joblib.dump(enc, 'encoder.joblib')

然后,从另一个脚本加载:

enc = joblib.load('encoder.joblib')

澄清

最后,我想澄清一下这个过程以及你是如何进行 OneHotEncode 的,因为我认为它根本不清楚:

  1. 对于OneHotEncoding,首先,你需要fit到一个数据集(差不多 总是训练数据)。你在这一步做什么?基本上 你说的是 class 的数量、数量和顺序(在你的 案例:你有 6 个 classes,顺序为:Tony, Smith, ..)

  2. 然后,您可以使用之前使用 transform 安装的 OneHotEncoder 转换任何数据。例如,您的测试结果将是:

Shane,没想到,它是第一个出现在你的测试数据中的class,它将保持特征3(因此 1 将出现在 feature 3 中,其他特征为零),因为它是在 fit 部分中定义的有训练数据。

Danny,不会有任何 1 的特征,因为这个名字没有出现在训练数据中。正如我们在问题 1 中所说的,如果将超参数 handle_unknow 设置为 error,则会出现错误,如果将其设置为 ignore,则将继续执行具有 0.

基本上,如您所见,您首先要适应一个数据,然后应用您学到的知识来转换另一个数据。你只需要适应一次 OneHotEncoder.

注意:您可以一步完成训练数据的拟合和转换:fit_transform