Введение
В этом лабораторном задании мы исследуем разреженность решений при использовании L1-, L2- и Elastic-Net штрафов для различных значений C. Мы будем использовать логистическую регрессию для классификации 8x8-изображений цифр на две категории: 0-4 против 5-9. Мы визуализируем коэффициенты моделей для различных значений C.
Советы по использованию ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Импортируем необходимые библиотеки
Первым шагом является импорт необходимых библиотек. Нам понадобятся numpy, matplotlib.pyplot, datasets, StandardScaler и LogisticRegression из sklearn.linear_model.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
Загружаем датасет
Мы будем загружать датасет цифр с использованием datasets.load_digits(return_X_y=True). Также мы стандартизируем данные с использованием StandardScaler().fit_transform(X). Целевая переменная будет бинарной, где 0-4 будут классифицированы как 0, а 5-9 будут классифицированы как 1.
X, y = datasets.load_digits(return_X_y=True)
X = StandardScaler().fit_transform(X)
y = (y > 4).astype(int)
Определяем параметр регуляризации и соотношение L1
Мы определим параметр регуляризации C и соотношение L1 l1_ratio для Elastic-Net штрафа. Мы установим l1_ratio равным 0,5.
l1_ratio = 0.5
Создаем подграфики для визуализации
Мы создадим подграфики для визуализации коэффициентов моделей при различных значениях C. Мы создадим 3 ряда и 3 колонки подграфиков.
fig, axes = plt.subplots(3, 3)
Обучаем логистические регрессионные модели с разными штрафами и параметрами регуляризации
Мы обучим логистические регрессионные модели с L1, L2 и Elastic-Net штрафами и разными значениями C. Мы увеличим допуск для сокращения времени обучения.
for i, (C, axes_row) in enumerate(zip((1, 0.1, 0.01), axes)):
clf_l1_LR = LogisticRegression(C=C, penalty="l1", tol=0.01, solver="saga")
clf_l2_LR = LogisticRegression(C=C, penalty="l2", tol=0.01, solver="saga")
clf_en_LR = LogisticRegression(C=C, penalty="elasticnet", solver="saga", l1_ratio=l1_ratio, tol=0.01)
clf_l1_LR.fit(X, y)
clf_l2_LR.fit(X, y)
clf_en_LR.fit(X, y)
Вычисляем разреженность и оценки
Мы вычислим разреженность (процент нулевых коэффициентов) и оценки для каждой модели.
coef_l1_LR = clf_l1_LR.coef_.ravel()
coef_l2_LR = clf_l2_LR.coef_.ravel()
coef_en_LR = clf_en_LR.coef_.ravel()
sparsity_l1_LR = np.mean(coef_l1_LR == 0) * 100
sparsity_l2_LR = np.mean(coef_l2_LR == 0) * 100
sparsity_en_LR = np.mean(coef_en_LR == 0) * 100
score_l1_LR = clf_l1_LR.score(X, y)
score_l2_LR = clf_l2_LR.score(X, y)
score_en_LR = clf_en_LR.score(X, y)
Визуализируем коэффициенты
Мы визуализируем коэффициенты моделей для каждого штрафа и значения C.
for ax, coefs in zip(axes_row, [coef_l1_LR, coef_en_LR, coef_l2_LR]):
ax.imshow(np.abs(coefs.reshape(8, 8)), interpolation='nearest', cmap='binary', vmax=1, vmin=0)
ax.set_xticks(())
ax.set_yticks(())
Задаем заголовки и метки
Мы зададим заголовки и метки для подграфиков.
if i == 0:
axes_row[0].set_title("L1 penalty")
axes_row[1].set_title("Elastic-Net\nl1_ratio = %s" % l1_ratio)
axes_row[2].set_title("L2 penalty")
axes_row[0].set_ylabel("C = %s" % C)
Выводим результаты
Мы выведем разреженность и оценки для каждой модели.
print("C=%.2f" % C)
print("{:<40} {:.2f}%".format("Sparsity with L1 penalty:", sparsity_l1_LR))
print("{:<40} {:.2f}%".format("Sparsity with Elastic-Net penalty:", sparsity_en_LR))
print("{:<40} {:.2f}%".format("Sparsity with L2 penalty:", sparsity_l2_LR))
print("{:<40} {:.2f}".format("Score with L1 penalty:", score_l1_LR))
print("{:<40} {:.2f}".format("Score with Elastic-Net penalty:", score_en_LR))
print("{:<40} {:.2f}".format("Score with L2 penalty:", score_l2_LR))
Отображаем визуализацию
Мы отобразим подграфики.
plt.show()
Резюме
В этом практическом занятии мы изучили разреженность решений, когда для различных значений C используются штрафы L1, L2 и Elastic-Net. Мы использовали логистическую регрессию для классификации 8x8 изображений цифр на две категории: 0-4 против 5-9. Мы визуализировали коэффициенты моделей для различных значений C. Мы также вычислили разреженность и оценки для каждой модели и вывели результаты.