我观察到,使用Python(或其他语言)时,静态主义者和机器学习科学家通常不遵循ML /数据科学项目的OOPS。

通常,这应归因于在开发用于生产的ML代码时缺乏对最佳软件工程实践的了解。因为它们主要来自数学和统计学教育背景,而不是计算机科学。

ML科学家开发临时原型(prototype)代码并由另一个软件团队将其投入生产的日子已经过去了。

python - 如何使用Python中的面向对象编程来构造机器学习项目?-LMLPHP

问题

  • 我们如何使用面向O的ML项目来构造代码?
  • 是否每个主要任务(如上图)(例如,数据清理,特征转换,网格搜索,模型验证等)都是一个单独的类?推荐的ML代码设计实践是什么?
  • 任何良好的github链接,以及结构良好的代码以供引用(可能是写得很好的kaggle解决方案)
  • 是否每个类(如数据清洗)都为fit()transform()等每个进程都提供fit_transform()remove_missing()outlier_removal()函数?完成此操作后,为什么通常会继承scikit-learn BaseEstimator
  • 生产中的ML项目的典型配置文件的结构应该是什么?
  • 最佳答案

    您对ML的一件事是正确的:数据科学家通常是聪明的人,因此他们在用代码表达想法时没有问题。问题在于他们倾向于创建即发即忘的代码,因为他们缺乏软件开发技巧-,但理想情况下并非如此。

    编写代码时,代码的用途不应该有任何区别。 ML与其他任何事物一样,只是另一个 Realm ,应遵循简洁的代码原则。

    最重要的方面始终应该是SOLID 。许多重要方面直接遵循:可维护性,可读性,灵活性,可测试性,可靠性等。可以添加到这些功能组合中的是变更风险。一段代码是纯ML还是银行业务逻辑或助听器的听力学算法都没有关系。都一样-实现将被其他开发人员读取,将包含要修复的错误,将被测试(希望),并且可能进行重构和扩展。

    在解决您的一些问题时,让我尝试更详细地解释这一点:

    1,2)您不应认为OOP本身就是目标。如果有一个可以建模为类的概念,这会使其他开发人员更容易使用它,则可读易于扩展易于测试易于避免当然-上一个类。但是除非需要,否则不要遵循BDUF反模式。从免费功能开始,并在需要时演变为更好的界面。

    4)通常创建此类复杂的继承层次结构,以使实现可扩展(请参阅SOLID中的“O”)。在这种情况下,库用户可以继承BaseEstimator,很容易看出他们可以重写哪些方法以及该方法如何适合scikit的现有结构。

    5)与代码几乎相同的原理,但要牢记创建/编辑这些配置文件的人员。对他们来说最简单的格式是什么?如何选择参数名称,这样即使对于刚开始使用您的产品的初学者来说,它们的含义也很明显?

    所有这些事情都应该与猜测结合在一起,以猜测将来这段代码将被更改/扩展的可能性有多大?如果您确定应该一成不变地写一些东西,请不要过多地担心所有方面(例如仅关注可读性),并将精力放在实现的更关键部分。

    总结一下:考虑一下将来会与您创建进行交互的人员。如果是产品/配置文件/用户界面,则应始终“用户至上”。如果是代码,请尝试让 future 的开发人员步履蹒跚,他们将希望修复/扩展/理解您的代码。

    1当然,有些特殊情况,例如由于正式法规而需要正式证明正确或广泛记录的代码,并且此主要目标强加了一些特殊的构造/实践。

    关于python - 如何使用Python中的面向对象编程来构造机器学习项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46990511/

    10-12 18:02