[PYTHON] À propos du modèle compatible sklearn

Qu'est-ce que c'est

Je voulais intégrer ma propre fonction dans sklearn.pipeline, et en recherchant diverses choses, je me suis posé la question de savoir ce qu'est un modèle compatible __sklearn. Voici un résumé du document officiel [^ 1]. J'espère que cela aidera ceux qui envisagent d'utiliser sklearn.pipeline, sklearn.model_selection.GridSearchCV, etc.

1. Composition d'objets

Les objets du modèle compatible sklearn doivent être configurés comme suit. Regardons-les dans l'ordre.

  1. Il a des méthodes fit et set_params.
  2. Possède l'attribut _estimator_type

1.1. Fit, méthode set_params

La méthode fit est une méthode utilisée pour apprendre les données d'entraînement. Dans sklearn, le nom de la méthode d'apprentissage est unifié pour s'adapter. Par conséquent, même du côté pipeline et GridSearchCV, le modèle peut être appris en appelant la méthode fit sur l'objet du modèle compatible sklearn. La méthode set_params a une idée similaire. Cette méthode est appelée lors du réglage de paramètres tels que GridSearchCV.

1.2. Attribut _estimator_type

Certaines des fonctionnalités fournies par sklearn (par exemple GridSearchCV et cross_val_score) se comportent différemment selon le type de modèle. Par exemple, lors de la formation d'un classificateur, les données sont stratifiées et échantillonnées. Un exemple est présenté ci-dessous. --Catégorie: classificateur --Regressor: régresseur --Clustering: clusterer

L'attribut \ _estimator_type est automatiquement défini en héritant de la classe Mixin (par exemple, la classe ClassifierMixin) dans sklearn.base. De plus, sklearn recommande d'hériter de sklearn.base.BaseEstimator et de la classe Mixin adaptée à ce modèle lors de la création d'un modèle compatible sklearn. --BaseEstimator: La méthode set_params et d'autres méthodes qui entraîneraient un code de plaque de chaudière si elles étaient implémentées à partir de zéro sont décrites. --Mixin: décrit les méthodes qui seront utilisées dans chaque _estimator_type.

1.3. Exemple de mise en œuvre

Écrivez le code basé sur le contenu de 1.1 et 1.2. Notez que set_params n'est pas décrit ici car il est préparé dans la classe BaseEstimator.


from sklearn.base import BaseEstimator, ClassifierMixin

class Classifier(BaseEstimator, ClassifierMixin):

    def __init__(self):
        pass

    def fit(self, X, y):
        pass

  1. __init__ Ce à quoi vous devez faire attention lors de la création d'une instance est la réception des paramètres. La manière de le recevoir est indiquée ci-dessous. --Tous les paramètres liés à l'apprentissage tels que les hyperparamètres doivent être passés par la méthode \ _ \ _ init__ (seules les données doivent être transmises par la méthode fit).

2.1. Exemple de mise en œuvre


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 Les articles à noter en forme sont énumérés ci-dessous.

3.1. Exemple de mise en œuvre


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('Le processus d'apprentissage des données est décrit ici.')
        return self

4. Autre

Les éléments à noter autres que ceux ci-dessus sont répertoriés. --X.shape [0] ety.shape [0]sont identiques (vérifiez avec sklearn.utils.validation.check_X_y). --set_params prend un dictionnaire comme argument et la valeur de retour est self. --get_params ne prend aucun argument. --Pour les classificateurs, ayez une liste d'étiquettes dans l'attribut classes_ (utilisez sklearn.utils.multiclass.unique_labels).

4.1. Exemple de mise en œuvre


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('Le processus d'apprentissage des données est décrit ici.')
        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. Convention de codage

Il est fondamentalement conforme à PEP8, mais en plus il existe une norme de codage pour sklearn, donc je vais le décrire. Celles-ci ne sont pas nécessaires si vous ne pensez pas contribuer à sklearn. --Séparez chaque mot par un trait de soulignement à l'exception du nom de la classe (par exemple, n_samples)

6. Vérifiez si le modèle est compatible sklearn

sklearn fournit une méthode check_estimator pour vérifier s'il s'agit d'un modèle compatible sklearn. Cela dépend de l'attribut _estimator_type, mais il semble faire des tests pour s'assurer qu'il est conforme. Si vous n'implémentez pas la méthode fit, vous obtiendrez l'erreur ʻAttributeError: l'objet 'Classifier' n'a pas d'attribut'fit'`. De plus, puisque le modèle du modèle compatible sklearn est préparé sur github, il est préférable de l'implémenter en faisant référence à cela et d'exécuter check_estimator lorsqu'il est terminé pour le vérifier. Un exemple d'exécution est présenté ci-dessous.

from sklearn.utils.estimator_checks import check_estimator

#Dans le code implémenté ci-dessus jusqu'à présent, une erreur se produit car la méthode de prédiction requise en tant que classificateur n'est pas définie.
#Si vous l'implémentez en tant qu'estimateur de modèle sans hériter de ClassifierMixin, aucune erreur ne se produira.
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

À propos du modèle compatible sklearn
Remarque à propos de get_scorer de sklearn