【问题标题】:One hot coding in Train Validation and Test set (Production data)训练验证和测试集(生产数据)中的一个热门编码
【发布时间】:2021-06-28 06:07:06
【问题描述】:

例如我有下面的火车。

   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

现在假设我在生产中有测试数据,Dannyname 中有一个新级别:

   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;它会影响对训练模型的测试输入的预测吗?

【问题讨论】:

    标签: python machine-learning scikit-learn one-hot-encoding data-preprocessing


    【解决方案1】:

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

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

    handle_unknown{'error', 'ignore'}, default='error' 是否提高 如果在期间存在未知的分类特征,则错误或忽略 转换(默认为提升)。当此参数设置为 ‘ignore’ 并且在变换过程中遇到未知类别,则 生成的此功能的 one-hot 编码列将全为零。 在逆变换中,未知类别将表示为无。

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

    enc = OneHotEncoder(handle_unknown='ignore')
    

    如何保持模型的输入特征大小?课程顺序?

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

    而且,这些输入总是具有相同类别的训练数据。我的意思是,在你的数据中,feature 0 总是指代 Tonyfeature 1 指代 Smith,..

    如果您想将适合的 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 到一个数据集(几乎 总是训练数据)。这一步你在做什么?基本上 你在告诉有多少,哪个和班级的顺序(在你的 案例:您有 6 个班级,顺序为:TonySmith、..)

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

    Shane,有没有想过,它是出现在您的测试数据中的第一个类,它将保持 特征 3(所以一个 1 将出现在特征 3 中,其他特征为零),因为它是在带有训练数据的 fit 部分中定义的。

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

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

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

    【讨论】:

    • 如果我的生产代码和训练模型代码在不同的脚本中怎么办?基本上我正在从训练脚本中保存模型并加载到生产脚本中。那么如何从培训中保存 fit 实用程序并在生产脚本中使用?这是正确的方法吗?
    • 是的,没错。我制作并编辑了我的答案。基本上,使用joblib 库。如果需要,您可以搜索有关如何使用它的额外文档。顺便说一句,如果您认为答案已经正确回答,请接受。
    猜你喜欢
    • 2019-05-01
    • 2020-11-12
    • 2014-09-22
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2012-06-04
    • 2012-07-04
    • 2021-09-07
    相关资源
    最近更新 更多