Регурессия Lasso в Scikit-Learn

Beginner

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

Введение

В этом лабораторном задании демонстрируется использование алгоритма Lasso-регрессии из Scikit-learn для плотных и разреженных данных. Алгоритм Lasso - это метод линейной регрессии, который добавляет штраф к коэффициентам регрессии. Этот штраф стимулирует модель к получению разреженных коэффициентов. Алгоритм Lasso полезен в ситуациях, когда количество признаков значительно больше количества выборок.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем библиотеки

Начнем с импорта необходимых библиотек. Нам нужны Scikit-learn, NumPy и SciPy.

from time import time
from scipy import sparse
from scipy import linalg
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso

Генерируем плотные данные

Далее мы генерируем некоторые плотные данные, которые будем использовать для Lasso-регрессии. Мы используем функцию make_regression из Scikit-learn для генерации 200 выборок с 5000 признаками.

X, y = make_regression(n_samples=200, n_features=5000, random_state=0)

Обучаем Lasso на плотных данных

Теперь мы обучаем две модели Lasso-регрессии, одну на плотных данных, а другую на разреженных данных. Мы устанавливаем параметр alpha равным 1 и максимальное количество итераций равным 1000.

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

Применяем Lasso к плотным данным

Мы применяем модели Lasso-регрессии к плотным данным с использованием функции fit из Scikit-learn. Также мы засекаем время процесса подгонки и выводим время для каждой модели Lasso.

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")

Сравниваем коэффициенты плотного и разреженного Lasso

Мы сравниваем коэффициенты модели плотного Lasso и модели разреженного Lasso, чтобы убедиться, что они дают одинаковые результаты. Мы вычисляем евклидову норму разницы между коэффициентами.

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

Генерируем разреженные данные

Далее мы генерируем некоторые разреженные данные, которые будем использовать для Lasso-регрессии. Мы копируем плотные данные из предыдущего шага и заменяем все значения, меньшие 2.5, на 0. Также мы преобразуем разреженные данные в формат Сжатой разреженной колонки (Compressed Sparse Column) библиотеки Scipy.

Xs = X.copy()
Xs[Xs < 2.5] = 0.0
Xs_sp = sparse.coo_matrix(Xs)
Xs_sp = Xs_sp.tocsc()

Обучаем Lasso на разреженных данных

Теперь мы обучаем две модели Lasso-регрессии, одну на плотных данных, а другую на разреженных данных. Мы устанавливаем параметр alpha равным 0.1 и максимальное количество итераций равным 10000.

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)

Применяем Lasso к разреженным данным

Мы применяем модели Lasso-регрессии к разреженным данным с использованием функции fit из Scikit-learn. Также мы засекаем время процесса подгонки и выводим время для каждой модели Lasso.

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")

Сравниваем коэффициенты плотного и разреженного Lasso

Мы сравниваем коэффициенты модели плотного Lasso и модели разреженного Lasso, чтобы убедиться, что они дают одинаковые результаты. Мы вычисляем евклидову норму разницы между коэффициентами.

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

Резюме

В этом практическом занятии мы продемонстрировали применение алгоритма Lasso-регрессии из Scikit-learn к плотным и разреженным данным. Мы показали, что алгоритм Lasso дает одинаковые результаты для плотных и разреженных данных, и что в случае разреженных данных алгоритм работает быстрее.