Регуляризационный путь L1-логистической регрессии#

Обучить логистические регрессии с l1-штрафом на задаче бинарной классификации, полученной из набора данных Iris.

Модели упорядочены от наиболее сильно регуляризованных к наименее регуляризованным. 4 коэффициента моделей собраны и построены как «путь регуляризации»: в левой части рисунка (сильные регуляризаторы) все коэффициенты точно равны 0. Когда регуляризация постепенно ослабляется, коэффициенты могут принимать ненулевые значения один за другим.

Здесь мы выбираем решатель liblinear, потому что он может эффективно оптимизировать функцию потерь логистической регрессии с негладким, индуцирующим разреженность штрафом l1.

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

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

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

Загрузка данных#

from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names

Здесь мы удаляем третий класс, чтобы сделать задачу бинарной классификацией

X = X[y != 2]
y = y[y != 2]

Вычислить путь регуляризации#

import numpy as np

from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import l1_min_c

cs = l1_min_c(X, y, loss="log") * np.logspace(0, 1, 16)

Создайте конвейер с StandardScaler и LogisticRegression, чтобы нормализовать данные перед обучением линейной модели, чтобы ускорить сходимость и сделать коэффициенты сопоставимыми. Кроме того, как побочный эффект, поскольку данные теперь центрированы вокруг 0, нам не нужно подгонять свободный член.

clf = make_pipeline(
    StandardScaler(),
    LogisticRegression(
        l1_ratio=1,
        solver="liblinear",
        tol=1e-6,
        max_iter=int(1e6),
        warm_start=True,
        fit_intercept=False,
    ),
)
coefs_ = []
for c in cs:
    clf.set_params(logisticregression__C=c)
    clf.fit(X, y)
    coefs_.append(clf["logisticregression"].coef_.ravel().copy())

coefs_ = np.array(coefs_)

Построить путь регуляризации#

import matplotlib.pyplot as plt

# Colorblind-friendly palette (IBM Color Blind Safe palette)
colors = ["#648FFF", "#785EF0", "#DC267F", "#FE6100"]

plt.figure(figsize=(10, 6))
for i in range(coefs_.shape[1]):
    plt.semilogx(cs, coefs_[:, i], marker="o", color=colors[i], label=feature_names[i])

ymin, ymax = plt.ylim()
plt.xlabel("C")
plt.ylabel("Coefficients")
plt.title("Logistic Regression Path")
plt.legend()
plt.axis("tight")
plt.show()
Logistic Regression Path

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

Связанные примеры

Коэффициенты Ridge как функция L2-регуляризации

Коэффициенты Ridge как функция L2-регуляризации

Влияние регуляризации модели на ошибку обучения и тестирования

Влияние регуляризации модели на ошибку обучения и тестирования

Построение коэффициентов Ridge как функции регуляризации

Построение коэффициентов Ridge как функции регуляризации

L1-штраф и разреженность в логистической регрессии

L1-штраф и разреженность в логистической регрессии

Галерея, созданная Sphinx-Gallery