Разделить тензор на обучающие и тестовые наборы

предположим, я прочитал в текстовом файле, используя TextLineReader. Есть ли способ разделить это на поезд и тестовые наборы в Tensorflow? Что-то вроде:

def read_my_file_format(filename_queue):
  reader = tf.TextLineReader()
  key, record_string = reader.read(filename_queue)
  raw_features, label = tf.decode_csv(record_string)
  features = some_processing(raw_features)
  features_train, labels_train, features_test, labels_test = tf.train_split(features,
                                                                            labels,
                                                                            frac=.1)
  return features_train, labels_train, features_test, labels_test

4 ответов


что-то вроде следующего должно работать: tf.split_v(tf.random_shuffle(...


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

на model_selection.train_test_split() метод специально разработан, чтобы разбивать на поезд и тесты случайно и процент.

X_train, X_test, y_train, y_test = train_test_split(features,
                                                    labels,
                                                    test_size=0.33,
                                                    random_state=42)

test_size это процент резервирования для тестирования и random_state является для семян случайной выборки.

обычно я использую это для предоставления наборов данных поезда и проверки и отдельно сохраняю истинные тестовые данные. Вы могли бы просто запустить train_test_split дважды, чтобы сделать это хорошо. Т. е. разделите данные на (поезд + проверка) и тест, затем разделите поезд + проверка на два отдельных тензора.


import sklearn.model_selection as sk

X_train, X_test, y_train, y_test = 
sk.train_test_split(features,labels,test_size=0.33, random_state = 42)

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

def split_train_test(parsed_features, train_rate):
    parsed_features['is_train'] = tf.gather(tf.random_uniform([1], maxval=100, dtype=tf.int32) < tf.cast(train_rate * 100, tf.int32), 0)
    return parsed_features

def grab_train_examples(parsed_features):
    return parsed_features['is_train']

def grab_test_examples(parsed_features):
    return ~parsed_features['is_train']