请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

用来预测的数据怎么做数据预处理呢

如果我们训练好一个模型,拿来投入生产了,这时候如果来了一个新的数据,那要怎么做和训练测试集相同程度的预处理呢?
例如训练集测试集做了归一化正则化,然后对分类变量做了onehot编码生成了多个虚拟变量。加入我们数据集变量a有10个特征,onehot以后生成了10个虚拟变量,那么模型也是在这10个虚拟变量上训练出来的。而如果我们来了一条新的数据要做预测,理论上说应该也是要做归一化正则化,然后用onehot做处理,正则化归一化的话应该是因为有estimater,可以直接代公式算,那onehot要怎么做呢,一条数据的变量只会有一个固定的类别值啊。
我网上找的一个文章(https://blog.csdn.net/maotianyi941005/article/details/88582464
)说是可以先把这个新数据合并到训练集上做预处理然后再拿出来做predict,或者查看每个分类变量的onehot之后的虚拟变量,手动添加进去。但是总感觉这种方法效率很低啊,有没有什么快捷的办法,或者说实际工程中是怎么把预测数据做到和模型的训练测试集一样的预处理呢?

正在回答

1回答

我不是很肯定我是不是理解了你的问题。


我不确定你是不是理解什么是 one-hot 编码。


比如我们有一个类别变量,叫做公司。可能的取值范围是 A, B, C

那么这一个特征,在one-hot编码后,会变成三个特征,分别对应 A, B, C

如果原来数据这个特征的值是A公司,则one-hot以后,结果就是 1 0 0;

如果原来数据这个特征的值是B公司,则one-hot以后,结果就是 0 1 0;

如果原来数据这个特征的值是C公司,则one-hot以后,结果就是 0 0 1;


现在,如果测试数据来了,完全使用和上面一样的规则,

A 变成 1 0 0;B 变成 0 1 0;C 变成 0 0 1


如果你的问题是,测试数据来了一个 D 公司怎么办?

对不起,不可以。因为,这是训练数据集不知道的信息。对于类别变量,如果使用one-hot编码,训练数据集必须知道所有的类别。否则,one-hot只能将非ABC的公司翻译成0 0 0。


如果你的问题是工程代码,那么sklearn中的管道,就是在解决这个问题。我们可以将多个步骤放到一个管道中,来了新的数据,就会自动走管道中的每一步。管道的使用在个课程中有介绍。


继续加油!:)


0 回复 有任何疑惑可以回复我~
  • 提问者 Suspendz #1
    我的问题不是在于测试集,而是在于模型训练好以后投入使用时候用来预测的数据,因为实际用来预测的时候,很多时候都是一批一批的数据拿来用,因为这些数据可能采集或者其他问题,很可能某些数据存在数据倾斜之类的问题,比如说某一批要做预测的数据里面公司变量只采集到了ab公司的没有c公司的,这时候做预处理的话正则化归一化直接调用训练测试集的estimater参数计算就好。但是分类变量onehot编码的话,无论是pandas的get_dummy还是sklearn的onehotencoding方法,这两个函数都是针对某一批数据做onehot编码的,那用这两个方法就只能拆成a公司b公司两个变量了,这是肯定不行的。那么实际应用中这种情况是怎么处理的,是把实际用来预测的数据到训练测试集里面,利用全集包含全部特征的特点做onehot编码么,还是有其他什么方法?
    回复 有任何疑惑可以回复我~ 2019-07-30 14:41:14
  • liuyubobobo 回复 提问者 Suspendz #2
    这就是我在这个回答里说的,你只能重新训练模型。因为原有的测试数据没有c,就不可能蕴含和c相关的知识。现在你的业务场景需要处理c的情况,说明原来训练的模型已经不可用了,就需要重新训练模型。
    回复 有任何疑惑可以回复我~ 2019-07-30 14:47:36
  • 提问者 Suspendz 回复 liuyubobobo #3
    好吧明白了。
    回复 有任何疑惑可以回复我~ 2019-07-31 09:19:53
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信