Как выполнить повышение с помощью функции sample () (py-spark) - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю над проблемой машинного обучения двоичной классификации и пытаюсь сбалансировать тренировочный набор, поскольку у меня есть несбалансированная переменная целевого класса. Я использую Py-Spark для построения модели.

Ниже приведен код, который работает для балансировки данных

train_initial, test = new_data.randomSplit([0.7, 0.3], seed = 2018)
train_initial.groupby('label').count().toPandas()
   label   count                                                                
0    0.0  712980
1    1.0    2926
train_new = train_initial.sampleBy('label', fractions={0: 2926./712980, 1: 1.0}).cache()

Приведенный выше код выполняет недостаточную выборку, но я думаю, что это может привести к потере информации. Однако я не уверен, как выполнить повышение частоты дискретизации. Я также попытался использовать образец функции, как показано ниже:

train_up = train_initial.sample(True, 10.0, seed = 2018)

Хотя в моем наборе данных это число увеличивается на 1, оно также увеличивает количество в 0 и дает следующий результат.

   label    count                                                               
0    0.0  7128722
1    1.0    29024

Может кто-нибудь, пожалуйста, помогите мне повысить частоту дискретизации в py-spark.

Большое спасибо заранее!

1 Ответ

0 голосов
/ 13 ноября 2018

Проблема в том, что вы передискретизируете весь фрейм данных. Вы должны отфильтровать данные из двух классов

df_class_0 = df_train[df_train['label'] == 0]
df_class_1 = df_train[df_train['label'] == 1]
df_class_1_over = df_class_1.sample(count_class_0, replace=True)
df_test_over = pd.concat([df_class_0, df_class_1_over], axis=0)

пример взят из: https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets

Обратите внимание, что есть лучший способ выполнить передискретизацию (например, SMOTE)

...