训练集和测试集类别特征值不同的处理

1、one-hot编码怎么让测试集的类别与训练集的类别在数量上一致呢?https://www.zhihu.com/question/314941339
one-hot编码怎么让测试集的类别与训练集的类别在数量上一致呢?
我的训练集在one-hot编码后有4449个特征,而在测试集中有4109个特征,所以训练后的网络不能用在测试集中,不知道应该如何更改,希望大家帮助,谢谢!

关注者
6
被浏览
926
关注问题​写回答
​邀请回答
​添加评论
​分享

收起 ​
4 个回答
默认排序
VinerL
VinerL
机器学习,广告算法
1 人赞同了该回答
训练集onehot4449个特征,测试集就还用这4449个特征。两点说明:1.测试集如果出现训练集里没有的特征,因为权重没有训练过,特征没有意义,不需要使用。2.对于测试集命中的特征比训练集少的情况,比如训练集有性别,测试集没有,则测试集性别特征为 男:0 女:0,特征数量不会比训练集少。不需要填补缺失值之类的操作

发布于 2019-03-11
​赞同 1​
​添加评论
​分享
​收藏
​喜欢
ZJU某小白
ZJU某小白
NLP&对话系统
1 人赞同了该回答
这种情况最好不要one-hot处理。

训练好的模型处理没见过的测试集特征取值只有两种策略,要么以某种方式无视该取值(比如填充为训练数据最多取值的或者随机等等),要么以某种相似度计算为原则把新的取值与训练集的本特征取值联系起来。

如果one-hot了,就只剩下第一种策略了。

题主的特征新取值很多,如果该特征不是强特征,可以直接用第一种策略。如果是强特征,建议再结合特征的自身特性深挖一下。

发布于 2019-03-07
​赞同 1​
​1 条评论
​分享
​收藏
​喜欢
知乎用户
知乎用户
1 人赞同了该回答
一般操作是把训练集和测试集先拼接起来,然后做onehot,用的时候再拆开,避免你说的这种情况.

发布于 2019-03-07
​赞同 1​
​4 条评论
​分享
​收藏
​喜欢
Ming
Ming
训练集和测试集需要一起编码成one-hot,不然无法保证在测试集里一个词的编码与训练集一致

发布于 2019-03-25

2、训练和测试集上不同的标签编码器值是否不好?
https://www.pythonheidong.com/blog/article/284195/

在我的数据集中,我有一个名为product的分类功能。

假设在训练集中,其值在中{“apple”, “banana”, “durian”, “orange”,…}。另一方面,在测试集中,值现在可以是{“banana”, “orange”, pineapple"}。训练集中没有一些值(例如pineapple)。

我知道,如果我们事先拥有所有可能的值,则可以创建一个Label Encoder变量,并fit带有该功能可以具有的所有值。但是在这种情况下,我不能保证训练集可以覆盖测试集中的所有值(即,当一些新产品出现时)。

这让我非常担心,因为恐怕使用Label Encoding时,训练集可以映射为{“ apple”:1,“ banana”:2,“ durian”:3,“ orange”:4, … (成千上万) },但涉及到测试集上的映射时,我们将得到{“ banana”:1,“ orange”:2,pineapple“:3}。

我的问题是:

对分类模型有负面影响吗?例如,据我所知,如果apple成为功能中的重要值,则product该模型将更加关注1(apple的数值)。难道是误导,当 1是banana在测试集?
有什么方法可以解决在训练和测试集上具有不同值的标签编码器问题?
我发现了一些与此相关的链接,但这不完全是我的问题。

更新:请注意,product可以具有数千个值,这就是为什么我在这里使用Label Encoder而不是One Hot Coding的原因。

解决方案
将分类变量输入ML模型时,必须使用一种热编码。否则,模型将不得不处理apple < banana < durian < orange,实际上并非如此。

对于在测试数据集期间出现的未知值,该变量的所有列将为零,这最终使模型理解在训练期间看不到该值。

X= [[“apple”], [“banana”], [“durian”], [“orange”]]
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown=‘ignore’)
enc.fit(X)

enc.categories_
类别:

[array([‘apple’, ‘banana’, ‘durian’, ‘orange’], dtype=object)]
在测试数据期间,

enc.transform([[“banana”], [“orange”], [“pineapple”]]).toarray()
输出:

array([[0., 1., 0., 0.],
[0., 0., 0., 1.],
[0., 0., 0., 0.]])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值