在去年第一次参加ctr比赛中碰到类别特征时,第一反应是进行one-hot编码而不能使用序号编码,因为序号编码给类别的不同属性赋予了数值的意义,然而在实际比赛中发现,one-hot编码后的效果并不好,甚至和直接序号编码的效果不相上下,但是带来训练时间的增加非常大,那么为什么对类别进行one-hot编码和label编码效果差不多,而不是更好呢?在参加比赛之后我对这些有了更多的见解,在此总结。
其实对类别特征进行onehot编码带了效果很差更多指的是类别特征维度很高的时候(相对样本量来说),主要的问题是:
1.可能无法在这个类别特征上进行切分。使用one-hot coding的话,意味着在每一个决策节点上只能用 one-vs-rest (例如是不是狗,是不是猫,等等) 的切分方式。当特征纬度高时,每个类别上的数据都会比较少,这时候产生的切分不平衡,切分增益(split gain)也会很小(比较直观的理解是,不平衡的切分和不切分几乎没有区别)。
2.会影响决策树的学习。因为就算可以在这个类别特征进行切分,也会把数据切分到很多零散的小空间上,如下图左所示。而决策树学习时利用的是统计信息,在这些数据量小的空间上,统计信息不准确,学习会变差。但如果使用下图右边的切分方法,数据会被切分到两个比较大的空间,进一步的学习也会更好。
也就是说,正确的做法应该是一次切分,均匀