如何使用tensorflow执行k-fold交叉验证?

mom*_*ind 18 python cross-validation tensorflow train-test-split

我正在关注张量流的IRIS示例.

我现在的情况是我将所有数据都放在一个CSV文件中,而不是分开,我想对该数据应用k-fold交叉验证.

我有

data_set = tf.contrib.learn.datasets.base.load_csv(filename="mydata.csv",
                                                   target_dtype=np.int)
Run Code Online (Sandbox Code Playgroud)

如何使用多层神经网络对此数据集执行k-fold交叉验证,与IRIS示例相同?

Dan*_*eia 20

我知道这个问题已经过时了,但万一有人想要做类似的事情,请扩展ahmedhosny的答案:

新的tensorflow数据集API能够使用python生成器创建数据集对象,因此除了scikit-learn的KFold,一个选项可以是从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)
Run Code Online (Sandbox Code Playgroud)

然后,可以在基于图的张量流或使用急切执行中迭代数据集.使用急切执行:

for X_train,y_train,X_test,y_test in tfe.Iterator(dataset):
    ....
Run Code Online (Sandbox Code Playgroud)

  • 如果不能如该代码段所示将“ X”和“ y”保存在内存中怎么办?我认为使用生成器的全部目的是按需加载样本,而不是将整个数据集加载到内存中。 (4认同)
  • @fabiomaia 可以使用相同的技术按需加载它们。例如,“X”可以表示文件名列表,并且在 for 循环中按需加载文件内容。 (2认同)

ahm*_*sny 10

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)
Run Code Online (Sandbox Code Playgroud)

为k in 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]
Run Code Online (Sandbox Code Playgroud)

  • 答案与问题无关!!! 应该提供Tensorflow解决方案的答案 (7认同)
  • 由于答案提供了可用于 Tensorflow 的解决方案 - 我看不到问题。 (3认同)