[PYTHON] Über sklearn-konformes Modell

Was ist das

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.

1. Objektzusammensetzung

Objekte im sklearn-kompatiblen Modell müssen wie folgt konfiguriert werden. Schauen wir sie uns der Reihe nach an.

  1. Es verfügt über die Methoden fit und set_params.
  2. Hat das Attribut _estimator_type

1.1. Fit, set_params Methode

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.

1.2. Attribut _estimator_type

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.

1.3. Implementierungsbeispiel

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

  1. __init__ Was Sie beim Erstellen einer Instanz beachten sollten, ist der Empfang von Parametern. Die Art und Weise, wie Sie es erhalten, ist unten aufgeführt.

2.1. Implementierungsbeispiel


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

  1. fit Die zu passenden Artikel sind unten aufgeführt.

3.1. Implementierungsbeispiel


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

4. Andere

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).

4.1. Implementierungsbeispiel


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

5. Codierungskonvention

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.

6. Überprüfen Sie, ob das Modell sklearn-kompatibel ist

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)

Recommended Posts

Über sklearn-konformes Modell
Hinweis zu get_scorer von sklearn