Как разделить сильно несбалансированные данные с помощью тензорного потока или искры? - PullRequest
0 голосов
/ 15 декабря 2018

Данные -

Данные по обучению и тестированию, которые у меня есть, очень велики по размеру ~ 150 ГБ и очень также несбалансированы 99% отрицательных меток / 1% pos меток, и я не могу уменьшить частоту, так как это очень важная информация, так что в настоящее время я использую взвешенную оценку.

Проблема -

Если мы используем искровой способ разбиения с использованием функции sample () и сохраняем его в нескольких файлах, тогда велика вероятность того, что выборки neg будут только в одном из файлов из многих (скажем, 1 из 100).), которая вызывает проблему при приеме данных, поскольку в оценщик поступают только положительные выборки, что приводит к нулевым потерям, и модель не может учиться.

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

Есть ли лучший способ убедиться при сохранении данных, используя pyspark , каждый файл, сохраненный в spark, содержит образцы из обоих классов / меток (желательно в том же соотношении, что и общее соотношение данных / отрицательных данных)?

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

с использованием следующей функции ввода в коде тензорного потока -

def csv_input_fn(files_name_pattern, mode=tf.estimator.ModeKeys.EVAL,
             skip_header_lines=0,
             num_epochs=None,
             batch_size=1000):

shuffle = True if mode == tf.estimator.ModeKeys.TRAIN else False

num_threads = multiprocessing.cpu_count() if MULTI_THREADING else 1

print("")
print("* data input_fn:")
print("================")
print("Input file(s): {}".format(files_name_pattern))
print("Batch size: {}".format(batch_size))
print("Epoch Count: {}".format(num_epochs))
print("Mode: {}".format(mode))
print("Thread Count: {}".format(num_threads))
print("Shuffle: {}".format(shuffle))
print("================")
print("")

file_names = tf.matching_files(files_name_pattern)
dataset = data.TextLineDataset(filenames=file_names)

dataset = dataset.skip(skip_header_lines)

if shuffle:
    dataset = dataset.shuffle(buffer_size=2 * batch_size + 1)

dataset = dataset.batch(batch_size)
dataset = dataset.map(lambda csv_row: parse_csv_row(csv_row),
                      num_parallel_calls=num_threads)

dataset = dataset.repeat(num_epochs)
iterator = dataset.make_one_shot_iterator()

features, target = iterator.get_next()
return features, target

Любые предложения будутоценили!спасибо

1 Ответ

0 голосов
/ 15 декабря 2018

Нашел ответ на мой собственный вопрос, так что вы можете изменить размер_буфера на количество элементов / строк в полном наборе данных, и таким образом мы сможем убедиться, что индексы, которые случайным образом назначаются с использованием случайного числа, будут одинаковыми, кактеперь перетасовка выполняется с использованием всего набора данных.

код изменен - ​​

   if shuffle:
    dataset = dataset.shuffle(buffer_size='total training instances size')
...