Проблемы пониженной выборки со сложным набором данных - PullRequest
1 голос
/ 24 апреля 2020

У меня есть несбалансированный набор данных, и я хочу уменьшить его.

Это набор данных:

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 - это порядок значений, значение - это измеренное значение, а 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'])

, но, очевидно, это только что выбрал несколько строк из исходного datafame (которые принадлежали класс большинства) и уронил их. В результате я получил несколько фрагментов из каждой временной серии в каждом классе, но информация, которая была в полной временной серии, была потеряна.

Я ищу способ уменьшить выборку набора данных таким образом, чтобы из большинства классов отбрасывается целый временной ряд (id_unique), и я получаю равное количество полных временных рядов для каждого класса. Выбор должен быть случайным.

Я пробовал несколько групповых строк, но все они приводили к ошибкам ..

Спасибо за любые подсказки по этому поводу!

1 Ответ

0 голосов
/ 24 апреля 2020

Вот возможное решение:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...