问题引入
在做特征工程的时候,都会使用到one_hot编码,编码可以解决某些不能被数值化的问题,但是这种编码会带来很多问题,这点之前已经说过,那么如何解决这个问题呢?
问题解答
- 类别特征的最优切分。这个方法需要对应工具的支持,我所知的支持这个方法的工具有h2o.gbm和LightGBM,用LightGBM可以直接输入类别特征,并产生同图1右边的最优切分。在一个k维的类别特征寻找最优切分,朴素的枚举算法的复杂度是指数的 O(2^k)。LightGBM 用了一个 O(klogk)[1] 的算法。算法流程如图2所示:在枚举分割点之前,先把直方图按照每个类别对应的label均值进行排序;然后按照排序的结果依次枚举最优分割点。当然,这个方法很容易过拟合,所以LightGBM里面还增加了很多对于这个方法的约束和正则化。图3是一个简单的对比实验,可以看到Optimal的切分方法在AUC提高了1.5个点,并且时间只多了20% 。
- 转成数值特征。在使用 sklearn 或 XGBoost 等不支持类别特征的最优切分工具时,可以用这个方法。常见的转换方法有: a) 把类别特征转成one-hot coding扔到NN里训练个embedding;b) 类似于CTR特征,统计每个类别对应的label(训练目标)的均值。统计的时候有一些小技巧,比如不把自身的label算进去(leave-me-out, leave-one-out)统计, 防止信息泄露。
- 其他的编码方法,比如binary coding等等,同样可以用于不支持类别特征的算法。这里有一个比较好的开源项目,封装了常见的各种编码方法: https://github.com/scikit-learn-contrib/category_encoders
喜欢就关注一下啦~~~