复杂数据集的下采样问题
Downsampling problems with complex dataset
我有一个不平衡的数据集,我想对其进行下采样。
这是数据集:
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是时间序列所属的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'])
但显然这只是从原始数据名中选择了一些行(属于大多数 class)并删除了它们。结果,我从每个 class 中的每个时间序列中得到了一些片段,但是完整时间序列中的信息丢失了。
我正在寻找一种以某种方式对数据集进行下采样的方法,以便从大多数 class 中删除整个时间序列 (id_unique),我最终得到相同数量的每个 class 的完整时间序列。选择应该是随机的。
我尝试了一些 groupby 行,但它们都导致了错误..
感谢您对此的任何提示!
这是一个可能的解决方案:
# 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
我有一个不平衡的数据集,我想对其进行下采样。
这是数据集:
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是时间序列所属的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'])
但显然这只是从原始数据名中选择了一些行(属于大多数 class)并删除了它们。结果,我从每个 class 中的每个时间序列中得到了一些片段,但是完整时间序列中的信息丢失了。
我正在寻找一种以某种方式对数据集进行下采样的方法,以便从大多数 class 中删除整个时间序列 (id_unique),我最终得到相同数量的每个 class 的完整时间序列。选择应该是随机的。
我尝试了一些 groupby 行,但它们都导致了错误..
感谢您对此的任何提示!
这是一个可能的解决方案:
# 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