Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через JupyterLite или Binder.

Lasso для плотных и разреженных данных

Мы показываем, что linear_model.Lasso дает одинаковые результаты для плотных и разреженных данных, а в случае разреженных данных работает быстрее.

# 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

Сравнение двух реализаций Lasso на плотных данных

Мы создаем задачу линейной регрессии, подходящую для Lasso, то есть с большим количеством признаков, чем объектов. Затем сохраняем матрицу данных в плотном (обычном) и разреженном форматах и обучаем Lasso для каждого из них. Мы вычисляем время выполнения обоих вариантов и проверяем, что они обучили одинаковую модель, вычисляя евклидову норму разности между полученными коэффициентами. Поскольку данные плотные, мы ожидаем, что плотный формат данных обеспечит более высокую скорость выполнения.

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_array(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.109s
Dense Lasso done in 0.040s
Distance between coefficients : 5.23e-14

Сравнение двух реализаций Lasso на разреженных данных

Мы делаем предыдущую задачу разреженной, заменяя все малые значения на 0, и выполняем те же сравнения, что и выше. Поскольку теперь данные разреженные, мы ожидаем, что реализация, использующая разреженный формат данных, будет работать быстрее.

# 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_array(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.151s
Dense Lasso done in  0.985s
Distance between coefficients : 3.85e-13

Общее время выполнения скрипта: (0 минут 1.364 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_lasso_dense_vs_sparse_data.ipynb

Download Python source code: plot_lasso_dense_vs_sparse_data.py

Download zipped: plot_lasso_dense_vs_sparse_data.zip

Похожие примеры

Модели на основе L1 для разреженных сигналов

Совместный отбор признаков с помощью многозадачного Lasso

Траектории Lasso, Lasso-LARS и Elastic Net

Выбор модели Lasso: AIC-BIC / перекрестная проверка

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/linear_model/plot_lasso_dense_vs_sparse_data.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API