wake-up-neo.com

Wie führe ich eine k-fache Kreuzvalidierung mit Tensorflow durch?

Ich verfolge das IRIS-Beispiel für Tensorflow .

Mein Fall ist jetzt, dass ich alle Daten in einer einzigen CSV-Datei habe, nicht getrennt, und ich möchte eine k-fache Kreuzvalidierung für diese Daten anwenden.

Ich habe

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

Wie kann ich eine k-fache Kreuzvalidierung für diesen Datensatz mit einem mehrschichtigen neuronalen Netzwerk wie im Beispiel von IRIS durchführen?

18
mommomonthewind

Ich weiß, dass diese Frage alt ist, aber für den Fall, dass jemand etwas Ähnliches tun möchte, erweitern ahmedhosny's Antwort:

Die neue Tensorflow-Datasets-API bietet die Möglichkeit, Dataset-Objekte mithilfe von python generators) zu erstellen. Zusammen mit KFold von scikit-learn besteht daher die Möglichkeit, ein Dataset mithilfe des KFold.split () -Generators zu erstellen:

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)

Dann kann man den Datensatz entweder im graphbasierten Tensorflow oder mit eifriger Ausführung durchlaufen. Mit eifriger Ausführung:

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

NNs werden normalerweise bei großen Datensätzen verwendet, bei denen CV nicht verwendet wird - und sind sehr teuer. Im Falle von IRIS (50 Proben für jede Art) benötigen Sie es wahrscheinlich. Warum nicht mit verschiedenen zufälligen Samen scikit-lernen verwenden, um Ihr Training und Ihre Tests aufzuteilen?

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

für k in kfold:

  1. daten unterschiedlich teilen und einen anderen Wert an "random_state" übergeben
  2. lerne das Netz mit _train
  3. test mit _test

Wenn Ihnen der Zufallsstartwert nicht gefällt und Sie eine strukturiertere k-fach Aufteilung wünschen, können Sie dies aus hier verwenden.

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