web-dev-qa-db-fra.com

Comment effectuer une validation croisée k-fold avec tensorflow?

Je suis l'exemple IRIS de tensorflow .

Mon cas est maintenant que j'ai toutes les données dans un seul fichier CSV, non séparé, et je veux appliquer une validation croisée k-fold sur ces données.

J'ai

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

Comment puis-je effectuer une validation croisée k-fold sur cet ensemble de données avec un réseau neuronal multicouche comme dans l'exemple IRIS?

18
mommomonthewind

Je sais que cette question est ancienne mais au cas où quelqu'un chercherait à faire quelque chose de similaire, en développant ahmedhosny's réponse:

La nouvelle API des ensembles de données tensorflow a la possibilité de créer des objets d'ensemble de données à l'aide des générateurs python, donc avec l'option KFold de scikit-learn, une option peut être de créer un ensemble de données à partir du générateur 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)

Ensuite, on peut parcourir le jeu de données dans le tensorflow basé sur un graphique ou en utilisant une exécution rapide. Utilisation d'une exécution soignée:

for X_train,y_train,X_test,y_test in tfe.Iterator(dataset):
    ....
20
Dan Reia

Les NN sont généralement utilisés avec de grands ensembles de données où le CV n'est pas utilisé - et très coûteux. Dans le cas d'IRIS (50 échantillons pour chaque espèce), vous en avez probablement besoin .. pourquoi ne pas utiliser scikit-learn avec différentes graines aléatoires pour diviser votre formation et vos tests?

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

pour k dans kfold:

  1. diviser les données différemment en passant une valeur différente à "random_state"
  2. apprendre le net en utilisant _train
  3. test à l'aide de _test

Si vous n'aimez pas la graine aléatoire et que vous souhaitez une division k-fold plus structurée, vous pouvez utiliser cela à partir de ici .

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]
10
ahmedhosny