7 Scikit-Learn-Geheimnisse, von denen Sie wahrscheinlich nichts wussten


Als Datenwissenschaftler mit Python-Programmierkenntnissen nutzen wir Scikit-Learn häufig. Es handelt sich um ein Paket für maschinelles Lernen, das in der Regel zunächst neuen Benutzern beigebracht wird und bis zur Produktion verwendet werden kann. Vieles von dem, was gelehrt wird, ist jedoch eine grundlegende Implementierung, und Scikit-Learn enthält viele Geheimnisse zur Verbesserung unseres Datenworkflows.

In diesem Artikel werden sieben Geheimnisse von Scikit-Learn besprochen, die Sie wahrscheinlich nicht kannten. Lassen Sie uns ohne weitere Umschweife loslegen.

1. Wahrscheinlichkeitskalibrierung

Einige Aufgabenmodelle zur Modellklassifizierung für maschinelles Lernen bieten eine Wahrscheinlichkeitsausgabe für jede Klasse. Das Problem mit der Ausgabe der Wahrscheinlichkeitsschätzung besteht darin, dass sie nicht unbedingt gut kalibriert ist, was bedeutet, dass sie nicht die tatsächliche Wahrscheinlichkeit der Ausgabe widerspiegelt.

Beispielsweise könnte Ihr Modell 95 % der Ausgabe der Klasse „Betrug“ liefern, aber nur 70 % dieser Vorhersage sind korrekt. Die Wahrscheinlichkeitskalibrierung würde darauf abzielen, die Wahrscheinlichkeiten so anzupassen, dass sie die tatsächliche Wahrscheinlichkeit widerspiegeln.

Es gibt einige Kalibrierungsmethoden, die gebräuchlichsten sind jedoch die Sigmoidkalibrierung und die isotonische Regression. Der folgende Code verwendet Scikit-Learn, um die Technik im Klassifikator zu kalibrieren.

from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC

svc = SVC(probability=False)
calibrated_svc = CalibratedClassifierCV(base_estimator=svc, method='sigmoid', cv=5)
calibrated_svc.fit(X_train, y_train)
probabilities = calibrated_svc.predict_proba(X_test)

Sie können das Modell ändern, solange es eine Wahrscheinlichkeitsausgabe liefert. Die Methode ermöglicht den Wechsel zwischen „Sigmoid“ und „isotonisch“.

Hier ist zum Beispiel ein Random-Forest-Klassifikator mit isotonischer Kalibrierung.

from sklearn.calibration import CalibratedClassifierCV
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(random_state=42)
calibrated_rf = CalibratedClassifierCV(base_estimator=rf, method='isotonic', cv=5)
calibrated_rf.fit(X_train, y_train)
probabilities = calibrated_rf.predict_proba(X_test)

Wenn Ihr Modell nicht die gewünschte Vorhersage liefert, sollten Sie eine Kalibrierung Ihres Klassifikators in Betracht ziehen.

2. Feature-Union

Das nächste Geheimnis, das wir erforschen werden, ist die Implementierung der Feature Union. Falls Sie es nicht wissen: Feature Union ist eine Scikit-Klasse, die eine Möglichkeit bietet, mehrere Transformer-Objekte in einem einzigen Transformer zu kombinieren.

Es ist eine wertvolle Klasse, wenn wir mehrere Transformationen und Extraktionen aus demselben Datensatz durchführen und diese parallel für unsere maschinelle Lernmodellierung verwenden möchten.

Sehen wir uns im folgenden Code an, wie sie funktionieren.

from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest
from sklearn.svm import SVC

combined_features = FeatureUnion([
    ("pca", PCA(n_components=2)),
    ("select_best", SelectKBest(k=1))
])

pipeline = Pipeline([
    ("features", combined_features),
    ("svm", SVC())
])

pipeline.fit(X_train, y_train)

Im obigen Code können wir sehen, dass wir zwei Transformatormethoden zur Dimensionsreduzierung mit PCA kombiniert und die besten Top-Features in einer Transformer-Pipeline mit Feature-Vereinigung ausgewählt haben. Durch die Kombination mit der Pipeline könnte unsere Feature-Union in einem einzelnen Prozess verwendet werden.

Es ist auch möglich, die Feature-Vereinigung zu verketten, wenn Sie die Feature-Manipulation und Vorverarbeitung besser steuern möchten. Hier ist ein Beispiel der zuvor besprochenen Methode mit einer zusätzlichen Feature-Union.

# First FeatureUnion
first_union = FeatureUnion([
    ("pca", PCA(n_components=5)),
    ("select_best", SelectKBest(k=5))
])

