为什么要用独热编码
为什么要用独热编码,这是特征工程中的问题,如果是类别型的特征,比较粗的方法就是将文本特征进行数值化,比如'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进行填充。而测试集中比训练集多出的特征要进行删除。以下是案例: