为什么要用独热编码

为什么要用独热编码,这是特征工程中的问题,如果是类别型的特征,比较粗的方法就是将文本特征进行数值化,比如'A'->1,'B'->2。

但是,作为类别型特征,单纯的将其数值化会让模型赋予了数值大小含义,而实际上数字大或小并没有区别。

 

所以针对类别型特征,用one-hot独热编码进行处理。如:特征A,有三个类别a,b,c。经过独热编码,将会生成3个特征:A_a,A_b,A_c。Pandas的get_dummies就能做到这个一点。代码参考如下:

 

独热编码会遇到什么问题

以上是讲为什么要用独热编码,那么独热编码会遇到什么问题呢?

一般训练集的数据和测试集的原始数据上是没有问题的,但是数据分布上可能存在差异,比如训练数据train_Data中某类别特征A下数据有a,b,c三种类别,而测试数据test_Data这个特征下只有b,c,d,e特征。

单独对train_Data做独热编码会得到A_a,A_b,A_c,

单独对test_Data做独热编码会得到A_b,A_c,A_d .A_e。

这样导致两个数据的特征维度或者特征数数不一样,就不能用训练集训练的模型对测试集做预测和分类。

 

如何解决独热编码后特征不一致问题

针对这个问题,可以有以下思考:

(1)对于比较明确的特征,已经知道其类别是哪几个(范围),可以手工的生成几个新的类别特征,然后将原始数据中的类别值映射过去,为a 则A_a下为1,其他A_b,A_c特征均为0。

(2)对于想省事省力的同学,或者特征数太多,几百上千,去人工做几百新特征会很耗时。可以将训练数据train_Data与测试数据test_Data放一起进行独热编码,再将数据拆分出train_Data,test_Data进行训练和预测。会用到pandas库中的函数:

(3)还有另外一种方法,分别对训练数据和测试数据单独编码,分别得到新的一组特征后,测试集特征需要添加自己没有训练集中有的新特征并用0进行填充。而测试集中比训练集多出的特征要进行删除。以下是案例:

 

参考:

http://fastml.com/how-to-use-pd-dot-get-dummies-with-the-test-set/

https://blog.csdn.net/maotianyi941005/article/details/88582464

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