我有一个不平衡的数据集,例如:
tag #elements
a 1500
b 3250
c 320
d 260
它导致过度拟合。我想随机消除某些具有特定名称的行,以便我的数据集更加平衡。例如,消除后我想要这样的东西;
tag #elements
a 300
b 300
c 300
d 260
但是,我建议您使用它,如果可能的话,可以在某些范围内随机消除它们,例如元素的最低数量(在我们的例子中为260个)加上50个左右(我不知道正确的执行方式)。因此,消除后元素的数量将如下所示:
tag #elements
a 307
b 286
c 275
d 260
请注意,这些数字与标签数相对应。数据集的总长度为5330。我想减少它。
先谢谢了。
答案 0 :(得分:0)
使用sample
,您可以这样操作:
#create a dataframe like yours
df = pd.DataFrame({'tag':['a']*1500 + ['b']*3250 + ['c']*320 + ['d']*260,'col1':range(5330)})
min_size = df.groupby('tag').count().min()[0] #here it's 260
max_plus = 50
df_sample = (df.groupby('tag',as_index=False)
.apply(lambda x: x.sample(min(len(x), min_size + np.random.randint(max_plus,size=1))))
.reset_index(drop=True)) # this is not mandatory, it depends of your needs
然后例如我的尝试:
print (df_sample.groupby('tag').count())
Out[292]:
col1
tag
a 270
b 299
c 287
d 260