分类变量,进行One hot编码,维度升高,如何处理?

  统计/机器学习 数据预处理 数据降维    浏览次数:12493        分享
2

如果一个分类变量有非常多的类,进行one hot编码后,维度会升得很高,该如何处理?

谢谢!


 

whs_ita   2018-01-12 15:09



   7个回答 
5

有几种思路可以尝试的:

1. 要看这个变量背后的逻辑了,就像雷猴说的,它的意义是什么,有没有办法按照这个分类变量本身的意义进行合并。

2. 按照目标值进行合并,比如你的目标是0-1二元预测,如果这个分类变量取A的时候,90%是1;取B的时候,89%是1。那么A和B就可以合并在一起。最后再做one hot。如果你的目标是回归,也是类似的方法。

3. 把分类变量的分类按频次高低排序,累计到90%或者95%的分类都保留,最小的10%或者5%可以合并成一类。

4. hashing trick,随机合并。


SofaSofa数据科学社区DS面试题库 DS面经

DuckU   2018-02-12 11:09

3

那要看你的分类变量是什么了,有没有办法进行一些合并。

比如你的分类变量是中国的村镇,那你可以合并到县或者市甚至省这一级别。

比如你的分类变量是产品,那你看看能不能分到什么大类里面。

总之就是进行合并处理。


此外,有些分类变量可能频次特别低,比如出现次数小于20次或者50次的那种,你把所有这种小频次的大不了也可以合并起来。


SofaSofa数据科学社区DS面试题库 DS面经

雷猴   2018-02-07 12:32

3

还有个思路是不对分类变量做one hot处理,而是用y的均值代替。


SofaSofa数据科学社区DS面试题库 DS面经

曾经是科比   2018-03-19 14:37

3

可以低维嵌入

SofaSofa数据科学社区DS面试题库 DS面经

kym1990   2019-05-10 07:42

的确,做embedding是现在比较流行的思路 - 何立诚   2019-11-16 01:51
万物皆可embedding - 我小宋   2022-03-25 19:51
2

用count来代替。比如类别A出现10次,就用10代替所有的A,B出现20次,用20代替B。这样就把分类的变量全部换成了整数。

SofaSofa数据科学社区DS面试题库 DS面经

zl_pku   2019-08-07 16:42

这个最近业界比较常用的 - 东布东   2019-12-13 13:39
2

如果是用户id item id这种特征的话,建议使用embedding,用一个模型先对这些特征的表达进行预训练,可以有效的降低维数,而且可以提高 training和serving时的效率。这个预训练用的模型虽然需要的数据量很大,但也不需要更新的很频繁,对算力的占用不算高。

如果是省市 id 这种特征的话,one-hot 之后有几十、几百维这样,可以在模型内部进行 embedding


还有一种方式就是选择更适用于高维稀疏数据的模型,如 LR FM 这种。

SofaSofa数据科学社区DS面试题库 DS面经

dearelenore   2020-07-31 11:29

1

我一般用每个分类对应的目标变量的均值来代替

除了上面各位提到的方法,还有人说可以用每个分类出现的频数来代替,How to deal with Features having high cardinality。实际效果应该和feature hashing差不多吧。

SofaSofa数据科学社区DS面试题库 DS面经

LiShanfei   2018-12-18 04:22



  相关讨论

hashing trick或者feature hashing是什么

维数大于样本数的问题

为什么LDA降维最多降到类别数k-1?

python里怎么实现t-SNE降维?

NLP中的hashing trick是什么?

低维嵌入(low dimension embedding)是什么意思?

非序列数据(任务),针对种类型特征可以用embedding技术吗?

三维以上聚类都要先降维?10维数据直接聚类然后silhouette判断效果可以吗?

什么时候应该用isomap降维方法?

t-SNE如何实现降维?

  随便看看

AB实验的哈希分桶技术是什么意思?

怎么从矩母函数(mgf)推导得到概率密度函数(pdf)?

pandas报错: 'DataFrame' object has no attribute 'unique'

cvr和ctr的区别是什么?

numpy里矩阵乘法matmul,@和dot的区别?