[PYTHON] Konsistenz des Scikit-Learn-API-Designs

Einführung

scikit-learn ist eine praktische Bibliothek für maschinelles Lernen für Python, die problemlos mit Numpy, Scipy und Matplotlib verwendet werden kann. scikit-learn wird viel einfacher zu verwenden, sobald Sie das API-Entwurfsmuster kennen.

Dieses Mal werde ich den Charme von Scikit-Learn anhand des Artikels des Autors von Scikit-Learn erläutern.

Grundlegende Gestaltung

Die Scikit-Lernobjekte werden nach verschiedenen Mustern entworfen, um die API konsistent zu halten. ** Wenn Sie dieses Muster verstehen, können Sie jedes Objekt ohne Unannehmlichkeiten verwenden. ** ** **

Estimator scikit-learn basiert auf einer Schnittstelle namens Estimator. ** Der Schätzer trainiert ein Modell (Parameter) basierend auf den Daten. ** ** ** Es hat immer eine Methode namens "fit" und lernt, indem Daten an das Argument "fit" übergeben werden. Sie können auch die für das Training erforderlichen Hyperparameter festlegen (im Konstruktor oder in der Methode "set_params").

Eine Klasse namens "LogisticRegression", die eine logistische Regression durchführt, ist ebenfalls einer der Schätzer.

from sklearn.linear_model import LogisticRegession
clf = LogisticRegression(penalty="l1") #Hyper-Parametereinstellungen
clf.fit(X_train, y_train) #Lernen Sie das Modell anhand von Trainingsdaten

Predictor Viele Schätzer führen auch Predictor-Schnittstellen ein. ** Predictor macht Vorhersagen (Outputs) basierend auf dem in fit erlernten Modell. ** ** ** Das Übergeben von Daten als Argument an die "Vorhersage" -Methode gibt eine Vorhersage zurück. Es gibt auch eine Methode namens "Score", mit der Sie das Modell bewerten können, indem Sie einen Datensatz und eine Beschriftung übergeben.

Beispielsweise ist "LogisticRegression" ein Prädiktor, sodass Sie die Methoden "Predict" und "Score" problemlos verwenden können.

clf.predict(X_test) #Vorhersage über Testdaten
clf.score(X_test, y_test) #Vergleichen Sie die Erwartungen und tatsächlichen Antworten zu Testdaten

Transformer Neben Predictor gibt es auch eine Klasse, die eine Schnittstelle namens Transformer einführt. Wie der Name schon sagt, kann ** Transformer Daten transformieren. ** ** ** Es wird in Datenverarbeitungs-APIs häufiger verwendet als in Modellen für maschinelles Lernen. Gibt die transformierten Daten mit einer Methode namens "transform" zurück. Mit der Methode "fit_transform" wird außerdem so gestaltet, dass Lernen und Transformation gleichzeitig durchgeführt werden können.

Das folgende Beispiel implementiert eine Transformation von "StandardScaler", die das Dataset standardisiert. Für "StandardScaler" lernen Sie den Mittelwert und die Varianz jeder Kurve und nicht ein komplexes Modell.

from sklearn.preprocessing import StandardScaler 
scaler = StandScaler()
X_train = scaler.fit_transform(X_train) #Trainingsdaten lernen und transformieren
X_test = scaler.transform(X_test) #Verformung ohne Lerntestdaten (unter Verwendung des Durchschnitts / der Varianz der Trainingsdaten)

Außerdem können die Schnittstellen Predictor und Transformer gleichzeitig installiert werden.

Holen Sie sich Parameter / Hyper-Parameter

Die von Ihnen eingestellten Hyperparameter und die gelernten Parameter werden im Objekt gespeichert. (Namen der gelernten Parameter enden mit einem Unterstrich) Informationen zum Zugriff auf Parameter und Hyperparameter finden Sie unter "Attribute" in der Dokumentation für jedes Objekt.

Beispiel: Ermitteln Sie den Mittelwert und die Varianz, die von StandardScaler gelernt wurden

#Weiter von vorne
mean = scaler.mean_
variance = scaler.var_

