删除不常用的分类数据?

数据挖掘 熊猫 预处理 分类数据 数据泄露
2022-02-18 06:33:33

我是数据科学领域的新手,正在做一项任务。我有一个包含 150K 行的数据集,其中包含分类和数字数据,目标是布尔值。一个分类列由相当多的随机频率出现的代码组成(在64K记录中出现频率最高,在一条记录中出现频率最低,数量很大)数据集中只有1条记录的类别数量很大(35) ,大约 110 个类别出现 10 次或更少;

>>> df.groupby('category')['target'].agg(['count','mean']).sort_values('count')
                      count      mean
category                       
code__1                   1  0.000000
//readabity
code_36                   1  0.000000
code_37                   2  0.000000
code_38                   2  0.500000
//readability
code_103                 10  0.000000
code_151                 73  0.000000
code_175                706  0.247875
code_188              23145  0.032059
code_189              64414  0.074006

对于我们拥有的总数据集:

>>> df['target'].agg(['mean','count'])
mean          0.072536
count    159880.000000

我有点担心,当我使用所有类别并将它们转换为 189 个二进制列时,我的数据集会变得失控pd.get_dummies我正在考虑丢弃所有出现次数少于 10 的类别,并将它们替换为虚拟类别。现在我的3个问题:

  1. 这是明智的吗?我会引入数据泄漏或弄乱未来的数据集吗?
  2. 有没有办法在 sklearn/pandas 中做到这一点?我正在考虑一种 python 方法,将 code103..189 存储到一个列表中cats,遍历我的类别列并将cats列表中没有的所有类别替换为dummy,这可以在未来的集合或测试集上重现。
  3. 另一种方法是将所有类别替换dummiemean接近目标列的总平均值的位置?那么我会放弃 code_189 (最常见的),因为它与 0.072 相差不大?
1个回答

最直接的方法是将这些小类别视为单个“未知”类别 - 如果它们真的很小,您的模型不应该发生巨大变化。

另一种方法是将所有类别替换为平均值接近目标列总平均值的假人?那么我会放弃 code_189 (最常见的),因为它与 0.072 相差不大?

这个想法似乎接近于均值编码方法。平均编码包括创建一个列,其中类别通过该类别的目标进行编码。这可以自然地结合小类别的知识——你可以用全局平均值替换它们的平均值,或者使用平滑。我鼓励你看这个关于平均编码的片段(下一个视频是关于正则化的)。