Читать книгу Praxiseinstieg Machine Learning mit Scikit-Learn, Keras und TensorFlow - Aurélien Géron - Страница 75
Eigene Transformer
ОглавлениеObwohl Scikit-Learn viele nützliche Transformer bereitstellt, werden Sie für bestimmte Aufgaben bei der Datenaufbereitung oder zum Kombinieren bestimmter Merkmale Ihre eigenen schreiben müssen. Ihre Transformer sollten nahtlos mit den übrigen Funktionen von Scikit-Learn zusammenarbeiten (z.B. Pipelines), und da Scikit-Learn auf Duck Typing (anstelle von Vererbung) aufbaut, müssen Sie lediglich eine Klasse definieren und drei Methoden implementieren: fit() (die self zurückgibt), transform() und fit_transform().
Sie können die letzte automatisch erhalten, indem Sie als Oberklasse Transformer Mixin wählen. Wenn Sie außerdem BaseEstimator als Oberklasse wählen (und die Verwendung der Parameter *args und **kargs im Konstruktor vermeiden), erhalten Sie die zusätzlichen Methoden (get_params() und set_params()), die beim automatischen Einstellen der Hyperparameter hilfreich sind.
Als Beispiel ist hier eine kleine Transformer-Klasse angegeben, die die zuvor besprochenen kombinierten Merkmale hinzufügt:
from sklearn.base import BaseEstimator, TransformerMixin
rooms_ix, bedrooms_ix, population_ix, households_ix = 3, 4, 5, 6
class CombinedAttributesAdder(BaseEstimator, TransformerMixin):
def __init__(self, add_bedrooms_per_room = True): # weder *args noch **kargs
self.add_bedrooms_per_room = add_bedrooms_per_room
def fit(self, X, y=None):
return self # sonst nichts zu tun
def transform(self, X, y=None):
rooms_per_household = X[:, rooms_ix] / X[:, households_ix]
population_per_household = X[:, population_ix] / X[:, households_ix]
if self.add_bedrooms_per_room:
bedrooms_per_room = X[:, bedrooms_ix] / X[:, rooms_ix]
return np.c_[X, rooms_per_household, population_per_household,
bedrooms_per_room]
else:
return np.c_[X, rooms_per_household, population_per_household]
attr_adder = CombinedAttributesAdder(add_bedrooms_per_room=False)
housing_extra_attribs = attr_adder.transform(housing.values)
In diesem Beispiel besitzt der Transformer einen Hyperparameter, add_bedrooms_per_room, der standardmäßig auf True gesetzt ist (es hilft oft, sinnvolle Standardwerte anzugeben). Mit diesem Hyperparameter können Sie leicht herausfinden, ob das Hinzufügen dieses Merkmals einen Machine-Learning-Algorithmus verbessert oder nicht. Im Allgemeinen können Sie für jeden Aufbereitungsschritt, dessen Sie sich nicht zu 100% sicher sind, einen Hyperparameter hinzufügen. Je stärker Sie die Schritte zur Datenaufbereitung automatisieren, desto mehr Kombinationen können Sie später automatisch ausprobieren lassen. Dadurch wird es wahrscheinlicher, dass Sie eine gute Kombination finden (und eine Menge Zeit sparen).