Facilitateur de création de wrapper Scikit-Learn Transformers

Classe et fonction facilitant le wrapping Scikit-Learn d’un transformer personalisé.

Created on Mon Nov 23 12:12:30 2020

@author: Cyrile Delestre

class dstk.features._transformers.Transformer(n_jobs: int, verbose: bool)[source]

Bases: sklearn.base.BaseEstimator, sklearn.base.TransformerMixin

Classe générique de transformation Scikit-Learn qui implémente une exécution compatible avec les Pipeline où les éléments doivent être traités un à un si ils sont dans une liste ou un itérable.

Parameters:
n_jobsint

nombre de processeurs en parallèle

verbosebool

Si True bare de progression de process.

See also

make_transformer

Notes

Il est important d’implémenter la méthode udf_transform(self, X, **kargs) et surcharger les autres méthodes si besoin.

Examples

Exemple très simple d’un transformer utilisant la classe Transfomer qui permet d’ordonner les colonnes d’une DataFramme en fonction d’un ordre souhaité.

>>> from dataclasses import dataclass
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.pipeline import Pipeline
>>> from dstk.features import Transformer
>>> from dstk.utils import check_dataframe
>>> 
>>> @dataclass
>>> class SortColumns(Transformer):
>>>     "Classe qui ordonne les colonnes d'une DataFrame."
>>>     order_col: list
>>>     n_jobs: int=1
>>>     verbose: bool=False
>>>
>>>     def udf_transform(self, X):
>>>         # check_dataframe vérifie s'il s'agit bien d'une DataFrame 
>>>         # et que les colonnes de self.order_col sont bien présentes
>>>         check_dataframe(X, self.order_col)
>>>         return X[self.order_col]
>>> orderer = SortColumns(['col_3', 'col_1', 'col_2', 'col_0'], n_jobs=2)
>>> clf = RandomForestClassifier()
>>> pipe = Pipeline([('order_col', orderer), ('rf', clf)])
>>> pipe.fit(X, y)
fit(X: collections.abc.Iterable, y: None = None)[source]

Fonction fit pour être ISO avec Scikit-Learn

Parameters:
XIterable

Observations

yNone

pour être ISO avec Scikit-Learn

transform(X: collections.abc.Iterable, **kargs)[source]

Méthode générique scikit-learn pour la transformation.

Parameters:
XIterable

Array-like, pour un traitement itératif un Iterable quelconque

:**kargs: arguments propres au transformer
udf_transform(X: collections.abc.Iterable, **kargs)[source]

Transformation unitaire.

Parameters:
XIterable

Observations

dstk.features._transformers.make_transformer(udf_transform: collections.abc.Callable, n_jobs: int = 1, verbose: bool = False)[source]

Instentiatieur de classe Transformer, sert à éviter d’écrire une classe directement.

Parameters:
udf_transformCallable

fonction de transformation défini par l’utilisateur (user difined function) qui doit avoir pour prototypage :

udf_transform(X, **kargs)

n_jobsint

nombre de processeurs en parallèle

verboseint

Si True bare de progression de process.

See also

Transformer

Notes

Si le transformer que l’on souhaite créer nécessite la surcharge de la fonction fit alors il est obliger de passer par la définition d’une classe.

De même udf_transform doit être une fonction simple, sinon il est très conseiller de passer par la définition d’une classe.

Examples

>>> from dataclasses import dataclass
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.pipeline import Pipeline
>>> from dstk.features import make_transformer
>>> from dstk.utils import check_dataframe
>>> 
>>> def udf_transform(X, order_col=['col_3', 'col_1', 'col_2', 'col_0']):
>>>     # check_dataframe vérifie s'il s'agit bien d'une DataFrame 
>>>     # et que les colonnes de order_col sont bien présentes
>>>     check_dataframe(X, order_col)
>>>     return X[order_col]
>>> 
>>> orderer = make_transformer(udf_transform)
>>> clf = RandomForestClassifier()
>>> pipe = Pipeline([('order_col', orderer), ('rf', clf)])
>>> pipe.fit(X, y)