Логистическая регрессия

Логистическая регрессия — это метод статистического обучения, широко используемый для задач классификации. Несмотря на наличие "регрессии" в названии, на самом деле это алгоритм для задач бинарной или многоклассовой классификации.

Логистическая регрессия использует логистическую функцию (также называемую сигмоидной функцией) для отображения выхода линейной регрессии в диапазон от 0 до 1, тем самым предсказывая вероятность наступления определённого события.

Логистическая регрессия широко используется в различных задачах классификации, таких как:

  • Обнаружение спама (спам / не спам)
  • Прогнозирование заболеваний (заболевание / нет заболевания)
  • Прогнозирование оттока клиентов (отток / нет оттока)

Модель логистической регрессии

Функция потерь

Функция потерь логистической регрессии — это Log Loss, которая имеет следующий вид:

Решение с помощью градиентного спуска

Как и линейная регрессия, логистическая регрессия обычно также использует градиентный спуск для оптимизации функции потерь и нахождения параметров w и b. Правила обновления градиента для логистической регрессии следующие:

Путём непрерывного обновления w и b до сходимости функции потерь.


Реализация логистической регрессии на Python

Далее мы будем использовать Python и библиотеку Scikit-learn для реализации простой модели логистической регрессии.

1. Импорт необходимых библиотек

Пример

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

2. Загрузка набора данных

Мы будем использовать набор данных Iris, входящий в Scikit-learn. Набор данных Iris содержит 150 образцов, каждый с 4 признаками, и цель состоит в том, чтобы классифицировать образцы по 3 классам. Чтобы упростить задачу, мы используем только первые два признака и преобразуем задачу в задачу бинарной классификации.

Пример

# Загрузить набор данных
iris = load_iris()
X = iris.data[:, :2]  # Использовать только первые два признака
y = (iris.target != 0) * 1  # Преобразовать target в задачу бинарной классификации

# Разделить обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

3. Обучение модели логистической регрессии

Пример

# Создать модель логистической регрессии
model = LogisticRegression()

# Обучите модель
model.fit(X_train, y_train)

4. Оценка модели

Пример

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# Загрузить набор данных
iris = load_iris()
X = iris.data[:, :2]  # Использовать только первые два признака
y = (iris.target != 0) * 1  # Преобразовать target в задачу бинарной классификации

# Разделить обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)


# Создать модель логистической регрессии
model = LogisticRegression()

# Обучите модель
model.fit(X_train, y_train)

# Предсказание на тестовом наборе
y_pred = model.predict(X_test)

# Вычислите точность
accuracy = accuracy_score(y_test, y_pred)
print(f"Точность модели: {accuracy:.2f}")

# Матрица ошибок
conf_matrix = confusion_matrix(y_test, y_pred)
print("Матрица ошибок:")
print(conf_matrix)

# Отчёт о классификации
class_report = classification_report(y_test, y_pred)
print("Отчёт о классификации:")
print(class_report)

Вывод:

模型准确率: 1.00
混淆矩阵:
[[19  0]
 [ 0 26]]
分类报告:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        19
           1       1.00      1.00      1.00        26

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45

5. Визуализация границы решения

Пример

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# Загрузить набор данных
iris = load_iris()
X = iris.data[:, :2]  # Использовать только первые два признака
y = (iris.target != 0) * 1  # Преобразовать target в задачу бинарной классификации

# Разделить обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)


# Создать модель логистической регрессии
model = LogisticRegression()

# Обучите модель
model.fit(X_train, y_train)

# Предсказание на тестовом наборе
y_pred = model.predict(X_test)

# Визуализация границы решения
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
                     np.arange(y_min, y_max, 0.01))

Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
plt.xlabel('Длина чашелистика')
plt.ylabel('Ширина чашелистика')
plt.title('Граница решения логистической регрессии')
plt.show()

Отображается следующим образом:

Итог

  • Логистическая регрессия использует сигмоидную функцию для преобразования выхода линейной регрессии в значения вероятности и применяется для решения задач бинарной классификации.
  • Процесс обучения логистической регрессии оптимизирует параметры модели путем минимизации функции логарифмических потерь.
  • Градиентный спуск — часто используемый метод оптимизации для обновления параметров модели.wwиbb。
  • В Python,scikit-learnбиблиотека предоставляет простой и удобный в использовании интерфейс для реализации логистической регрессии и позволяет легко обучать, оценивать и визуализировать модели.
Другие расширения