Lasso auf dichten und spärlichen Daten#

Wir zeigen, dass linear_model.Lasso die gleichen Ergebnisse für dichte und spärliche Daten liefert und dass im Fall von spärlichen Daten die Geschwindigkeit verbessert wird.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

from time import time

from scipy import linalg, sparse

from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso

Vergleich der beiden Lasso-Implementierungen auf dichten Daten#

Wir erstellen ein lineares Regressionsproblem, das für Lasso geeignet ist, d.h. mit mehr Merkmalen als Stichproben. Wir speichern dann die Datenmatrix sowohl im dichten (üblichen) als auch im spärlichen Format und trainieren damit jeweils ein Lasso. Wir berechnen die Laufzeit beider und überprüfen, dass sie das gleiche Modell gelernt haben, indem wir die euklidische Norm der Differenz zwischen den gelernten Koeffizienten berechnen. Da die Daten dicht sind, erwarten wir eine bessere Laufzeit mit einem dichten Datenformat.

X, y = make_regression(n_samples=200, n_features=5000, random_state=0)
# create a copy of X in sparse format
X_sp = sparse.coo_matrix(X)

alpha = 1
sparse_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=1000)
dense_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=1000)

t0 = time()
sparse_lasso.fit(X_sp, y)
print(f"Sparse Lasso done in {(time() - t0):.3f}s")

t0 = time()
dense_lasso.fit(X, y)
print(f"Dense Lasso done in {(time() - t0):.3f}s")

# compare the regression coefficients
coeff_diff = linalg.norm(sparse_lasso.coef_ - dense_lasso.coef_)
print(f"Distance between coefficients : {coeff_diff:.2e}")

#
Sparse Lasso done in 0.101s
Dense Lasso done in 0.032s
Distance between coefficients : 5.09e-14

Vergleich der beiden Lasso-Implementierungen auf spärlichen Daten#

Wir machen das vorherige Problem spärlich, indem wir alle kleinen Werte durch 0 ersetzen, und führen die gleichen Vergleiche wie oben durch. Da die Daten jetzt spärlich sind, erwarten wir, dass die Implementierung, die das spärliche Datenformat verwendet, schneller ist.

# make a copy of the previous data
Xs = X.copy()
# make Xs sparse by replacing the values lower than 2.5 with 0s
Xs[Xs < 2.5] = 0.0
# create a copy of Xs in sparse format
Xs_sp = sparse.coo_matrix(Xs)
Xs_sp = Xs_sp.tocsc()

# compute the proportion of non-zero coefficient in the data matrix
print(f"Matrix density : {(Xs_sp.nnz / float(X.size) * 100):.3f}%")

alpha = 0.1
sparse_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=10000)
dense_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=10000)

t0 = time()
sparse_lasso.fit(Xs_sp, y)
print(f"Sparse Lasso done in {(time() - t0):.3f}s")

t0 = time()
dense_lasso.fit(Xs, y)
print(f"Dense Lasso done in  {(time() - t0):.3f}s")

# compare the regression coefficients
coeff_diff = linalg.norm(sparse_lasso.coef_ - dense_lasso.coef_)
print(f"Distance between coefficients : {coeff_diff:.2e}")
Matrix density : 0.626%
Sparse Lasso done in 0.144s
Dense Lasso done in  0.731s
Distance between coefficients : 4.22e-13

Gesamtlaufzeit des Skripts: (0 Minuten 1,074 Sekunden)

Verwandte Beispiele

L1-basierte Modelle für sparse Signale

L1-basierte Modelle für sparse Signale

Gemeinsame Merkmalsauswahl mit Multi-Task Lasso

Gemeinsame Merkmalsauswahl mit Multi-Task Lasso

Lasso, Lasso-LARS und Elastic Net Pfade

Lasso, Lasso-LARS und Elastic Net Pfade

Lasso-Modellauswahl: AIC-BIC / Kreuzvalidierung

Lasso-Modellauswahl: AIC-BIC / Kreuzvalidierung

Galerie generiert von Sphinx-Gallery