问题描述
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