【问题标题】:Agile: User Stories for Machine Learning Project? [closed]敏捷:机器学习项目的用户故事? [关闭]
【发布时间】:2011-06-07 11:21:58
【问题描述】:

我刚刚完成了监督学习算法的原型实现,自动为我们公司数据库中的所有项目(大约 500 万个项目)分配分类标签。

结果看起来不错,我已获准计划生产实施项目。

我以前做过这种工作,所以我知道软件的功能组件如何。我需要一组网络爬虫来获取数据。我需要从抓取的文档中提取特征。这些文档需要被分成“训练集”和“分类集”,并且需要从每个文档中提取特征向量。这些特征向量自组织成簇,簇通过一系列的再平衡操作。等等等等等等等等。

所以我制定了一个计划,其中包含大约 30 个独特的开发/部署任务,每个任务都有时间估算。开发的第一阶段——忽略一些我们希望长期拥有的高级功能,但还没有足够高的优先级将其纳入开发计划——预计需要大约两个月的工作时间. (请记住,我已经有了一个工作原型,因此最终实现比从头开始项目要简单得多。)

我的经理说这个计划对他来说很好,但他问我是否可以将任务重新组织成用户故事,原因如下:(1)我们的项目管理软件完全围绕用户故事进行组织; (2) 我们所有的调度都是基于将整个用户故事融入到 sprint 中,而不是单独调度任务; (3) 其他团队(例如 Web 开发人员)充分利用了敏捷方法,并从将所有软件功能建模为用户故事中受益。

所以我在项目的顶层创建了一个用户故事:

作为系统的用户,我想按类别搜索项目,以便在庞大而复杂的数据库中轻松找到最相关的项目。

或者,这个功能的更好的顶级故事可能是:

作为内容编辑器,我想为我们数据库中的项目自动创建分类名称,以便客户可以在我们庞大而复杂的数据库中轻松找到高价值数据。

但这不是真正的问题。

对我来说,棘手的部分是弄清楚如何为机器学习架构的其余部分创建从属用户故事。

举个例子……我知道该算法需要两个主要的架构细分:(A) 训练和 (B) 分类。而且我知道架构的训练部分需要构建一个集群空间。

我读过的所有敏捷开发文献似乎都表明,用户故事应该是“提供任何业务价值的最小可能实现”。在设计一款最终用户软件时,这很有意义。从小处着手,然后在用户需要额外功能时逐步增加价值。

但集群空间本身提供的业务价值为零。爬虫或特征提取器也没有。在部分系统中没有商业价值(对于最终用户或公司内部的任何角色都没有)。训练有素的集群空间只有使用爬虫和特征提取器才有可能,并且只有在我们还开发了一个随附的分类器时才相关。

我想可以创建用户故事,其中系统的从属组件充当故事中的用户:

作为一个监督学习的集群空间构建例程,我想使用来自特征提取器的数据,这样我就可以存在了。

但这看起来真的很奇怪。作为开发人员(或我们的用户,或任何其他利益相关者),像这样为我的用户故事建模有什么好处?

虽然主要故事可以很容易地按照架构组件边界(爬虫、训练器、分类器等)进行划分,但我想不出从用户的角度来看有什么有用的分解。

你们怎么看?您如何为复杂、不可分割、非面向用户的组件规划敏捷用户故事?

【问题讨论】:

    标签: agile machine-learning scrum task user-stories


    【解决方案1】:

    任何故事都有一个角色、一个动作和一个目标。所以,考虑写一个故事,命名一个角色(a/k/a Actor)为实现目标而做某事。

    你写下的东西应该有一个明显的测试,即定义成功和失败的有效决策程序。

    我认为,您在这里遇到的麻烦在于“商业价值”。首先从总体上定义您将如何知道您何时成功完成任务。然后,“实现商业价值”正在朝着目标迈进。

    您必须对敏捷中的某些事情有点创意,因为它们经常以业务流程为导向。

    更新:

    这里有几点。

    1. 这是一个定理,如果您无法从系统外部观察到某个组件的任何影响,那么在观察等效的意义上,该组件可以在没有影响的情况下移除。

    2. 定义了一个东西,通常称为任务,它是比用户故事更小的程序员任务。如果您有一些看起来像故事一样大的东西,请将其分解为一项任务。但是,请以具有明确定义的外部行为的方式执行此操作,或者在您可以观察其行为的上下文中构建它。

    所以有几种可能的方法可以推荐给我:

    1. 设置大故事并将其分解为数量异常多的子步骤

    2. 分解故事,也许通过对数据集进行分区。因此,例如要分解“用户请求标签已更新”,请分解您的测试数据,以便您只有将接收标签 α 的数据并制作一个故事“用户请求标签更新为 α”。因为你知道一切都会是 α,所以你构建了总是分配 alpha 的最简单的代码,并担心选择的代码。

    【讨论】:

    • 关于“明显测试”,在分类器的顶层,肯定有一些明显的测试,我已经可以测量各种不同类型的聚合准确度。但是一旦我将设计分解为组件,测试就变得不那么明显了。将“特征提取”与“分类”隔离开来测试是非常困难的,因为分类器的结果定义了提取特征的成功标准。在将这些组件组装成一个完整的系统之前,系统的任何部分都不会产生可衡量的正确或错误结果!
    【解决方案2】:

    利用“垂直切片”概念可能会有所帮助。想象一个简单的 3 层应用程序(例如 UI/Logic/DB)。您无需构建一层,然后再构建另一层,而是垂直“切片”所有三层。最初的故事可能是“作为用户,我希望能够登录系统,以便可以访问它”。完成后,这个故事可能是可交付的,因为它提供了完整的功能,但极不可能为客户提供足够的价值以使其值得实际交付。垂直切片的一个好处是您已经了解了所有层的知识,这些知识可以在未来的迭代中使用。

    如果您不熟悉,INVEST 模型对于用户故事非常有用:

    我 - 独立

    N - 可协商

    V - 有价值

    E - 可估计

    S - 大小合适

    T - 可测试

    【讨论】:

    • 感谢您的回答!我对垂直切片很熟悉,并且我绝对同意它们为在以 GUI 为中心的应用程序中设计和实现隔离功能提供了一个非常好的模型。但这种模型不适用于设计复杂的算法数据导向系统。我当然可以沿着组件边界划分项目(有爬虫、特征提取器、集群创建器、分类器等),在不同组件之间创建清晰的 API 边界。但这不是一个分层的应用程序。甚至没有用户界面。
    • 团队在这方面的工作有多大?您对旅程的“顺利”有多大把握?除了制作项目 mgrs 和 mgmt 之外,将其放入“真实”用户故事中是否有价值。快乐的?您的 Sprint 持续多长时间?
    【解决方案3】:

    我认为您也可以测量部分系统的正确或错误结果。您需要剔除其他系统组件。这当然是可能的。此外,在我看来,系统的一部分是其他模块的参与者是有道理的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 2010-12-18
      • 2017-12-25
      • 2010-12-15
      • 1970-01-01
      相关资源
      最近更新 更多