哪个SKLearn接口定义了.fit,.predict等

时间:2019-06-18 13:31:50

标签: python scikit-learn

检查sklearn.base(更具体地说是let groupedProtocolFilterValues = [ ["Risk score < 4"] ]; let groupedPatientFilterValues = [ ["CARDIOLOGY B2 INTERN2 ADMIT PRIMARY TEAM", "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM"] ]; let flattenedProtocols = groupedProtocolFilterValues.reduce((res, cur) => res = res.concat(cur), []); let flattenedLocations = groupedPatientFilterValues.reduce((res, cur) => res = res.concat(cur), []); let events = [{ "_id": "5d087b842c3f77e7a0c674e5", "alert": { "title": "Risk score < 3", "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }, { "_id": "5d087b842c3f77e7a0c674e6", "alert": { "title": "Risk score < 4", "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }, { "_id": "5d087b842c3f77e7a0c674e7", "alert": { "title": "Risk score < 4", "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }, { "_id": "5d087b842c3f77e7a0c674e8", "alert": { "title": "Risk score < 4", "patientLocation": "CARDIOLOGY B1 INTERN1 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }]; const result = events.filter(x => { return (!flattenedProtocols.length || flattenedProtocols.indexOf(x.alert.title) >= 0) && (!flattenedLocations.length || flattenedLocations.some(c => x.alert.patientLocation.includes(c))); }); console.log(result);)和不同的mixins,很明显,有些mixins取决于调用BaseEstimator或{{1}的能力}。

例如,如果我们查看RegressorMixin,就会发现它依赖于.fit方法。

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

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

2 个答案:

答案 0 :(得分:3)

有几件事可以使人们更清楚地知道为什么在scikit-learn之类的程序包中按其方式进行操作:

  • 鸭子类型与继承:您会发现很长的争论,关于哪种方法更好,尽管它们都有优点和缺点,但归根结底还是取决于人们社区都习惯了。作为当今使用大量Python的人,我喜欢鸭子类型,我对此非常满意。在15年前的同一时间,我喜欢抽象类和OOP,但不喜欢什么,我也不明白为什么您会以其他方式来做事情。我要说的是,Python中的人们喜欢鸭子打字,这就是为什么您在其某些核心软件包中经常看到这种模式的部分原因。

  • 鸭子类型,贡献包和范围:有时检查输入,我们可以检查其类型,也可以通过鸭子类型来确定其功能。如果我们检查类型,则意味着对该方法的任何输入实际上都应该继承自这些类,而如果您对它们进行类型化,则它们可以简单地实现这些方法,并且很好。这很重要,因为例如,如果开发人员正在scikit-learn之外编写估算器,而他们希望与scikit-learn的某些部分兼容,则他们不必依赖scikit-learn作为依赖项(因为这样它们便可以从包中继承某个类),并只需实现这些方法即可。如果开发人员有约束条件来保持其程序包及其依赖项的轻量级,则这很重要(我们已经在scikit-learn中看到了这些确切的问题)。

  • Mixin类:Mixin类背后的思想并不是说子类应该继承它们并实现其方法。但是更多的是通过它们向现有类添加功能,而不必复制/粘贴或重新实现任何方法。例如,X-Frame-Options在对象上添加了fit_transform方法,假设它已经具有fittransform,而不必关心天气是对象是估计器还是变换器。再次,您可能会说OOP的某种设计模式在这里可能更好,但这是一个永无止境的论点,这种方法行之有效,开发人员对此很满意。

答案 1 :(得分:2)

python中常见的习惯用法是“鸭子类型化”-如果它的行为像鸭子,那就是鸭子,如果它实现fit或任何其他相关功能,那么它就是sklearn的模型

还有抽象基类的概念,但是用法很少见

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