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_weight wird ebenfalls skaliert, um die Summe n_samples zu ergeben. Siehe die

Dokumentation für den Parameter sample_weight für fit.

# 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)
ElasticNet(alpha=0.01,
           precompute=array([[ 9.98809919e+04, -4.48938813e+02, -1.03237920e+03, ...,
        -2.25349312e+02, -3.53959628e+02, -1.67451144e+02],
       [-4.48938813e+02,  1.00768662e+05,  1.19112072e+02, ...,
        -1.07963978e+03,  7.47987268e+01, -5.76195467e+02],
       [-1.03237920e+03,  1.19112072e+02,  1.00393284e+05, ...,
        -3.07582983e+02,  6.66670169e+02,  2.65799352e+02],
       ...,
       [-2.25349312e+02, -1.07963978e+03, -3.07582983e+02, ...,
         9.99891212e+04, -4.58195950e+02, -1.58667835e+02],
       [-3.53959628e+02,  7.47987268e+01,  6.66670169e+02, ...,
        -4.58195950e+02,  9.98350372e+04,  5.60836363e+02],
       [-1.67451144e+02, -5.76195467e+02,  2.65799352e+02, ...,
        -1.58667835e+02,  5.60836363e+02,  1.00911944e+05]],
      shape=(100, 100)))
In einer Jupyter-Umgebung führen Sie diese Zelle bitte erneut aus, um die HTML-Darstellung anzuzeigen, oder vertrauen Sie dem Notebook.
Auf GitHub kann die HTML-Darstellung nicht gerendert werden. Versuchen Sie bitte, diese Seite mit nbviewer.org zu laden.


Gesamtlaufzeit des Skripts: (0 Minuten 2,551 Sekunden)

Verwandte Beispiele

SVM: Gewichtete Stichproben

SVM: Gewichtete Stichproben

SGD: Gewichtete Stichproben

SGD: Gewichtete Stichproben

Metadaten-Routing

Metadaten-Routing

Nearest Neighbors Regression

Nearest Neighbors Regression

Galerie generiert von Sphinx-Gallery