如何在使用 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