По выборке класса меньшинства с последовательными данными

#python #numpy #machine-learning #oversampling

Вопрос:

Наличие следующих данных и целей:

ID характеристика_1 feature_N
1 0.3 0.62
1 0.4 0.22
1 0.3 0.62
1 0.4 0.22
2 0.3 0.62
2 0.4 0.22
ID цель
1 1
2 0

Где каждая группа (группировка по идентификатору) имеет одну цель.Обратите внимание, что данные неровные, что означает, что каждая группа образцов может иметь разную длину последовательности. Мои данные сильно несбалансированы, и я хочу провести избыточную выборку целевого показателя меньшинства, чтобы данные были сбалансированы на 50% на 50%.

Я поискал в Интернете, но нашел только метод передискретизации, который обрабатывает аккуратные наборы данных, в которых у каждого образца есть цель, как показано ниже:

 ids = np.arange(len(pos_features))
choices = np.random.choice(ids, len(neg_features))

res_pos_features = pos_features[choices]
res_pos_labels = pos_labels[choices]

resampled_features = np.concatenate([res_pos_features, neg_features], axis=0)
resampled_labels = np.concatenate([res_pos_labels, neg_labels], axis=0)

order = np.arange(len(resampled_labels))
np.random.shuffle(order)
resampled_features = resampled_features[order]
resampled_labels = resampled_labels[order]

resampled_features.shape
 

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

Как я могу провести чрезмерную выборку групп меньшинств, чтобы их цели были сбалансированы?

Я попробовал следующий код:

 import pandas as pd

# generating data
data = pd.DataFrame({'id':[1,1,1,2,2,3,3,3,3,4,5,5,5],'f1':[1,2,3,4,5,6,7,8,9,10,11,12,13],'f2':[11,22,33,44,55,66,77,88,99,1010,1111,1212,1313]})
targets = pd.DataFrame({'id':[1,2,3,4,5],'target':[0,0,0,1,1]})

# creating an ndarray from the groups
import numpy as np

g = data.groupby('id').cumcount()
mux = pd.MultiIndex.from_product([data['id'].unique(), g.unique()])
L = (data.set_index(['id',g])
       .reindex(mux, fill_value=0)
       .groupby(level=0)['f1','f2']
       .apply(lambda x: x.values.tolist())
       .tolist()
)
x = np.array(L)

# Oversampling usinng imblearn
from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(x, targets.target.values)
from collections import Counter
print(sorted(Counter(y_resampled).items()))
 

Unfortunately I get the following error:

 ValueError: Found array with dim 3. Estimator expected <= 2.
 

What am I missing?