问题引入
在作特征工程的时候,都会使用到one_hot编码,编码能够解决某些不能被数值化的问题,可是这种编码会带来不少问题,这点以前已经说过,那么如何解决这个问题呢?git
问题解答
- 类别特征的最优切分。这个方法须要对应工具的支持,我所知的支持这个方法的工具备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
喜欢就关注一下啦~~~github
