Gram-Matrix für ElasticNet vorberechnen

Machine LearningMachine LearningBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab wird gezeigt, wie die Gram-Matrix während der Verwendung von gewichteten Stichproben mit einem ElasticNet vorberechnet werden kann. Es ist wichtig zu beachten, dass wenn gewichtete Stichproben verwendet werden, die Designmatrix zentriert und dann durch die Quadratwurzel des Gewichtsvektors skaliert werden muss, bevor die Gram-Matrix berechnet wird.

VM-Tipps

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Laden des Datensatzes und Erstellen von Stichprobengewichten

Wir beginnen mit dem Laden des Datensatzes und der Erstellung einiger Stichprobengewichte. Wir verwenden die make_regression-Funktion aus scikit-learn, um einen zufälligen Regressionsdatensatz mit 100.000 Stichproben zu generieren. Anschließend generieren wir einen lognormalverteilten Gewichtsvektor und normalisieren ihn, sodass die Summe der Gewichte der Gesamtzahl der Stichproben entspricht.

import numpy as np
from sklearn.datasets import make_regression

rng = np.random.RandomState(0)

n_samples = int(1e5)
X, y = make_regression(n_samples=n_samples, noise=0.5, random_state=rng)

sample_weight = rng.lognormal(size=n_samples)
## normalize the sample weights
normalized_weights = sample_weight * (n_samples / (sample_weight.sum()))

Vorcomputieren der Gram-Matrix mit gewichteten Stichproben

Um das elastische Netz mit der Option precompute zusammen mit den Stichprobengewichten anzupassen, müssen wir die Designmatrix zunächst zentrieren und sie vor der Berechnung der Gram-Matrix durch die normalisierten Gewichte skalieren. Wir zentrieren die Designmatrix, indem wir von jeder Zeile den gewichteten Mittelwert jeder Merkmalsspalte subtrahieren. Anschließend skalieren wir die zentrierte Designmatrix, indem wir jede Zeile mit der Quadratwurzel des entsprechenden normalisierten Gewichts multiplizieren. Schließlich berechnen wir die Gram-Matrix, indem wir das Skalarprodukt der skalierten Designmatrix mit ihrer Transponierten bilden.

X_offset = np.average(X, axis=0, weights=normalized_weights)
X_centered = X - np.average(X, axis=0, weights=normalized_weights)
X_scaled = X_centered * np.sqrt(normalized_weights)[:, np.newaxis]
gram = np.dot(X_scaled.T, X_scaled)

Anpassen des elastischen Netzes

Wir können nun mit der Anpassung fortfahren. Wir müssen die zentrierte Designmatrix an fit übergeben, um zu verhindern, dass der elastische Netz-Schätzer erkennt, dass sie nicht zentriert ist und die von uns übergebene Gram-Matrix verwirft. Wenn wir jedoch die skalierte Designmatrix übergeben, wird der Vorverarbeitungscode sie falsch wieder skalieren. Wir übergeben auch die normalisierten Gewichte an den sample_weight-Parameter der fit-Funktion.

from sklearn.linear_model import ElasticNet

lm = ElasticNet(alpha=0.01, precompute=gram)
lm.fit(X_centered, y, sample_weight=normalized_weights)

Zusammenfassung

In diesem Lab wurde gezeigt, wie die Gram-Matrix bei der Verwendung von gewichteten Stichproben mit einem ElasticNet vorberechnet werden kann. Zunächst haben wir einen Regressionsdatensatz geladen und einen lognormalverteilten Gewichtsvektor erstellt, der normalisiert wurde, sodass die Summe der Gewichte der Gesamtzahl der Stichproben entspricht. Anschließend haben wir die Designmatrix zentriert, sie durch die normalisierten Gewichte skaliert und die Gram-Matrix berechnet. Schließlich haben wir das elastische Netz mit der vorberechneten Gram-Matrix und den normalisierten Gewichten angepasst.