#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?