1

我一直在研究 Google Dataprep 作为 ETL 解决方案,在将其提供给机器学习平台之前执行一些基本的数据转换。我想知道是否可以使用 Dataprep/Dataflow 工具将数据集拆分为训练、测试和验证集。理想情况下,我希望对目标列进行分层拆分,但对于初学者,我会选择按整体百分比进行简单的均匀随机拆分(例如 50% 训练、30% 验证、20% 测试)。

到目前为止,我还没有找到任何关于 Dataprep 是否可以实现的信息,所以我想知道是否有人明确知道这是否可行,如果可以,如何实现。

编辑 1

感谢@jakub-janoštík 让我朝着正确的方向前进!我稍微修改了您的答案,并提出了以下内容(以争吵的形式):

case condition: customConditions cases: [false,0] default: rand() as: 'split_condition'
case condition: customConditions cases: [split_condition < 0.6,'train'],[split_condition >= 0.8,'test'] default: 'validation' as: 'dataset_type'
drop col: split_condition action: Drop

通过在单独的步骤中分配随机值,我得到了我正在寻找的保证百分比分割。流程最终看起来像这样:

图片:带有数据集拆分的最终流程图

编辑 2

我刚刚也想出了如何进行分层拆分,所以我想我会添加它以防其他人尝试这样做。这是粗略的步骤:

  1. 根据您所针对的任何子群体(例如 target0、target1)拆分您的数据集
  2. 对于每个子群体,进行上述的统一随机分割(例如,现在你有 target0-train、target0-test、target0-validation、target1-train 等)
  3. 对于每个集合类型(即训练、测试、验证):
    • 从其中一组创建新配方
    • 编辑配方,并使用联合变换将其与相同类型的其他数据集合并(例如 target0-train 与 target1-train 的联合)。联合按钮位于编辑配方页面工具栏的中间。

我希望这对某人有帮助!

4

1 回答 1

4

我正在研究同样的问题,我能够使用“自定义条件下的案例”和“随机”函数部分解决这个问题。我所做的是创建名为 target 的新列并应用以下逻辑:

在此处输入图像描述

应用此功能后,您将拥有带有这 3 个新标签的新列,并且您可以通过基于这些值应用行过滤规则来生成 3 个新数据集。要记住的是,每次运行作业时,您都会得到不同的验证集。因此,如果你想保持它固定,你需要使用在第一次运行中创建的数据集作为未来运行的输入(并且只随机化训练和测试集)。

如果您需要对数据集中标签的分布进行更多控制,可以使用 ROWNUMBER 窗口函数。但我还不能让它工作。

于 2018-09-21T08:56:01.210 回答