问题描述
我在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',MyOwnClassifier(KNeighborsClassifier()))])),y)
返回错误
AttributeError: 'MyOwnClassifier' object has no attribute 'classes_'
令我真正困惑的是,在this答案中,身份转换可以用作管道的一部分,而且我无法想象该对象具有' classes _ '要么。
解决方法
您的代码有3个问题:
-
StackingClassifier
期望属性classes_
在拟合的分类器上可用,错误消息中已明确指出。链接的示例中确实有,而您的示例中没有。可以检查您是否像dir(MyOwnClassifier(KNeighborsClassifier()).fit(X,y))
一样运行。 -
BaseEstimator
从类定义中丢失(您可以不使用它,但是它的存在使生活变得更轻松)
您代码中的 -
Pipelines
是无关紧要的杂物,对于调试代码并不必要使调试变得复杂。
更正了这些问题后,您便有了有效的代码:
from sklearn.ensemble import StackingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.base import ClassifierMixin,BaseEstimator
X,y = load_breast_cancer(return_X_y=True,as_frame=True)
class MyOwnClassifier(ClassifierMixin,BaseEstimator):
def __init__(self,classifier):
self.classifier = classifier
def fit(self,X,y):
self.classifier.fit(X,y)
self.classes_ = self.classifier.classes_
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',DecisionTreeClassifier(random_state=42)),('knn',MyOwnClassifier(KNeighborsClassifier()))])
model.fit(X,y)
StackingClassifier(estimators=[('tree',MyOwnClassifier(classifier=KNeighborsClassifier()))])