我是数据科学领域的新手,正在做一项任务。我有一个包含 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个问题:
- 这是明智的吗?我会引入数据泄漏或弄乱未来的数据集吗?
- 有没有办法在 sklearn/pandas 中做到这一点?我正在考虑一种 python 方法,将 code103..189 存储到一个列表中
cats,遍历我的类别列并将cats列表中没有的所有类别替换为dummy,这可以在未来的集合或测试集上重现。 - 另一种方法是将所有类别替换
dummie为mean接近目标列的总平均值的位置?那么我会放弃 code_189 (最常见的),因为它与 0.072 相差不大?