# Second FeatureUnion
second_union = FeatureUnion([
    ("poly", PolynomialFeatures(degree=2, include_bias=False)),
    ("scaled", StandardScaler())
])

pipeline = Pipeline([
    ("first_union", first_union),
    ("second_union", second_union),
    ("svm", SVC())
])

pipeline.fit(X_train, y_train)
score = pipeline.score(X_test, y_test)

Es handelt sich um eine hervorragende Methode für diejenigen, die zu Beginn des Modellierungsprozesses für maschinelles Lernen eine umfassende Vorverarbeitung benötigen.

3. Merkmalsagglomeration

Das nächste Geheimnis, das wir erforschen würden, ist die Feature-Agglomeration. Dies ist eine Feature-Auswahlmethode von Scikit-Learn, verwendet jedoch hierarchisches Clustering, um ähnliche Features zusammenzuführen.

Die Feature-Agglomeration ist eine Methode zur Dimensionsreduzierung, was bedeutet, dass sie nützlich ist, wenn viele Features vorhanden sind und einige Features erheblich miteinander korrelieren. Es basiert auch auf hierarchischem Clustering, bei dem die Features basierend auf dem von uns festgelegten Verknüpfungskriterium und der Entfernungsmessung zusammengeführt werden.

Sehen wir uns im folgenden Code an, wie es funktioniert.

from sklearn.cluster import FeatureAgglomeration

agglo = FeatureAgglomeration(n_clusters=10)
X_reduced = agglo.fit_transform(X)

Wir richten die Anzahl der gewünschten Funktionen ein, indem wir die Clusternummern festlegen. Sehen wir uns an, wie wir die Distanzmessung in Kosinusähnlichkeit umwandeln.

agglo = FeatureAgglomeration(metric='cosine')

Wir können die Verknüpfungsmethode auch mit dem folgenden Code ändern.

agglo = FeatureAgglomeration(linkage='average')

Dann können wir auch die Funktion ändern, um die Features für das neue Feature zu aggregieren.

import numpy as np 
agglo = FeatureAgglomeration(pooling_func=np.median)

Versuchen Sie, mit der Feature-Agglomeration zu experimentieren, um den besten Datensatz für Ihre Modellierung zu erhalten.

4. Vordefinierte Aufteilung

Die vordefinierte Aufteilung ist eine Scikit-Learn-Klasse, die für eine benutzerdefinierte Kreuzvalidierungsstrategie verwendet wird. Es gibt das Schema während der Trainings- und Testdatenaufteilung an. Dies ist eine wertvolle Methode, wenn wir unsere Daten auf eine bestimmte Weise aufteilen möchten und die Standard-K-Faltung oder die geschichtete K-Faltung nicht ausreicht.

Probieren wir die vordefinierte Aufteilung mit dem folgenden Code aus.

from sklearn.model_selection import PredefinedSplit, GridSearchCV

# -1 for training, 0 for test
test_fold = [-1 if i < 100 else 0 for i in range(len(X))]
ps = PredefinedSplit(test_fold)

param_grid = {'parameter': [1, 10, 100]}
grid_search = GridSearchCV(model, param_grid, cv=ps)
grid_search.fit(X, y)

Im obigen Beispiel legen wir das Datenaufteilungsschema fest, indem wir die ersten hundert Daten als Training und den Rest als Test auswählen.

Die Strategie zur Aufteilung hängt von Ihren Anforderungen ab. Mit dem Gewichtungsprozess können wir das ändern.

sample_weights = np.random.rand(100)
test_fold = [-1 if i < 80 else 0 for i in range(len(X))]
ps = PredefinedSplit(test_fold)

Diese Strategie bietet eine neuartige Sicht auf den Datenaufteilungsprozess. Probieren Sie sie also aus, um zu sehen, ob sie Ihnen Vorteile bietet.

5. Warmstart

Haben Sie ein Modell für maschinelles Lernen trainiert, das einen umfangreichen Datensatz erfordert, und möchten es im Batch trainieren? Oder nutzen Sie Online-Lernen, das inkrementelles Lernen mithilfe von Streaming-Daten erfordert? Wenn Sie sich in solchen Fällen befinden, möchten Sie das Modell nicht von Anfang an neu trainieren.

Hier könnte Ihnen ein warmer Start helfen.

Der Warmstart ist ein Parameter im Scikit-Learn-Modell, der es uns ermöglicht, unsere zuletzt trainierte Lösung beim erneuten Anpassen des Modells wiederzuverwenden. Diese Methode ist wertvoll, wenn wir unser Modell nicht von Grund auf neu trainieren möchten.

Der folgende Code zeigt beispielsweise den Warmstartprozess, wenn wir dem Modell weitere Bäume hinzufügen und es neu trainieren, ohne von vorne zu beginnen.

