【问题标题】:Downsampling problems with complex dataset复杂数据集的下采样问题
【发布时间】:2020-04-24 14:22:53
【问题描述】:

我有一个不平衡的数据集,我想对其进行下采样。

这是数据集:

testframe = pd.DataFrame()
testframe['id_unique'] = [0,0,0,1,1,1,2,2,2,3,3,3]
testframe['t'] = [1,2,3,1,2,3,1,2,3,1,2,3]
testframe['value'] = [10,11,12,21,22,23,31,32,33,41,42,43]
testframe['class'] = [1,1,1,2,2,2,1,1,1,1,1,1]

其中id_unique代表唯一时间序列,t是值的顺序,value是测量值,class 是时间序列所属的类。

这是一个不平衡的数据集,我想将其下采样到以下:

final_frame = pd.DataFrame()
final_frame['id_uniqe'] = [0,0,0,1,1,1]
final_frame['t'] = [1,2,3,1,2,3]
final_frame['value'] = [10,11,12,21,22,23]
final_frame['class'] = [1,1,1,2,2,2]

我试过了:

from imblearn.under_sampling import RandomUnderSampler

rus = RandomUnderSampler(sampling_strategy = 'all')

X_rus, y_rus= rus.fit_resample(df.drop(['classes'], axis = 1), df['classes'])

但显然这只是从原始数据名(属于多数类)中选择了一些行并将它们删除。结果,我从每个班级的每个时间序列中获得了一些 sn-ps,但是完整时间序列中的信息丢失了。

我正在寻找一种以某种方式对数据集进行下采样的方法,以便从多数类中删除一个完整的时间序列 (id_unique),并且我最终为每个类得到相同数量的完整时间序列。选择应该是随机的。

我尝试了一些 groupby 行,但它们都导致错误..

感谢您对此的任何提示!

【问题讨论】:

  • 重采样是指在多数类中挑选出与少数类中相同数量的 id 吗?
  • 没错。我想要一个平衡的数据集,现在上采样不是一个选项。当您不处理时间序列数据时,使用 imblearn 进行下采样非常容易。

标签: pandas downsampling imbalanced-data


【解决方案1】:

这是一个可能的解决方案:

# ids 
majority_ids = testframe.loc[testframe['class']==1, 'id_unique'].unique()
minority_ids = testframe.loc[testframe['class']==2, 'id_unique'].unique()

# pick out a given number of id's in majority class
all_ids = majority_ids[:len(minority_ids)+1] + minority_ids

final_df = testframe[testframe.id_unique.isin(all_ids)]

输出:

    id_unique  t  value  class
3           1  1     21      2
4           1  2     22      2
5           1  3     23      2
9           3  1     41      1
10          3  2     42      1
11          3  3     43      1

【讨论】:

  • 谢谢,这行得通,因为我需要随机选择的号码。这是我通过 np.random.sample(population, k) 实现的。这就是我要找的东西! final_df = testframe[testframe.id_unique.isin(all_ids)]
猜你喜欢
  • 2015-02-20
  • 2017-01-28
  • 2013-03-27
  • 2023-01-29
  • 2018-08-06
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多