【发布时间】:2020-10-25 20:38:47
【问题描述】:
我在 sklearn 中使用 StackingClassifier,我希望组件模型成为自定义分类器。为了做到这一点,我想用一些虚拟代码对其进行测试,其中自定义分类器与现有模型(在本例中为 KNN)完全相同。但是,这会引发错误,我不确定我是否理解原因,并寻求帮助。这可能是相当明显的事情(我是尝试编写自定义分类器和使用 ClassiferMixIn 的新手),但我似乎无法弄清楚我缺少什么:
代码——没有我的自定义类的基线示例(有效):
from sklearn.ensemble import StackingClassifier
from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True, as_frame=True)
model = StackingClassifier(estimators=[
('tree', Pipeline([('tree', DecisionTreeClassifier(random_state=42))])),
('knn', Pipeline([('knn', KNeighborsClassifier())])),
])
model.fit(X, y)
代码——我的自定义类(不起作用):
class MyOwnClassifier(ClassifierMixin):
def __init__(self,classifier):
self.classifier = classifier
def fit(self, X, y):
self.classifier.fit(X,y)
return self
def predict(self, X):
return self.classifier.predict(X)
def predict_proba(self, X):
return self.classifier.predict_proba(X)
model = StackingClassifier(estimators=[
('tree', Pipeline([('tree', DecisionTreeClassifier(random_state=42))])),
('knn', Pipeline([('knn', MyOwnClassifier(KNeighborsClassifier()))])),
])
model.fit(X, y)
返回错误
AttributeError: 'MyOwnClassifier' object has no attribute 'classes_'
真正让我感到困惑的是,在this 的回答中,身份转换可以用作管道的一部分,我无法想象该对象也有“classes_”。
【问题讨论】:
-
在没有客户分类器
clf的情况下取消代码中的工作分类器之一,例如knn。打印出适合后分配的clf.classes_。现在在您的自定义分类器中添加属性self.classes_ = ...。或者你可能需要继承一个可以做到这一点的类。
标签: python oop machine-learning scikit-learn ensemble-learning