Python 列车验证和测试集中的一个热编码(生产数据)

Python 列车验证和测试集中的一个热编码(生产数据),python,machine-learning,scikit-learn,one-hot-encoding,data-preprocessing,Python,Machine Learning,Scikit Learn,One Hot Encoding,Data Preprocessing,例如,我有下面的火车组 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

例如,我有下面的火车组

   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
现在假设我在生产中有测试数据,在
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
基于上述情况,我有几个问题:

  • 如何处理生产测试数据中分类变量的级别或值的新条目
  • 如何维护模型的输入特征尺寸(例如,上面的示例中,培训中为6,测试数据中为5)
  • 同样
    Tony
    在列车组中为功能0,但在测试中为功能3;它是否影响训练模型的测试输入预测
  • 如何处理生产测试数据中的新级别条目?
    OneHotEncoder
    对此问题有一个超参数:
    handle\u unknown

    句柄\u未知{'error','ignore'},默认为='error' 是否提出 错误或忽略,如果过程中存在未知的分类功能 变换(默认为提升)。当此参数设置为 “忽略”并且在转换过程中遇到未知类别 此功能产生的一个热编码列将全部为零。 在逆变换中,未知类别将表示为无

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

    enc = OneHotEncoder(handle_unknown='ignore')
    
    如何维护模型的输入特征尺寸?课程顺序? 模型将始终保持拟合数据的输入特征尺寸。例如,使用您提供的数据,如果您为
    OneHotEncoder
    安装了培训数据,您将始终有6个输入

    而且,这些输入也总是具有相同类别的训练数据。我的意思是,在你的数据中,特征0总是指Tony,特征1指Smith

    如果要将安装的OneHotEncoder传输到另一个脚本,可以使用
    joblib
    library。例如:

    import joblib
    
    enc = OneHotEncoder(handle_unknown='error')
    enc.fit(data)
    joblib.dump(enc, 'encoder.joblib')
    
    然后,从另一个脚本加载:

    enc = joblib.load('encoder.joblib')
    
    澄清 最后,我想澄清这个过程以及你是如何进行OneHotEncode的,因为我认为这一点还不清楚:

  • 对于OneHotEncoding,首先,您需要将
    适配到一个数据集(几乎
    始终是培训数据)。这一步你在做什么?基本上
    你正在告诉多少,哪一个和类的顺序(在你的
    案例:你有6门课,顺序是:托尼、史密斯……)

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

  • Shane,有没有想过,这是出现在测试数据中的第一个类,它将保留功能3(因此,1将出现在功能3中,而零将出现在其他功能中),因为它是在带有训练数据的
    fit
    部分中定义的

    Danny,在功能中没有任何1,因为该名称没有出现在训练数据中。正如我们在问题1中所说,如果您将超参数
    handle_unknow
    设置为
    error
    ,您将获得一个错误,如果您将其设置为
    ignore
    ,您将继续使用0的所有功能

    因此,正如您所看到的,基本上,您首先要对一个数据进行拟合,然后应用所学知识转换另一个数据。您只需安装一次
    OneHotEncoder


    注意:您可以通过一步操作来调整和转换培训数据:
    fit\u transform

    如果我的生产代码和培训模型代码在不同的脚本中会怎样?基本上,我从训练脚本中保存模型,并加载到生产脚本中。那么,如何从培训中保存fit实用程序并在生产脚本中使用?这条路对吗?是的,对。我对我的答案做了修改。基本上,使用
    joblib
    library。如果需要,您可以搜索有关如何使用它的额外文档。顺便说一句,如果你认为答案是正确的,那就接受它。