Как сбалансировать тренировочный набор в питоне?

Я пытаюсь применить базовую модель к моему набору данных. Но набор данных несбалансирован и только 11% данных относятся к положительной категории. Я разбиваю данные без выборки, отзыв для положительных записей очень низкий. Я хочу сбалансировать данные обучения (0,5 отрицательных 0,5 положительных) без балансировки данных тестирования. Кто-нибудь знает как это сделать?

#splitting train and test data
train,test = train_test_split(coupon,test_size = 0.3,random_state = 100)

##separating dependent and independent variables
cols = [i for i in coupon.columns if i not in target_col]
train_X = train[cols]
train_Y = train[target_col]
test_X = test[cols]
test_Y = test[target_col]

#Function attributes
#dataframe     - processed dataframe
#Algorithm     - Algorithm used 
#training_x    - predictor variables dataframe(training)
#testing_x     - predictor variables dataframe(testing)
#training_y    - target variable(training)
#training_y    - target variable(testing)
#cf - ["coefficients","features"](cooefficients for logistic 
#regression,features for tree based models)

#threshold_plot - if True returns threshold plot for model
def coupon_use_prediction(algorithm,training_x,testing_x,
                         training_y,testing_y,cols,cf,threshold_plot) :

#model
algorithm.fit(training_x,training_y)
predictions   = algorithm.predict(testing_x)
probabilities = algorithm.predict_proba(testing_x)
#coeffs
if   cf == "coefficients" :
    coefficients  = pd.DataFrame(algorithm.coef_.ravel())
elif cf == "features" :
    coefficients  = pd.DataFrame(algorithm.feature_importances_)

column_df     = pd.DataFrame(cols)
coef_sumry    = (pd.merge(coefficients,column_df,left_index= True,
                          right_index= True, how = "left"))
coef_sumry.columns = ["coefficients","features"]
coef_sumry    = coef_sumry.sort_values(by = "coefficients",ascending = False)

print (algorithm)
print ("\n Classification report : \n",classification_report(testing_y,predictions))
print ("Accuracy   Score : ",accuracy_score(testing_y,predictions))

person Stella    schedule 24.12.2019    source источник
comment
Нет. Вы решаете задачу XY. У вас есть несбалансированные данные, и теперь вы пытаетесь просто сбалансировать данные на этапе обучения и сохранить их несбалансированными на этапе тестирования, пытаясь решить проблему. Не просто слепо меняйте данные, вы хотите прочитать, как правильно обрабатывать несбалансированные данные. (Некоторые из них на самом деле будут немного корректировать соотношение поезда и тестовых данных, но это не до такой степени, чтобы сделать его 50-50. И есть много других вещей, которые вы можете и должны попробовать, включая изменение ваших метрик. , добавление весов, если алгоритм это поддерживает, и так далее).   -  person Paritosh Singh    schedule 24.12.2019
comment
ссылка: Проблема XY. Ваш X: как обучить хорошую модель с несбалансированными данными. Ваш Y звучит так: как мне просто сделать данные одинаково пропорциональными времени обучения, оставив нетронутыми тестовые данные.   -  person Paritosh Singh    schedule 24.12.2019
comment
Я понимаю. Ты прав. Я хочу обрабатывать несбалансированные данные. Я буду искать больше информации об этом. Спасибо!   -  person Stella    schedule 24.12.2019


Ответы (1)


У вас должен быть способ балансировки данных: выборка вверх или выборка вниз.

Повышение выборки: дублирование недопредставленных данных. Выборка вниз: выборка чрезмерно представленных данных.

Для апсэмплинга это довольно просто. Для понижения дискретизации вы можете использовать sklearn.utils.resample и указать количество сэмплов, которые вы хотите получить.

Обратите внимание, что, как упоминал @paritosh-singh, изменение дистрибутива может быть не единственным решением. Существуют алгоритмы машинного обучения, которые могут: - поддерживать несбалансированные данные - уже иметь встроенную опцию взвешивания, учитывающую распределение данных

person MrMey    schedule 24.12.2019