在熊猫中对包含“相同”高基数信息的多列进行哈希编码

问题描述

我有一个包含数值特征和25个非常高的基数分类特征的数据集,我需要以一种有意义的方式对其进行编码,以便将其用于训练预测算法。我的问题是所有25列都对应于同一概念,因此理想情况下,它们应该全部编码为一个组。让我解释。熊猫数据框如下所示:

 memberid      code1   code2   code3 ...  code25      cost
 memberA       c1      c2      c4         c3          100.0
 memberB       c2      c3      c1         NaN         120.0
 memberC       c1      c2      c5         c3          200.0

这是由以下代码生成的(此处仅4个“代码”列):

data = {'memberid': ['memberA','memberB','memberC'],'code1': ['c1','c2','c1'],'code2': ['c2','c3','c2'],'code3': ['c4','c1','c5'],'code25': ['c3',np.nan,'c3'],'cost': [100.0,120.0,200.0]}

df = pd.DataFrame(data,columns = ['memberid','code1','code2','code3','code25','cost'])

我找到了一种方法来对“代码”列进行一次热编码,即创建一个如下所示的数据框:

has_c1   has_c2   has_c3   has_c4   has_c5      
1        1        1        1        0  
1        1        1        0        0
1        1        1        0        1

我的问题是所有“代码”列的值都具有非常高基数,因此像我刚才描述的那样,一种热编码会增加另外的〜15,000(稀疏),从而破坏了数据量)列到数据集。不幸的是,从内存的角度来看,这对于拟合ML算法是禁止的,因此我考虑针对此问题研究哈希编码。

不幸的是,尽管我能够使用numpy和一/零手动对“代码”列进行手动热编码,但我不知道如何将所有“代码”列的信息“分组”为,例如50列,其中包括哈希编码的组成部分。这可行吗?还是应该采用一种完全不同的方法来将这些高基数的“一组”特征一起编码?

解决方法

先尝试get_dummies,然后尝试sum

output = pd.get_dummies(df.filter(like='code'),prefix='Has').sum(level=0,axis=1)
Out[549]: 
   Has_c1  Has_c2  Has_c3  Has_c4  Has_c5
0       1       1       1       1       0
1       1       1       1       0       0
2       1       1       1       0       1

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...