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_'
이것에 대해 정말 당황스러운 것은 이 답변에서 ID 변환이 파이프 라인의 일부로 사용될 수 있다는 것입니다. 그리고 객체에 ' class_ '도 있다고 상상할 수 없습니다 .
코드에 세 가지 문제가 있습니다.
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',
DecisionTreeClassifier(random_state=42)),
('knn',
MyOwnClassifier(classifier=KNeighborsClassifier()))])
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다