如果一个分类变量有非常多的类,进行one hot编码后,维度会升得很高,该如何处理?
谢谢!
7个回答
有几种思路可以尝试的:
1. 要看这个变量背后的逻辑了,就像雷猴说的,它的意义是什么,有没有办法按照这个分类变量本身的意义进行合并。
2. 按照目标值进行合并,比如你的目标是0-1二元预测,如果这个分类变量取A的时候,90%是1;取B的时候,89%是1。那么A和B就可以合并在一起。最后再做one hot。如果你的目标是回归,也是类似的方法。
3. 把分类变量的分类按频次高低排序,累计到90%或者95%的分类都保留,最小的10%或者5%可以合并成一类。
4. hashing trick,随机合并。
那要看你的分类变量是什么了,有没有办法进行一些合并。
比如你的分类变量是中国的村镇,那你可以合并到县或者市甚至省这一级别。
比如你的分类变量是产品,那你看看能不能分到什么大类里面。
总之就是进行合并处理。
此外,有些分类变量可能频次特别低,比如出现次数小于20次或者50次的那种,你把所有这种小频次的大不了也可以合并起来。
可以低维嵌入
SofaSofa数据科学社区DS面试题库 DS面经用count来代替。比如类别A出现10次,就用10代替所有的A,B出现20次,用20代替B。这样就把分类的变量全部换成了整数。
SofaSofa数据科学社区DS面试题库 DS面经如果是用户id item id这种特征的话,建议使用embedding,用一个模型先对这些特征的表达进行预训练,可以有效的降低维数,而且可以提高 training和serving时的效率。这个预训练用的模型虽然需要的数据量很大,但也不需要更新的很频繁,对算力的占用不算高。
如果是省市 id 这种特征的话,one-hot 之后有几十、几百维这样,可以在模型内部进行 embedding
还有一种方式就是选择更适用于高维稀疏数据的模型,如 LR FM 这种。
SofaSofa数据科学社区DS面试题库 DS面经我一般用每个分类对应的目标变量的均值来代替
除了上面各位提到的方法,还有人说可以用每个分类出现的频数来代替,How to deal with Features having high cardinality。实际效果应该和feature hashing差不多吧。
SofaSofa数据科学社区DS面试题库 DS面经