如何解决测试集中出现新特征值问题

问题描述

train set:
feature 1: feature space: [a, b, c]
test set :
datax: feature 1 == d
  • 在科研环境中,大家一般是将已有的数据集划分为 训练集,验证集,测试集,在对离散特征进行one-hot编码处理时,一般是在全量数据上进行(这有那么点违反train test unseen 的原则)。
  • 此类问题发生在实际工程任务上,如果不进行一定的处理,模型则无法覆盖测试数据上产生的新特征值,从而导致预测失败

解决方案

方案1:

sklearn代码包提供了 ignore 方案:简而言之,就是把该离散特征所有的one-hot置零

ohe = OneHotEncoder(handle_unknown=‘ignore’)

方案2:

一般遇到上述情况时,并不想失去这条数据中的特征信息,希望在模型中预先包装此信息。在真实离散特征数据中,一般会存在字段缺失情况,一般特征预处理时,会直接丢掉这部分数据,不纳入训练样本,或者采用预测模型进行数据填充的操作。

此外,也可以采用保留NAN值的方法,将字段缺失作为特征的一个新类别。
在生产环境中,补充一个处理新特征值归属为缺失字段特征的脚本。

方案3:

这是对方案2的一个升级版本,如果训练样本中某个离散特征存在一些占比特别小的特征值,可以将这些“稀有”的特征值归为一类,同样,测试集出现的新特征值将转为“稀有”类。

方案4:

如果离散特征值域基本固定,比如:性别 ,此时,测试集出现新值一般可能是数据存储错误问题,或者是归属不确定。解决方法时将此数据值定为特征空间的每个值,分别跑一次模型,然后采用投票机制输出最终结果,此方案适用于离散特征的特征值类别较小的情况,不然会影响在线计算速度。

方案5:

特征散列feature hashing,将离散数据转换为特征向量,此方法主要应用在NLP场景中,以及特征空间较大的离散特征,在sklearn和tensorflow都有相关实现代码,而且研究和实践表明,此处哈希冲突不会对准确性造成太大影响,但是失去了可解释性。

参考文献:

https://www.quora.com/Can-you-explain-feature-hashing-in-an-easily-understandable-way
https://stackoverflow.com/questions/41733997/how-to-handle-unseen-categorical-values-in-test-data-set-using-python

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值