Данные -
Данные по обучению и тестированию, которые у меня есть, очень велики по размеру ~ 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
Любые предложения будутоценили!спасибо