我一直在研究Google Dataprep作为ETL解决方案,用于在将数据输入到机器学习平台之前进行一些基本的数据转换。我想知道是否可以使用Dataprep/Dataflow工具将数据集拆分为训练集、测试集和验证集。理想情况下,我希望在目标列上进行分层拆分,但作为起步,我可以接受按整体百分比进行的简单均匀随机拆分(例如,50%训练集,30%验证集,20%测试集)。
到目前为止,我还没有找到任何关于这是否在Dataprep中可行的信息,所以我想知道是否有人能确定这是否可行,如果可以,如何实现。
编辑1
感谢@***让我朝正确的方向前进!我稍微修改了你的答案,并想出了以下(以wrangle形式):
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
我刚刚想出了如何进行分层拆分,所以我想我应该补充说明,以防其他人也在尝试这样做。这里是大致步骤:
- 根据你所针对的任何子群体拆分你的数据集(例如,target0, target1)
- 对于每个子群体,执行上述描述的均匀随机拆分(例如,现在你有target0-train, target0-test, target0-validation, target1-train等)
- 对于每种类型的数据集(即训练集、测试集、验证集):
- 从其中一个数据集创建一个新配方
- 编辑配方,并使用联合变换将其与其他同类型的数据库合并(例如,target0-train与target1-train联合)。联合按钮位于“编辑配方”页面工具栏的中间位置。
希望这对某人有帮助!
回答:
我在研究相同的问题,我通过使用“基于自定义条件的case”和“随机”函数部分解决了这个问题。我所做的是创建一个名为target的新列并应用以下逻辑:
应用此逻辑后,你将拥有一个带有这三个新标签的新列,你可以通过基于这些值应用行过滤规则来生成三个新数据集。需要记住的是,每次运行作业时,你都会得到不同的验证集。因此,如果你想保持验证集固定,你需要使用第一次运行时创建的数据集作为未来运行的输入(并只随机化训练集和测试集)。
如果你需要更多地控制数据集中的标签分布,可以使用ROWNUMBER窗口函数,这可能会有帮助。但我还没有成功实现它。