Ich wollte meine eigene Funktion in sklearn.pipeline einbetten, und als ich verschiedene Dinge recherchierte, kam mir die Frage, was ein __sklearn-konformes Modell ist. Unten finden Sie eine Zusammenfassung des offiziellen Dokuments [^ 1]. Ich hoffe, es hilft denen, die daran denken, sklearn.pipeline, sklearn.model_selection.GridSearchCV usw. zu verwenden.
Objekte im sklearn-kompatiblen Modell müssen wie folgt konfiguriert werden. Schauen wir sie uns der Reihe nach an.
Die Anpassungsmethode ist eine Methode zum Lernen von Trainingsdaten. In sklearn wird der Name der Lernmethode einheitlich angepasst. Infolgedessen kann das Modell auch auf der Pipeline- und der GridSearchCV-Seite trainiert werden, indem die Anpassungsmethode für das Objekt des sklearn-kompatiblen Modells aufgerufen wird. Die set_params-Methode hat eine ähnliche Idee. Diese Methode wird aufgerufen, wenn Parameter wie GridSearchCV optimiert werden.
Einige der von sklearn bereitgestellten Funktionen (z. B. GridSearchCV und cross_val_score) verhalten sich je nach Modelltyp unterschiedlich. Wenn Sie beispielsweise einen Klassifikator trainieren, werden Daten geschichtet und abgetastet. Ein Beispiel ist unten gezeigt.
Das Attribut \ _estimator_type wird automatisch festgelegt, indem die Mixin-Klasse (z. B. ClassifierMixin-Klasse) in sklearn.base geerbt wird. Darüber hinaus empfiehlt sklearn, sklearn.base.BaseEstimator und die für dieses Modell geeignete Mixin-Klasse zu erben, wenn ein sklearn-kompatibles Modell erstellt wird. --BaseEstimator: Die Methode set_params und andere Methoden, die bei einer Implementierung von Grund auf zu Kesselplattencode führen würden, werden beschrieben. --Mixin: Beschreibt die Methoden, die in jedem _estimator_type verwendet werden.
Schreiben Sie den Code basierend auf dem Inhalt von 1.1. Und 1.2. Beachten Sie, dass set_params hier nicht beschrieben wird, da es in der BaseEstimator-Klasse vorbereitet ist.
from sklearn.base import BaseEstimator, ClassifierMixin
class Classifier(BaseEstimator, ClassifierMixin):
def __init__(self):
pass
def fit(self, X, y):
pass
from sklearn.base import BaseEstimator, ClassifierMixin
class Classifier(BaseEstimator, ClassifierMixin):
def __init__(self, params1=0, params2=None):
self.params1 = params1
self.params2 = params2
def fit(self, X, y):
pass
from sklearn.base import BaseEstimator, ClassifierMixin
class Classifier(BaseEstimator, ClassifierMixin):
def __init__(self, params1=0, params2=None):
self.params1 = params1
self.params2 = params2
def fit(self, X, y=None):
print('Der Prozess des Lernens von Daten wird hier beschrieben.')
return self
Andere als die oben genannten Punkte sind aufgeführt.
--X.shape [0]
undy.shape [0]
sind identisch (überprüfen Sie dies mit sklearn.utils.validation.check_X_y).
--set_params verwendet ein Wörterbuch als Argument und der Rückgabewert ist self.
--get_params akzeptiert keine Argumente.
--Für Klassifizierer haben Sie eine Liste von Beschriftungen im Attribut classes_ (verwenden Sie sklearn.utils.multiclass.unique_labels).
from sklearn.base import BaseEstimator, ClassifierMixin
from sklearn.utils.validation import check_X_y
from sklearn.utils.multiclass import unique_labels
class Classifier(BaseEstimator, ClassifierMixin):
def __init__(self, params1=0, params2=None):
self.params1 = params1
self.params2 = params2
def fit(self, X, y=None):
X, y = check_X_y(X, y)
self.classes_ = unique_labels(y)
print('Der Prozess des Lernens von Daten wird hier beschrieben.')
return self
def get_params(self, deep=True):
return {"params1": self.params1, "params1": self.params1}
def set_params(self, **parameters):
for parameter, value in parameters.items():
setattr(self, parameter, value)
return self
Es ist grundsätzlich PEP8-konform, aber zusätzlich gibt es einen Codierungsstandard für sklearn, daher werde ich ihn beschreiben. Diese sind nicht erforderlich, wenn Sie nicht daran denken, zu sklearn beizutragen.
sklearn bietet eine check_estimator-Methode, um zu überprüfen, ob es sich um ein sklearn-kompatibles Modell handelt. Es hängt vom Attribut _estimator_type ab, aber es scheint einige Tests durchzuführen, um sicherzustellen, dass es kompatibel ist. Wenn Sie die Anpassungsmethode nicht implementieren, wird der Fehler AttributeError: 'Classifier'-Objekt hat kein Attribut'fit'
. Da die Vorlage des sklearn-kompatiblen Modells auf github vorbereitet ist, ist es besser, sie in Bezug darauf zu implementieren und check_estimator auszuführen, wenn sie abgeschlossen ist, um sie zu überprüfen. Ein Ausführungsbeispiel ist unten gezeigt.
from sklearn.utils.estimator_checks import check_estimator
#In dem bisher oben implementierten Code tritt ein Fehler auf, weil die als Klassifizierer erforderliche Vorhersagemethode nicht definiert ist.
#Wenn Sie es als Template Estimator implementieren, ohne ClassifierMixin zu erben, tritt kein Fehler auf.
class Estimator(BaseEstimator):
def __init__(self, params1=0, params2=None):
self.params1 = params1
self.params2 = params2
def fit(self, X, y=None):
X, y = check_X_y(X, y)
self.classes_ = unique_labels(y)
self.is_fitted_ = True
return self
def get_params(self, deep=True):
return {"params1": self.params1, "params1": self.params1}
def set_params(self, **parameters):
for parameter, value in parameters.items():
setattr(self, parameter, value)
return self
check_estimator(Estimator)