如何解决堆叠分类器:使用自定义分类器返回错误
我在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()))])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。