哪个SKLearn接口定义了.fit、.predi

2024-10-03 17:23:01 发布

您现在位置:Python中文网/ 问答频道 /正文

研究^{},更具体地说是{},以及不同的mixin,很明显,有些mixin依赖于调用.fit或{}的能力。在

例如,如果我们看一下^{},我们会发现它依赖于.predict方法。在

我的问题是为什么没有接口/抽象类的实现来实现这些方法?在

我希望有类似BaseRegressor的抽象方法,.predict()作为抽象方法,BaseClassifier有{}和{}-或者类似的东西


Tags: 方法抽象类能力mixinpredictfitbaseclassifierbaseregressor
2条回答

python中常见的习惯用法是“duck typing”——如果它的行为类似于duck,那么它就是一个duck,如果它实现了fit或任何其他相关函数,那么它就是sklearn的模型

还有抽象基类的概念,但它的用法并不常见

查看更多信息:https://en.wikipedia.org/wiki/Duck_typing

有几件事加在一起可能更清楚为什么事情是在scikit-learn这样的包中完成的,它们是这样的:

  • duck类型与继承:对于哪一种方法更好,您可以找到很长的争论,尽管它们都有各自的优缺点,但归根结底,归根结底还是取决于社区中的人们习惯了什么。作为一个现在做很多Python的人,我喜欢duck类型,而且我对它非常满意。同时,15年前,我喜欢抽象类和面向对象编程(OOP)之类的东西,我不明白为什么你会用其他方式做事。我想说的是,Python中的人喜欢duck类型,这也是为什么在它的一些核心包中经常看到这种模式的部分原因。

  • duck类型、contrib包和扩展:有时检查一个输入,我们可以检查它的类型,或者duck类型它的特定功能。如果我们检查类型,这意味着该方法的任何输入实际上都应该从这些类继承,而如果你不输入它们,它们可以简单地实现这些方法,而且它们很好。这一点很重要,因为如果开发人员在scikit-learn之外编写一个估计器,例如,他们希望与scikit-learn的某些部分兼容,那么他们不必依赖{}作为依赖项(因为这样他们就可以从包中继承某个类),而只需实现这些方法。如果开发人员有保持包及其依赖项轻量级的约束条件,这就变得有意义了(我们在scikit-learn中看到了这些确切的问题)。

  • Mixin类:Mixin类背后的想法并不是子类应该继承它们并实现它们的方法;而是更多的是通过它们向现有类添加功能,而不必复制/粘贴或重新实现任何方法。假设一个不关心cd11}的对象,{10}已经有了一个关于cd11}的对象。同样,你可以说,OOP的某个设计模式在这里可能更好,但这是一个永无止境的论点,而且这种方法行之有效,开发人员对此也很满意。

相关问题 更多 >