[英]Which SKLearn interface defines .fit, .predict etc
检查sklearn.base
,更具体BaseEstimator
,和不同的混入,很明显,一些混入的依赖于呼叫的能力.fit
或.predict
。
举例来说,如果我们想看看RegressorMixin
我们会看到它依赖于.predict
方法。
我的问题是为什么没有实现接口/抽象类来强制执行这些方法?
我希望像BaseRegressor
这样的东西有BaseRegressor
.predict()
作为抽象方法, BaseClassifier
有.predict_proba()
和.predict()
- 或类似的东西
有一些东西可以让人们更清楚为什么在像scikit-learn
这样的软件包中完成这些工作,它们的方式如下:
duck typing vs inheritance:你可以找到关于哪一个是更好的方法的很长时间的争论,虽然它们都有它们的优点和缺点,但最终归结为社区中的人习惯。 作为现在做很多Python的人,我喜欢鸭子打字,我对它很满意。 与此同时,15年前,我喜欢抽象课程和OOP而不喜欢,我不明白为什么你会以任何其他方式做事。 我想说的是,Python中的人喜欢鸭子打字,这也是你在某些核心软件包中经常看到这种模式的部分原因。
duck typing,contrib package和extentions:有时检查输入,我们可以检查它的类型,或者为某个功能选择它。 如果我们检查类型,那意味着该方法的任何输入实际上应该从这些类继承,而如果你躲避它们,他们可以简单地实现这些方法,并且它们没问题。 这很重要,因为如果开发人员在scikit-learn
之外编写估算器,他们希望与scikit-learn
某些部分兼容,那么他们就不必依赖scikit-learn
作为依赖(因为那是然后他们如何从包中继承某个类,并简单地实现这些方法。 如果开发人员有限制来保持他们的包及其依赖项的轻量级,那么这就变得相关了(我们已经在scikit-learn
看到了这些确切的问题)。
Mixin
类:在背后的想法Mixin
类是不是真的那么子类应该继承他们和实施他们的方法; 但它更多的是通过它们向现有类添加功能,而无需复制/粘贴或重新实现任何方法。 例如, TransformerMixin
将fit_transform
方法添加到一个对象,假设它已经fit
和transform
,而不关心天气,该对象是估计器或变换器。 同样,你可以说OOP的某种设计模式在这里可能会更好 ,但这是一个永无止境的论点,这种方法有效,开发人员也很满意。
python中常见的习语是“鸭子打字” - 如果它表现得像鸭子那么它是鸭子,如果它实现fit
或任何其他相关功能它是sklearn的模型
还有抽象基类的概念,但它的用法不太常见
在这里查看更多: https : //en.wikipedia.org/wiki/Duck_typing
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.