Hinweis
Gehen Sie zum Ende, um den vollständigen Beispielcode herunterzuladen oder dieses Beispiel über JupyterLite oder Binder in Ihrem Browser auszuführen.
Elastic Net Anpassung mit vorkomputierter Gram-Matrix und gewichteten Samples#
Das folgende Beispiel zeigt, wie die Gram-Matrix mit gewichteten Samples mit einem ElasticNet vorkomputiert werden kann.
Wenn gewichtete Samples verwendet werden, muss die Designmatrix zentriert und dann durch die Quadratwurzel des Gewichtungsvektors skaliert werden, bevor die Gram-Matrix berechnet wird.
Hinweis
- Der Vektor
sample_weightwird ebenfalls skaliert, um die Summen_sampleszu ergeben. Siehe die Dokumentation für den Parameter
sample_weightfürfit.
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
Beginnen wir mit dem Laden des Datensatzes und dem Erstellen einiger Beispielgewichte.
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()))
Um das Elastic Net mit der Option precompute zusammen mit den Sample-Gewichten anzupassen, müssen wir zuerst die Designmatrix zentrieren und sie vor der Berechnung der Gram-Matrix mit den normalisierten Gewichten skalieren.
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)
Wir können nun mit der Anpassung fortfahren. Wir müssen die zentrierte Designmatrix an fit übergeben, da der Elastic Net-Schätzer sonst erkennt, dass sie unzentriert ist, und die von uns übergebene Gram-Matrix verwirft. Wenn wir jedoch die skalierte Designmatrix übergeben, wird der Vorverarbeitungscode sie fälschlicherweise ein zweites Mal skalieren.
from sklearn.linear_model import ElasticNet
lm = ElasticNet(alpha=0.01, precompute=gram)
lm.fit(X_centered, y, sample_weight=normalized_weights)
Gesamtlaufzeit des Skripts: (0 Minuten 2,551 Sekunden)
Verwandte Beispiele