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.
Les objets du modèle compatible sklearn doivent être configurés comme suit. Regardons-les dans l'ordre.
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.
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.
É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
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
y = None
comme deuxième argument (pour activer la génération de quantité de caractéristiques par apprentissage non supervisé → apprentissage supervisé avec pipeline, etc.)coef_
)
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
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).
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
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
)
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)