当培训和测试中的功能数量不同时,如何在生产环境中处理“一键编码”?

时间:2018-07-24 18:24:50

标签: python machine-learning feature-selection one-hot-encoding

在进行某些实验时,我们通常训练70%,然后进行33%的测试。但是,当您的模型投入生产时会发生什么?可能会发生以下情况:

训练集:

-----------------------
| Ser |Type Of Car    |
-----------------------
|  1  | Hatchback     |
|  2  | Sedan         |
|  3  | Coupe         |
|  4  | SUV           |
-----------------------

在进行一次热编码后,这就是我们得到的:

-----------------------------------------
| Ser | Hatchback | Sedan | Coupe | SUV |
-----------------------------------------
|  1  |     1     |   0   |   0    |  0 |
|  2  |     0     |   1   |   0    |  0 |
|  3  |     0     |   0   |   1    |  0 |
|  4  |     0     |   0   |   0    |  1 |
-----------------------------------------

我的模型已经过培训,现在我想在多个经销商中部署它。 该模型针对4个特征进行了训练。现在,某个经销商只销售轿车和双门轿跑车:

测试集:

-----------------------
| Ser |Type Of Car    |
-----------------------
|  1  | Coupe         |
|  2  | Sedan         |
-----------------------

一键编码结果为:

---------------------------
| Ser | Coupe     | Sedan |
---------------------------
|  1  |     1     |   0   |
|  2  |     0     |   1   |
|  3  |     1     |   0   |
---------------------------

这里我们的测试仪只有2个功能。为每个新经销商建立模型是没有意义的。生产中如何处理此类问题?还有其他编码方法可用于处理分类变量吗?

2 个答案:

答案 0 :(得分:4)

我假设您正在使用熊猫进行一次热编码。如果不是,则您需要做更多的工作,但是逻辑仍然相同。

import pandas as pd

known_categories = ['Sedan','Coupe','Limo'] # from training set

car_type = pd.Series(['Sedan','Ferrari']) # new category in production, 'Ferrari'

car_type = pd.Categorical(car_type, categories = known_categories)

pd.get_dummies(car_type)

结果是

    Sedan   Coupe   Limo
0   1.0      0.0    0.0    # Sedan entry
1   0.0      0.0    0.0    # Ferrari entry

由于Ferrari不在已知类别的列表中,所以Ferrari的所有一个或所有编码条目均为零。如果您在生产数据中找到了新的汽车类型,则编码该汽车类型的行应全部为0。

答案 1 :(得分:0)

生产中模型的输入应与培训期间的输入相同。因此,如果在培训期间您一口气编码了4个类别-在制作中也要这样做。使用零表示缺少的功能。删除您在训练期间未见过的功能。