根据一些规则对数据帧进行采样:平衡多标签数据集



我有一个这样的数据帧:

df = pd.DataFrame({'id':[10,20,30,40],'text':['some text','another text','random stuff', 'my cat is a god'],
'A':[0,0,1,1],
'B':[1,1,0,0],
'C':[0,0,0,1],
'D':[1,0,1,0]})

这里我有从AD的列,但我的实际数据帧有100个值为01的列。这个真实的数据帧有10万个反应词。

例如,列Atext的第3行和第4行相关,因为它被标记为1。同样,Atext的第一行和第二行无关,因为它被标记为0

我需要做的是对这个数据帧进行采样,使其具有相同或大约相同数量的功能。

在这种情况下,特征C只有一个occurrece,所以我需要以这样的方式过滤所有其他列,即我有一个文本带有A,一个text带有B,一个text带有C等等

最好的方法是:例如,我可以使用n=100进行设置,这意味着我希望以一种拥有100条具有所有功能的记录的方式进行采样。

这个数据集是一个多标签数据集训练,非常不平衡,我正在为机器学习任务寻找平衡它的最佳方法。

重要:我不想排除0功能。我只想用10有大约相同数量的列

例如。对于具有1k个记录的最终数据集,我希望具有从Afinal_column的所有列,以及具有相同编号的10的所有这些列。为了实现这一点,我将需要随机丢弃text行并且仅丢弃id

我尝试的方法是查找具有最低10计数的特征,然后使用该值作为阈值。

编辑1:我认为一种可能的方法是使用:

df.sum(axis=0, skipna=True)

然后我可以使用和值最低的列作为阈值来过滤文本列。我不知道如何做这个过滤步骤

感谢

您期望的确切输出尚不清楚,但假设您希望每个字母有1个随机行,则可以重新整形(同时去掉0(并使用GroupBy.sample:

(df
.set_index(['id', 'text'])
.replace(0, float('nan'))
.stack()
.groupby(level=-1).sample(n=1)
.reset_index()
)

注意。如果需要,可以重命名列输出:

id             text level_2    0
0  30     random stuff       A  1.0
1  20     another text       B  1.0
2  40  my cat is a god       C  1.0
3  30     random stuff       D  1.0

最新更新