如何在使用 make_csv_dataset 创建的数据集上制作 train_test_split

Posted

技术标签:

【中文标题】如何在使用 make_csv_dataset 创建的数据集上制作 train_test_split【英文标题】:How to make train_test_split on a dataset created with make_csv_dataset 【发布时间】:2021-02-05 17:00:46 【问题描述】:

对于一个小数据集,我在整个数据集的数据帧上使用 scikit-learn test_train_split

from sklearn.model_selection import train_test_split

train, test = train_test_split(features_dataframe, test_size=0.2)
train, test = train_test_split(train, test_size=0.2)
train, val = train_test_split(train, test_size=0.2)

它只是在我的数据集上创建一个测试、训练、验证拆分。 现在,我想从磁盘执行数据加载,即我的 csv 文件。所以,我正在使用实验性的 tf.data 函数make_csv_dataset。我所做的是

import tensorflow as tf

defaults=[float()]*len(selected_columns)

data_set=tf.data.experimental.make_csv_dataset(
    file_pattern = "./processed/*/*/*.csv",
    column_names=all_columns,   # array with all columns labels
    select_columns=selected_columns, # array with desired column labels
    column_defaults=defaults,      # default column values
    label_name="Target",
    batch_size=10, 
    num_epochs=1,
    num_parallel_reads=20,
    shuffle_buffer_size=10000,
    ignore_errors=True)

据我猜测,我有数据集,但是当我尝试执行 scikit-learn 的train_test_split 时,它不起作用,原因很明显,data_set 尚未加载,它刚刚配置正在加载。

如何对这些数据执行训练、测试、验证拆分?

我浏览了一些指南,每个人(据我所知)都在加载训练数据:

overfit_and_underfit

custom_training_walkthrough

estimator

【问题讨论】:

但是我现在没有数据框,是数据集 this 对您有帮助吗? @TFer2 检查我的答案,看看到目前为止什么对我有用 【参考方案1】:

首先,为了更好地控制我的数据集,我使用了较低级别的类似 API,即CsvDataset。然后我手动将数据集放在两个不同的文件夹中进行测试和训练拆分,并分别加载为

import pathlib

training_csvs =  sorted(str(p) for p in pathlib.Path('./../Datasets/path-to-dataset/Train').glob("*/*.csv"))
testing_csvs =  sorted(str(p) for p in pathlib.Path('./../Datasets//path-to-dataset/Test').glob("*/*.csv"))

training_dataset=tf.data.experimental.CsvDataset(
    training_csvs,
    record_defaults=defaults, 
    compression_type=None, 
    buffer_size=None,
    header=True, 
    field_delim=',',
    use_quote_delim=True,
    na_value="",
    select_cols=selected_indices
)
print(type(training_dataset))

testing_dataset=tf.data.experimental.CsvDataset(
    testing_csvs,
    record_defaults=defaults, 
    compression_type=None, 
    buffer_size=None,
    header=True, 
    field_delim=',',
    use_quote_delim=True,
    na_value="",
    select_cols=selected_indices
)

print(training_dataset.element_spec)
print(testing_dataset.element_spec)


training_dataset= training_dataset.shuffle(50000)
validate_ds = training_dataset.batch(300).take(100)
train_ds = training_dataset.batch(300, drop_remainder=True).skip(100)

test_ds = testing_dataset.batch(300, drop_remainder=True)

现在,它可以工作了,但还有一个问题,那就是验证数据集。理想情况下,每个 epoch 的验证数据集应该是不同的,但在这种情况下,它是相同的,因此多个 epoch 的训练并不会提高性能。如果有人能帮助解决这个问题,我将不胜感激。

【讨论】:

以上是关于如何在使用 make_csv_dataset 创建的数据集上制作 train_test_split的主要内容,如果未能解决你的问题,请参考以下文章

tf.data.TextLineDataset 和 tf.data.experimental.make_csv_dataset 的区别

如何将 PrefetchDataset 转换为 TF 张量?

TensorFlow Recommenders - ValueError: Shape must be rank 2 but is rank 3

如何使用 'type' 在 mongoose 中使用嵌套模式来创建数组?

如何使用 CSS 在两个图像之间创建剪辑路径 [关闭]

如何在 Mac 上的“邮件”中创建和使用电子邮件签名?