Daher jeder Schätzer

  1. Erstellen Sie eine Instanz und legen Sie Hyperparameter fest
  2. Lernen Sie mit "fit"
  3. Überprüfen Sie die gelernten Parameter, die den Zweck erreichen, mit "Vorhersagen", "Punktzahl", "Transformation" usw. Sie können einfach einen Workflow erstellen, indem Sie den Anweisungen folgen. Die gesamte Datenverarbeitung zur Modellierung des Lernens / der Bewertung kann mit Estimator erfolgen.

Angewandtes Design

Schätzersynthese

Da alle Schätzer dieselbe Methode haben **, können Sie problemlos mehrere Schätzer kombinieren. ** ** ** Verwenden Sie "Pipeline" für die Parallelverarbeitung und "FeatureUnion" für die Parallelverarbeitung.

Wenn Sie beispielsweise Ihre Daten standardisieren und eine logistische Regression durchführen möchten, können Sie den Prozess mithilfe einer Pipeline sauber implementieren.

from sklearn.pipeline import Pipeline
pipe = Pipeline([
    {'std_scaler', StandardScaler()},
    {'log_reg', LogisticRegression()} #Verformte Daten des Transformators empfangen
])
pipe.fit(X_train, y_train)
pipe.score(X_test, y_test)

Die Kreuzvalidierung ist auch ein Schätzer

Mit scikit-learn können Sie Hyperparameter mithilfe von Klassen wie "GridSearchCV" und "RandomSearchCV" validieren. Diese führen auch die Estimator-Oberfläche ein und verwenden "fit" zum Lernen.

Beispiel: Verwenden Sie die Rastersuche, um die optimalen Hyperparameter für die logistische Regression zu finden

from sklearn.model_selection import GridSearchCV
clf = GridSearchCV(
    estimator=LogisticRegression(),
    param_grid={
        'C' = [1, 3, 10, 30, 100]
    }
)
clf.fit(X_train, y_train) # param_Trainieren Sie mehrere Modelle, indem Sie die Hyperparameter einzeln im Raster anwenden
best_clf = clf.best_estimator_ #Holen Sie sich den besten Schätzer!

Machen Sie Ihren eigenen Schätzer

Durch Erstellen einer Klasse mit in der Schnittstelle definierten Methoden, z. B. "fit", ** können Sie diese problemlos für Pipelines und Validierungen verwenden. ** ** ** Wenn Sie einen Schätzer erstellen, erben Sie "BaseEstimator", und wenn Sie einen Transformer usw. erstellen, erben Sie gleichzeitig das entsprechende "Mixin".

Transformator Beispiel:

from sklearn.base import BaseEstimator, TransformerMixin

class MyTransformer(BaseEstimator, TransformerMixin):
  def __init__(self, param_1, param_2):
    #Hyper-Parameter-Verarbeitung
    self.param_1 = param_1
    # ...

  def fit(self, X, y=None):
    #wird bearbeitet
    return self 

  def transform(self, X, y=None):
     #Numpy Matrix Verarbeitung
     # X = ...
    return X 

  # fit_Die Transformation wird automatisch von Transformer Mixin implementiert

transformer = MyTransformer()
X_transformed = transformer.fit_transform(X_train)

Fazit

Obwohl scikit-learn Objekte bereitstellt, die verschiedene Methoden des maschinellen Lernens implementieren, können Sie sie alle verwenden, auch wenn Sie die Entwurfsmuster von Estimator, Predictor und Transformer verstehen, auch wenn Sie den Inhalt nicht verstehen. Die Scikit-Learn-API ist attraktiv, weil sie sehr konsistent ist und Sie problemlos mit maschinellem Lernen fortfahren können.

Recommended Posts

Konsistenz des Scikit-Learn-API-Designs
Über max_iter von LogisticRegression () von scikit-learn
Parallele Verarbeitung mit Parallel von Scikit-Learn
Python: Grundlagen der Verwendung von Scikit-Learn ①
Rastersuche von Hyperparametern mit Scikit-learn
[Übersetzung] scikit-learn 0.18 Tutorial Inhaltsverzeichnis
Installation von scikit-learn (Mac OS X)
Einführung einer datengesteuerten Controller-Entwurfsmethode
Versuchsplanungsmethode und Kombinationsoptimierung