堆叠分类器:使用自定义分类器返回错误

问题描述

我在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个问题:

  1. StackingClassifier期望属性classes_在拟合的分类器上可用,错误消息中已明确指出。链接的示例中确实有,而您的示例中没有。可以检查您是否像dir(MyOwnClassifier(KNeighborsClassifier()).fit(X,y))一样运行。

  2. BaseEstimator从类定义中丢失(您可以不使用它,但是它的存在使生活变得更轻松)

  3. 您代码中的
  4. 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()))])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...