Как выполнить k-кратную перекрестную проверку с тензорным потоком?

Я следую примеру тензорного потока в IRIS.

В моем случае все данные находятся в одном CSV-файле, а не разделены, и я хочу применить k-кратную перекрестную проверку этих данных.

у меня есть

data_set = tf.contrib.learn.datasets.base.load_csv(filename="mydata.csv",
                                                   target_dtype=np.int)

Как я могу выполнить k-кратную перекрестную проверку этого набора данных с помощью многоуровневой нейронной сети, как в примере IRIS?


person mommomonthewind    schedule 28.09.2016    source источник


Ответы (2)


Я знаю, что это старый вопрос, но на случай, если кто-то хочет сделать что-то подобное, расширьте ответ ahmedhosny:

Новый API наборов данных tensorflow имеет возможность создавать объекты наборов данных с помощью генераторов Python, поэтому наряду с KFold в scikit-learn одним из вариантов может быть создание набора данных из генератора KFold.split ():

import numpy as np

from sklearn.model_selection import LeaveOneOut,KFold

import tensorflow as tf
import tensorflow.contrib.eager as tfe
tf.enable_eager_execution()

from sklearn.datasets import load_iris
data = load_iris()
X=data['data']
y=data['target']

def make_dataset(X_data,y_data,n_splits):

    def gen():
        for train_index, test_index in KFold(n_splits).split(X_data):
            X_train, X_test = X_data[train_index], X_data[test_index]
            y_train, y_test = y_data[train_index], y_data[test_index]
            yield X_train,y_train,X_test,y_test

    return tf.data.Dataset.from_generator(gen, (tf.float64,tf.float64,tf.float64,tf.float64))

dataset=make_dataset(X,y,10)

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

for X_train,y_train,X_test,y_test in tfe.Iterator(dataset):
    ....
person Dan Reia    schedule 10.05.2018
comment
Что, если X и y не могут храниться в памяти, как предполагает этот фрагмент? Я думал, что весь смысл использования генератора состоит в том, чтобы загружать образцы по запросу, а не загружать весь набор данных в память. - person fabiomaia; 29.12.2018
comment
@fabiomaia Тот же метод можно использовать для их загрузки по запросу. Например, X может представлять список имен файлов, а в цикле for вы загружаете содержимое файлов по запросу. - person gw0; 31.01.2020

NN обычно используются с большими наборами данных, где CV не используется - и это очень дорого. В случае IRIS (50 образцов для каждого вида) он вам, вероятно, понадобится .. Почему бы не использовать scikit-learn с разными случайными начальными числами, чтобы разделить обучение и тестирование?

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

для k в kfold:

  1. разделять данные по-разному, передавая другое значение "random_state"
  2. изучить сеть с помощью _train
  3. тест с использованием _test

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

from sklearn.model_selection import KFold, cross_val_score
X = ["a", "a", "b", "c", "c", "c"]
k_fold = KFold(n_splits=3)
for train_indices, test_indices in k_fold.split(X):
    print('Train: %s | test: %s' % (train_indices, test_indices))
Train: [2 3 4 5] | test: [0 1]
Train: [0 1 4 5] | test: [2 3]
Train: [0 1 2 3] | test: [4 5]
person ahmedhosny    schedule 20.11.2016
comment
Ответ не связан с вопросом !!! Должен дать ответ с помощью решения Tensorflow - person AGP; 19.08.2018
comment
Поскольку ответ предлагает решение, которое можно использовать с Tensorflow, я не вижу проблемы. - person mrk; 20.12.2018
comment
как мы можем сделать это еще более рандомизированным? - person Mona Jalal; 30.03.2019