很好的问题。正如你所说,这里没有硬性规定,意见也各不相同,但让我分享一下我作为 QB 数据科学家和 kedro 维护者的观点,他曾多次使用过你提到的分层约定。
首先,让我强调一下,如果 kedro 建议的数据工程约定不适合您的需求,那么绝对没有理由坚持它。 99% 的用户不会更改data 中的文件夹结构。这不是因为 kedro 默认结构对他们来说是正确的结构,而是因为他们只是不想改变它。您绝对应该添加/删除/重命名图层以适合自己。最重要的是选择适合您项目的一组层(甚至是非分层结构),而不是试图硬塞您的数据集以适应 kedro 默认建议。
现在,假设您遵循 kedro 的建议结构 - 回答您的问题:
什么时候数据集是特征而不是主数据集?区别似乎很模糊......
在简单特征的情况下,特征数据集可能与主要数据集非常相似。如果您考虑更复杂的功能,例如通过聚合时间窗口形成。主数据集将有一个列提供原始数据的清理版本,但无需对其进行任何复杂的计算,只需进行简单的转换。假设原始数据是一周内经过你家的所有汽车的颜色。当数据处于主要状态时,它将是干净的(例如,将“rde”更正为“red”,可能将“crimson”和“red”映射为相同的颜色)。在主要层和特征层之间,我们将对其进行一些不那么琐碎的计算,例如每天查找一个热编码最常见的汽车颜色。
一个主数据集可以使用另一个主数据集的数据吗?
在我看来,是的。如果您想将多个主表连接在一起,这可能是必要的。一般来说,如果您正在构建复杂的管道,如果您不允许这样做,将会变得非常困难。例如在要素层中,我可能想从feature_1 和feature_2 两个输入中形成一个包含composite_feature = feature_1 * feature_2 的数据集。如果在要素层中没有多个子层,就无法做到这一点。
但是,通常值得避免的是使用来自许多不同层的数据的节点。例如一个节点,它从要素层接收一个数据集,从中间层接收一个数据集。这似乎有点奇怪(为什么后面的数据集没有通过特征层?)。
从 INT 层构建要素数据集是一种好习惯吗?还是应该始终通过 Primary?
从中间层构建功能并非闻所未闻,但似乎有点奇怪。主层通常是构成所有特征工程基础的重要层。如果您的数据处于可以构建特征的形状,那么这意味着它可能已经是主要层。在这种情况下,也许你不需要中间层。
以上几点可以总结为以下规则(在需要时无疑应该打破):
-
L 层中节点的输入数据集应该都在同一层中,可以是L 或L-1
-
L 层中节点的输出数据集应该都在同一层L,可以是L 或L+1
如果有人能提供任何关于 Kedro 数据建模的进一步建议或博客\文档,那就太棒了!
我也很想看看其他人在这里的想法!需要注意的一件可能有用的事情是 kedro 受到 cookiecutter 数据科学的启发,而 kedro 层结构是 what's suggested there 的扩展版本。也许其他项目已经采用了这种目录结构并以不同的方式对其进行了调整。