python - 在分类特征中结合低频率的水平
问题描述
我正在尝试在具有 315 个级别的分类特征中组合级别。
我查找每个级别的频率的代码是:
for feature in categorical:
percentage = df[feature].value_counts()/len(df)*100
print("Feature {}: \n{}".format(feature,percentage))
当“分类”时,它是一个包含数据集中所有分类特征的列表。
我可以看到“Feature_13”包括 315 个级别,其中大部分的频率低于 0.01。
如何有效地结合低频水平?
解决方案
假设您要删除频率(不是实际值)小于 0.01 的那些。
for feature in categorical:
df[feature] = df[feature].mask(df[feature].map(df[feature].value_counts(normalize=True)) < 0.01, 'Other')
如您所知,df[feature].value_counts(normalize=True)
返回一个系列。然后,方法map
使用这个系列作为字典,将单元格值映射到相应的频率。有了这个条件< 0.01
,我们就可以筛选出频率小于0.01的那些。最后,函数mask
有助于将这些有效单元格的值转换为“其他”。
如果您想知道将稀有分类值分组到单个集合中的阈值应该是多少,这里是示例。假设我们想要对包含频率分布的较低 10% 的稀有分类值进行分组。
frequencies = df[feature].value_counts(normalize=True, ascending=True)
threshold = frequencies[(frequencies.cumsum() > 0.1).idxmax()]