Sklearn: Benutzerdefinierte Modelle und Features
Benutzerdefinierte Modelle können die Funktionalität von scikit-learn erweitern, um die Anforderungen spezifischer Anwendungsszenarien zu erfüllen.
In scikit-learn können Benutzer zusätzlich zur Verwendung fertiger Modelle und Vorverarbeitungsfunktionen auch benutzerdefinierte Modelle, Transformer und Merkmale nach ihren eigenen Anforderungen erstellen.
Die Implementierung benutzerdefinierter Modelle und Merkmale umfasst normalerweise das Erben von den Basisklassen von scikit-learn, wie BaseEstimator und TransformerMixin, und dann die Implementierung spezifischer fit- und predict-Methoden.
In diesem Kapitel wird auf die folgenden Aspekte näher eingegangen:
- Benutzerdefinierter Transformer
- Benutzerdefinierter Estimator
- Benutzerdefinierte Pipeline-Schritte
- Wie man Vererbung verwendet
BaseEstimatorundTransformerMixinum benutzerdefinierte Algorithmen zu implementieren
1. Benutzerdefinierter Transformer
Ein Transformer ist eine Komponente, die verwendet wird, um Daten zu transformieren, wie Standardisierung, Merkmalsauswahl usw. Benutzerdefinierte Transformer können erbenTransformerMixin, und implementierenfitundtransformMethoden.
Schritte zum Anpassen eines Transformers:
fitMethode: wird typischerweise verwendet, um Datenattribute zu lernen (wie Mittelwert, Varianz, Kriterien für die Merkmalsauswahl usw.).fitDie Methode gibt den Transformer selbst zurück, um verkettete Aufrufe zu ermöglichen.transformMethode: wendet die gelernten Attribute an, um die Daten zu transformieren oder zu verarbeiten.
Beispiel für einen benutzerdefinierten Transformer: benutzerdefinierter Standardisierungs-Transformer:
Angenommen, wir möchten einen benutzerdefinierten Standardisierungs-Transformer implementieren. Die Standardisierung skaliert jedes Merkmal der Daten so, dass es einen Mittelwert von 0 und eine Varianz von 1 hat.
Beispiel
from sklearn.base import BaseEstimator, TransformerMixin
class CustomScaler(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
"""
Berechne den Mittelwert und die Standardabweichung jedes Merkmals
"""
self.mean_ = np.mean(X, axis=0)
self.std_ = np.std(X, axis=0)
return self # Das Objekt selbst zurückgeben
def transform(self, X):
"""
Standardisiere die Daten
"""
return (X - self.mean_) / self.std_
# Benutzerdefinierten Transformer testen
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# Daten laden
data = load_iris()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Ein benutzerdefiniertes Transformer-Objekt erstellen
scaler = CustomScaler()
# Benutzerdefinierte Standardisierung verwenden
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
print("Skalierte Trainingsdaten:\n", X_train_scaled)
Die Ausgabe sieht wie folgt aus:
Scaled training data: [[-1.47393679 1.20365799 -1.56253475 -1.31260282] [-0.13307079 2.99237573 -1.27600637 -1.04563275] [ 1.08589829 0.08570939 0.38585821 0.28921757] [-1.23014297 0.75647855 -1.2187007 -1.31260282] [-1.7177306 0.30929911 -1.39061772 -1.31260282] ....
Erklärung:
Die Klasse CustomScaler implementiert einen Standardisierungsprozess ähnlich wie StandardScaler in scikit-learn.
fitDie Methode berechnet den Mittelwert und die Standardabweichung der Trainingsdaten und speichert diese Werte.transformDie Methode verwendet denfitMittelwert und die Standardabweichung, die in der fit-Methode berechnet wurden, um die Daten zu transformieren.
2. Benutzerdefinierter Estimator
Ein Estimator bezieht sich auf das Modell selbst, wie z. B. Regressoren, Klassifikatoren usw.
Benutzerdefinierte Estimators müssen von der BaseEstimator-Klasse erben und die Methoden fit und predict implementieren.
Schritte für einen benutzerdefinierten Estimator:
fitmethod: wird verwendet, um das Modell zu trainieren und erforderliche Parameter (wie Gewichte, Biases usw.) zu berechnen.predictmethod: prognostiziert Eingabedaten basierend auf den trainierten Parametern.
Beispiel für einen benutzerdefinierten Estimator: Einfacher Klassifikator
Angenommen, wir möchten einen sehr einfachen Klassifikator implementieren: Verwenden Sie den Mittelwert jedes Merkmals als Schwellenwert; wenn ein Merkmalswert den Mittelwert überschreitet, sagen Sie Klasse 1 voraus; andernfalls sagen Sie Klasse 0 voraus.
Beispiel
import numpy as np
class SimpleClassifier(BaseEstimator):
def fit(self, X, y):
"""
Trainieren Sie das Modell: Berechnen Sie den Mittelwert jedes Merkmals
"""
self.mean_ = np.mean(X, axis=0)
return self # Das Objekt selbst zurückgeben
def predict(self, X):
"""
Klassifizieren Sie anhand des Mittelwerts: Wenn der Merkmalswert größer als der Mittelwert ist, sagen Sie 1 voraus; andernfalls sagen Sie 0 voraus
"""
return (X > self.mean_).astype(int)
# Benutzerdefinierten Klassifikator testen
X_train = np.array([[1.5, 2.5], [2.0, 3.0], [3.5, 4.5], [4.0, 5.0]])
y_train = np.array([0, 0, 1, 1])
# Benutzerdefiniertes Klassifikatorobjekt erstellen
classifier = SimpleClassifier()
# Modell trainieren
classifier.fit(X_train, y_train)
# Vorhersagen erstellen
X_test = np.array([[2.5, 3.5], [1.0, 2.0]])
y_pred = classifier.predict(X_test)
print("Vorhersagen:", y_pred)
Die Ausgabe sieht wie folgt aus:
Predictions: [[0 0] [0 0]]
Erklärung:
fitDie Methode berechnet den Mittelwert der Trainingsdaten und speichert ihn inself.mean_Attributs.predictDie Methode erstellt Klassifikationsvorhersagen, indem sie die Testdaten mit dem Mittelwert vergleicht.
Diese Art von benutzerdefiniertem Klassifikator wird in der Praxis nicht häufig verwendet, aber sie zeigt, wie man BaseEstimator verwendet, um ein einfaches Modell zu erstellen.
3. Benutzerdefinierte Pipeline-Schritte
scikit-learn ermöglicht die Verwendung benutzerdefinierter Transformer und Estimators als Pipeline-Schritte. Dadurch können Datenvorverarbeitung und Modelltraining in einen einzigen Workflow integriert werden. Benutzerdefinierte Modelle und Features können mit Pipelines genauso funktionieren wie integrierte Transformer und Estimators.
Verwendung benutzerdefinierter Transformer und Estimators in einer Pipeline
Beispiel
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline
class CustomScaler(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
"""
Berechne den Mittelwert und die Standardabweichung jedes Merkmals
"""
self.mean_ = np.mean(X, axis=0)
self.std_ = np.std(X, axis=0)
return self # Das Objekt selbst zurückgeben
def transform(self, X):
"""
Standardisiere die Daten
"""
return (X - self.mean_) / self.std_
class SimpleClassifier(BaseEstimator):
def fit(self, X, y):
"""
Trainieren Sie das Modell: Berechnen Sie den Mittelwert jedes Merkmals
"""
self.mean_ = np.mean(X, axis=0)
return self # Das Objekt selbst zurückgeben
def predict(self, X):
"""
Klassifizieren Sie anhand des Mittelwerts: Wenn der Merkmalswert größer als der Mittelwert ist, sagen Sie 1 voraus; andernfalls sagen Sie 0 voraus
"""
return (X > self.mean_).astype(int)
# Benutzerdefinierten Klassifikator testen
X_train = np.array([[1.5, 2.5], [2.0, 3.0], [3.5, 4.5], [4.0, 5.0]])
y_train = np.array([0, 0, 1, 1])
# Eine Pipeline erstellen, die benutzerdefinierte Standardisierung und Klassifikator enthält
pipeline = Pipeline([
('scaler', CustomScaler()), # Benutzerdefinierte Standardisierung
('classifier', SimpleClassifier()) # Benutzerdefinierter Klassifikator
])
# Trainiere die Pipeline
pipeline.fit(X_train, y_train)
X_test = np.array([[2.5, 3.5], [1.0, 2.0]])
# Vorhersagen
y_pred = pipeline.predict(X_test)
print("Vorhersagen:", y_pred)
Die Ausgabe sieht wie folgt aus:
Predictions: [[0 0] [0 0]]
Erklärung:
Wir verwenden CustomScaler und SimpleClassifier als Pipeline-Schritte und nutzen die Pipeline, um automatisch Datenvorverarbeitung und Modelltraining durchzuführen.
Auf diese Weise kann der gesamte Pipeline-Workflow mit einer einzigen fit- und predict-Methode abgeschlossen werden, wodurch Effizienz und Einfachheit erhalten bleiben.
Wie man benutzerdefinierte Algorithmen durch Vererbung von BaseEstimator und TransformerMixin implementiert
BaseEstimator: ist die Basisklasse für alle scikit-learn-Estimators. Sie bietetget_params()undset_params()Methoden, die es benutzerdefinierten Estimators ermöglichen, zusammenzuarbeitenGridSearchCVmit anderen Werkzeugen.TransformerMixin: ist die Basisklasse für alle scikit-learn-Transformer. Sie bietetfit_transform()Methoden, die es ermöglichen, Transformer zusammen zu verwendenPipelinemit der Pipeline.
Durch Vererbung dieser beiden Basisklassen können wir sehr bequem unsere eigenen benutzerdefinierten Modelle und Features erstellen und die Werkzeuge von scikit-learn (wie GridSearchCV und Pipeline) zum Tuning und zur Evaluierung verwenden.
Vollständiges Beispiel für benutzerdefinierten Transformer und Estimator:
Beispiel
import numpy as np
class CustomEstimator(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
# Simuliere ein einfaches "Modell": Berechne den Mittelwert jedes Features
self.mean_ = np.mean(X, axis=0)
return self
def transform(self, X):
# Standardisiere die Daten basierend auf dem Mittelwert
return X - self.mean_
def predict(self, X):
# Einfache Vorhersagemethode: Wenn der Feature-Wert größer als der Mittelwert ist, 1 vorhersagen; andernfalls 0 vorhersagen
return (X > self.mean_).astype(int)
# Benutzerdefinierten Estimator und Transformer verwenden
from sklearn.pipeline import Pipeline
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# Daten laden
data = load_iris()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Pipeline erstellen
pipeline = Pipeline([
('custom', CustomEstimator())
])
# Modell trainieren
pipeline.fit(X_train, y_train)
# Vorhersagen
y_pred = pipeline.predict(X_test)
print("Vorhersagen:", y_pred)
Im obigen Beispiel haben wir einen benutzerdefinierten Estimator, CustomEstimator, erstellt, der nicht nur die Standardisierung (transform) durchführt, sondern auch die Vorhersage (predict) vornimmt. Dann haben wir ihn als Teil einer Pipeline für Training und Vorhersage verwendet.
Die Ausgabe sieht wie folgt aus:
Predictions: [[1 0 1 1] [0 1 0 0] [1 0 1 1] [1 0 1 1] [1 0 1 1] [0 1 0 0] [0 0 0 1] [1 1 1 1] [1 0 1 1] [0 0 1 1] ...Andere Erweiterungen