from sklearn.ensemble import GradientBoostingClassifier

#100 trees
model = GradientBoostingClassifier(n_estimators=100, warm_start=True)
model.fit(X_train, y_train)

# Add 50 trees
model.n_estimators += 50
model.fit(X_train, y_train)

Mit der Warmstartfunktion ist auch ein Batch-Training möglich.

from sklearn.linear_model import SGDClassifier

model = SGDClassifier(max_iter=1000, warm_start=True)

# Train on first batch
model.fit(X_batch_1, y_batch_1)

# Continue training on second batch
model.fit(X_batch_2, y_batch_2)

Experimentieren Sie mit einem Warmstart, um immer das beste Modell zu haben, ohne Einbußen bei der Trainingszeit hinnehmen zu müssen.

6. Inkrementelles Lernen

Apropos inkrementelles Lernen: Auch dafür können wir Scikit-Learn nutzen. Wie oben erwähnt, ist inkrementelles Lernen – oder Online-Lernen – ein Trainingsprozess für maschinelles Lernen, bei dem wir nacheinander neue Daten einführen.

Es wird häufig verwendet, wenn unser Datensatz umfangreich ist oder erwartet wird, dass die Daten im Laufe der Zeit eintreffen. Es wird auch verwendet, wenn wir erwarten, dass sich die Datenverteilung im Laufe der Zeit ändert, sodass eine ständige Neuschulung erforderlich ist, jedoch nicht von Grund auf.

In diesem Fall bieten mehrere Algorithmen von Scikit-Learn eine inkrementelle Lernunterstützung mithilfe der Partial-Fit-Methode. Dies würde es ermöglichen, das Modelltraining stapelweise durchzuführen.

Schauen wir uns ein Codebeispiel an.

from sklearn.linear_model import SGDClassifier
import numpy as np

classes = np.unique(y_train)
model = SGDClassifier()
for batch_X, batch_y in data_stream:
    model.partial_fit(batch_X, batch_y, classes=classes)

Das inkrementelle Lernen wird so lange fortgesetzt, wie die Schleife andauert.

Es ist auch möglich, inkrementelles Lernen nicht nur für das Modelltraining, sondern auch für die Vorverarbeitung durchzuführen.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
for batch_X, batch_y in data_stream:
    batch_X = scaler.partial_fit_transform(batch_X)
    model.partial_fit(batch_X, batch_y, classes=classes)

Wenn Ihre Modellierung inkrementelles Lernen erfordert, versuchen Sie, die Partial-Fit-Methode von Scikit-Learn zu verwenden.

7. Zugriff auf experimentelle Funktionen

Nicht jede Klasse und Funktion von Scikit-Learn wurde in der stabilen Version veröffentlicht. Einige sind noch experimentell und wir müssen sie aktivieren, bevor wir sie verwenden können.

Wenn wir die Funktionen aktivieren möchten, müssen wir sehen, welche Funktionen noch im Experiment vorhanden sind, und die API zum Aktivieren des Experiments von Scikit-Learn importieren.

Sehen wir uns unten einen Beispielcode an.

# Enable the experimental feature
from sklearn.experimental import enable_iterative_imputer  
from sklearn.impute import IterativeImputer

imputer = IterativeImputer(random_state=0)

Als dieser Artikel geschrieben wurde, befand sich die Klasse IterativeImputer noch in der experimentellen Phase und wir müssen den Enabler zu Beginn importieren, bevor wir die Klasse verwenden.

Ein weiteres Feature, das sich noch in der experimentellen Phase befindet, ist die Halbierungssuchmethode.

from sklearn.experimental import enable_halving_search_cv
from sklearn.model_selection import HalvingRandomSearchCV
from sklearn.model_selection import HalvingGridSearchCV

Wenn Sie in Scikit-Learn nützliche Funktionen finden, aber nicht darauf zugreifen können, befinden sie sich möglicherweise in der experimentellen Phase. Versuchen Sie daher, auf sie zuzugreifen, indem Sie den Enabler importieren.

Abschluss

Scikit-Learn ist eine beliebte Bibliothek, die in vielen Implementierungen des maschinellen Lernens verwendet wird. Es gibt so viele Funktionen in der Bibliothek, von denen Sie zweifellos viele nicht kennen. Zur Wiederholung: Die sieben Geheimnisse, die wir in diesem Artikel behandelt haben, waren:

  1. Wahrscheinlichkeitskalibrierung
  2. Feature-Union
  3. Merkmal Agglomeration
  4. Vordefinierte Aufteilung
  5. Warmstart
  6. Inkrementelles Lernen
  7. Zugriff auf experimentelle Funktionen

Ich hoffe, das hat geholfen!

Verwandte Artikel