Kedro 数据建模

Kedro Data Modelling

我们正在努力为我们的数据正确建模以便在 Kedro 中使用 - 我们正在使用推荐的 Raw\Int\Prm\Ft\Mst 模型,但正在努力解决一些概念......例如

我很欣赏数据建模没有硬性规定,但这些都是重大的建模决策,关于 Kedro 建模的任何指导或最佳实践都会非常有帮助,我可以找到一个 table 定义层在 Kedro docs

如果有人可以提供任何进一步的建议或blogs\docs谈论 Kedro 数据建模,那就太棒了!

好问题。正如您所说,这里没有硬性规定,观点也各不相同,但让我分享我作为 QB 数据科学家和 kedro 维护者的观点,他曾多次使用您提到的分层约定。

首先,让我强调一下,如果 kedro 推荐的数据工程惯例不适合您的需求,那么绝对没有理由坚持它。 99% 的用户不会更改 data 中的文件夹结构。这不是因为 kedro 默认结构对他们来说是正确的,而是因为他们只是不想改变它。您绝对应该 add/remove/rename 层以适合自己。最重要的是选择一组适用于您的项目的层(甚至非分层结构),而不是试图硬塞数据集以适应 kedro 默认建议。

现在,假设您遵循 kedro 建议的结构 - 回答您的问题:

When is a dataset a feature rather than a primary dataset? The distinction seems vague...

在简单特征的情况下,特征数据集可能与主要数据集非常相似。如果您考虑更复杂的功能,例如,区别可能是最明显的。通过随时间聚合形成 windows。主数据集会有一个列,提供原始数据的清理版本,但不对其进行任何复杂的计算,只是简单的转换。假设原始数据是一周内经过你家的所有汽车的颜色。当数据处于主要状态时,它将是干净的(例如,将“rde”更正为“red”,可能将“crimson”和“red”映射到相同的颜色)。在主要层和特征层之间,我们将对其进行一些不那么琐碎的计算,例如每天找到一个热编码的最常见的汽车颜色。

Is it OK for a primary dataset to consume data from another primary dataset?

在我看来,是的。如果您想将多个主表连接在一起,这可能是必要的。一般来说,如果您正在构建复杂的管道,如果您不允许这样做,它将变得非常困难。例如在要素层中,我可能想从两个输入 feature_1feature_2 形成一个包含 composite_feature = feature_1 * feature_2 的数据集。如果要素图层中没有多个子图层,则无法执行此操作。

但是,通常值得避免的是使用来自许多不同层的数据的节点。例如一个节点,它从要素层接收一个数据集,从中间层接收一个数据集。这似乎有点奇怪(为什么后一个数据集没有通过特征层?)。

Is it good practice to build a feature dataset from the INT layer? or should it always pass through Primary?

从中间层构建特征并非闻所未闻,但似乎有点奇怪。主要层通常是一个重要的层,它构成了所有特征工程的基础。如果您的数据处于可以构建特征的形状,那么这意味着它可能已经是主要层了。在这种情况下,也许你不需要中间层。

以上几点可以总结为以下规则(毫无疑问,在需要时应该打破):

  1. L中节点的输入数据集应该都在同一层中,可以是LL-1
  2. L 中节点的输出数据集应该都在同一层 L 中,可以是 LL+1

If anyone can offer any further advice or blogs\docs talking about Kedro Data Modelling that would be awesome!

我也很想看看其他人对这里的看法!需要注意的一件可能有用的事情是,kedro 的灵感来自 cookiecutter 数据科学,kedro 层结构是 what's suggested there 的扩展版本。也许其他项目采用了这个目录结构并以不同的方式对其进行了调整。

您的问题促使我们写了一篇 Medium 文章来更好地解释这些概念,刚刚 published on Toward Data Science