Введение
В этом лабораторном задании демонстрируется использование алгоритма 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 дает одинаковые результаты для плотных и разреженных данных, и что в случае разреженных данных алгоритм работает быстрее.