检查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
-或类似的东西
答案 0 :(得分:3)
有几件事可以使人们更清楚地知道为什么在scikit-learn
之类的程序包中按其方式进行操作:
鸭子类型与继承:您会发现很长的争论,关于哪种方法更好,尽管它们都有优点和缺点,但归根结底还是取决于人们社区都习惯了。作为当今使用大量Python的人,我喜欢鸭子类型,我对此非常满意。在15年前的同一时间,我喜欢抽象类和OOP,但不喜欢什么,我也不明白为什么您会以其他方式来做事情。我要说的是,Python中的人们喜欢鸭子打字,这就是为什么您在其某些核心软件包中经常看到这种模式的部分原因。
鸭子类型,贡献包和范围:有时检查输入,我们可以检查其类型,也可以通过鸭子类型来确定其功能。如果我们检查类型,则意味着对该方法的任何输入实际上都应该继承自这些类,而如果您对它们进行类型化,则它们可以简单地实现这些方法,并且很好。这很重要,因为例如,如果开发人员正在scikit-learn
之外编写估算器,而他们希望与scikit-learn
的某些部分兼容,则他们不必依赖scikit-learn
作为依赖项(因为这样它们便可以从包中继承某个类),并只需实现这些方法即可。如果开发人员有约束条件来保持其程序包及其依赖项的轻量级,则这很重要(我们已经在scikit-learn
中看到了这些确切的问题)。
Mixin
类:Mixin
类背后的思想并不是说子类应该继承它们并实现其方法。但是更多的是通过它们向现有类添加功能,而不必复制/粘贴或重新实现任何方法。例如,X-Frame-Options在对象上添加了fit_transform
方法,假设它已经具有fit
和transform
,而不必关心天气是对象是估计器还是变换器。再次,您可能会说OOP的某种设计模式在这里可能更好,但这是一个永无止境的论点,这种方法行之有效,开发人员对此很满意。
答案 1 :(得分:2)
python中常见的习惯用法是“鸭子类型化”-如果它的行为像鸭子,那就是鸭子,如果它实现fit
或任何其他相关功能,那么它就是sklearn的模型
还有抽象基类的概念,但是用法很少见