Похоже, у нас обоих были похожие проблемы. К сожалению, несбалансированное обучение - это не всегда то, что вам нужно, и scikit не предлагает нужных вам функций. Вы захотите реализовать свой собственный код.
Это то, что я придумал для своего приложения. Обратите внимание, что у меня не было много времени на его отладку, но я считаю, что он работает, исходя из проведенного мной тестирования. Надеюсь, это поможет:
def equal_sampler(classes, data, target, test_frac):
# Find the least frequent class and its fraction of the total
_, count = np.unique(target, return_counts=True)
fraction_of_total = min(count) / len(target)
# split further into train and test
train_frac = (1-test_frac)*fraction_of_total
test_frac = test_frac*fraction_of_total
# initialize index arrays and find length of train and test
train=[]
train_len = int(train_frac * data.shape[0])
test=[]
test_len = int(test_frac* data.shape[0])
# add values to train, drop them from the index and proceed to add to test
for i in classes:
indeces = list(target[target ==i].index.copy())
train_temp = np.random.choice(indeces, train_len, replace=False)
for val in train_temp:
train.append(val)
indeces.remove(val)
test_temp = np.random.choice(indeces, test_len, replace=False)
for val in test_temp:
test.append(val)
# X_train, y_train, X_test, y_test
return data.loc[train], target[train], data.loc[test], target[test]
Для ввода классы ожидают список возможных значений, данные ожидают столбцы фрейма данных, используемые для прогнозирования, цель ожидает целевой столбец.
Позаботьтесь о том, чтобы алгоритм мог быть не очень эффективным из-за тройного цикла for (list.remove занимает линейное время). Несмотря на это, это должно быть достаточно быстро.
person
Vlado
schedule
29.07.2020