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
基于上述情况,我有几个问题:
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的,因为我认为这一点还不清楚:
适配到一个数据集(几乎
始终是培训数据)。这一步你在做什么?基本上
你正在告诉多少,哪一个和类的顺序(在你的
案例:你有6门课,顺序是:托尼、史密斯……)
transform
安装)转换任何数据。例如,您的测试结果将是:
fit
部分中定义的
Danny,在功能中没有任何1,因为该名称没有出现在训练数据中。正如我们在问题1中所说,如果您将超参数handle_unknow
设置为error
,您将获得一个错误,如果您将其设置为ignore
,您将继续使用0的所有功能
因此,正如您所看到的,基本上,您首先要对一个数据进行拟合,然后应用所学知识转换另一个数据。您只需安装一次OneHotEncoder
注意:您可以通过一步操作来调整和转换培训数据:
fit\u transform
如果我的生产代码和培训模型代码在不同的脚本中会怎样?基本上,我从训练脚本中保存模型,并加载到生产脚本中。那么,如何从培训中保存fit实用程序并在生产脚本中使用?这条路对吗?是的,对。我对我的答案做了修改。基本上,使用joblib
library。如果需要,您可以搜索有关如何使用它的额外文档。顺便说一句,如果你认为答案是正确的,那就接受它。