Линейные модели для классификации: логистическая регрессия

machine learning курсы, python machine learning уроки, курсы по машинному обучению, машинное обучение python курс, предобработка данных python, нейронные сети python, machine learning курсы, задача регрессии python, Logistic Regression, Логистическая регрессия

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

Линейные модели для классификации: логистическая регрессия

В мире Data science задача классификации является одной из самых важных и распространенных задач. Ее основная цель заключается в разделении данных на классы в соответствии с заданными признаками. Линейные модели являются одним из наиболее популярных подходов к решению задачи классификации. В этой статье мы рассмотрим, как использовать линейные модели в Python для решения задачи классификации.

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

Python предоставляет множество библиотек для работы с линейными моделями. Одна из самых популярных библиотек для работы с линейными моделями в Python — это scikit-learn. Scikit-learn предоставляет множество алгоритмов машинного обучения, в том числе и линейные модели для задачи классификации. Одной из таких моделей является логистическая регрессия.

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

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

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

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

где:

Y — бинарный выходной результат (0 или 1)

X — вектор признаков, используемый для прогнозирования $Y$

P(Y=1|X) — вероятность того, что $Y$ равно 1 при заданном $X$

beta_0, beta_1, beta_2, …, beta_p — коэффициенты модели, которые нужно определить в ходе обучения, чтобы достичь наилучшего соответствия данных

e — число Эйлера

Логистическая регрессия также может быть использована для многоклассовой классификации, когда необходимо разделить данные на более чем два класса. Для этого обучают K моделей, каждая из которых отличается только целевым классом. По сути задача бинарной классификации решается несколько раз и выдается совокупное решение нескольких моделей.

В целом, логистическая регрессия — это мощный инструмент для решения задач бинарной и многоклассовой классификации в Python. Она проста в использовании и предоставляет множество метрик для оценки качества работы модели.

Машинное обучение на Python

Код курса
PYML
Ближайшая дата курса
24 февраля, 2025
Продолжительность
24 ак.часов
Стоимость обучения
54 000 руб.

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

Реализуем цикл обучения логистической регрессии используя Python. В этом нам снова поможет PyTorch. Для начала импортируем все библиотеки которые нам в этом пригодятся:

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
from sklearn.datasets import make_classification
from sklearn.metrics import classification_report

Далее напишем класс реализующий логистическую регрессию. Прошу обратить внимание, что от линейной регрессии, которую мы реализовывали в ряде предыдущих статей, отличает лишь применение сигмоиды и новый метод predict (так как теперь мы решаем задачу классификации).

class LogisticRegression(nn.Module):
    def __init__(self, input_size):
        super().__init__()
        self.weights = nn.Parameter(torch.randn(input_size, 1))
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = x @ self.weights
        x = self.sigmoid(x)
        return x

    def fit(self, X, y, lr=0.01, num_iterations=1000):
        X = torch.from_numpy(X).float()
        y = torch.from_numpy(y).float().view(-1, 1) 

        # Инициализируем функцию потерь и оптимизатор
        criterion = nn.BCELoss()
        optimizer = optim.SGD(self.parameters(), lr=lr)

        for epoch in range(num_iterations):
            # Зануляем градиенты
            optimizer.zero_grad()

            # Получаем предсказания модели и вычисляем функцию потерь
            y_pred = self(X)
            loss = criterion(y_pred, y)

            # Обновляем веса
            loss.backward()
            optimizer.step()
            

    def predict(self, X):
        X = torch.from_numpy(X).float()

        # Получаем предсказания модели и присваиваем метки классов на основе вероятности
        y_pred = self(X)
        y_pred_labels = [1 if i > 0.5 else 0 for i in y_pred.detach().numpy().flatten()]

        return y_pred_labels

На этот раз сгенерируем выборку для классификации самостоятельно, используя make_classification из библиотеки scikit-learn. А далее обучим нашу модель и оценим её качество:

# Генерируем данные
X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_informative=2,
                            random_state=1, n_clusters_per_class=1)

# Создаем экземпляр класса и обучаем на обучающей выборке
model = LogisticRegression(X.shape[1])
model.fit(X, y, lr=0.1, num_iterations=100)

# Прогнозируем метки классов на тестовой выборке
y_pred = model.predict(X)

print(classification_report(y, y_pred))

OUT:
precision    recall  f1-score   support

           0       0.85      0.96      0.90       500
           1       0.95      0.83      0.88       500

    accuracy                           0.89      1000
   macro avg       0.90      0.89      0.89      1000
weighted avg       0.90      0.89      0.89      1000

Для чистоты эксперимента обучим логистическую регрессию из библиотеки scikit-learn и увидим, что качество полученных моделей примерно одинаково:

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X, y)
y_pred = model.predict(X)

print(classification_report(y, y_pred))

OUT:
 precision    recall  f1-score   support

           0       0.90      0.90      0.90       500
           1       0.90      0.90      0.90       500

    accuracy                           0.90      1000
   macro avg       0.90      0.90      0.90      1000
weighted avg       0.90      0.90      0.90      1000

Далее давайте визуально оценим как модель принимает свое решение:

machine learning курсы, python machine learning уроки, курсы по машинному обучению, машинное обучение python курс, предобработка данных python, нейронные сети python, machine learning курсы, задача регрессии python, Logistic Regression, Логистическая регрессия

Как видим, результатом работы алгоритма выступает линия разделяющая классы. Если бы мы визуализировали модель в процессе обучения градиентным спуском, то увидели бы как эта линия подбирается в процессе оптимизации:

machine learning курсы, python machine learning уроки, курсы по машинному обучению, машинное обучение python курс, предобработка данных python, нейронные сети python, machine learning курсы, задача регрессии python, Logistic Regression, Логистическая регрессия

 

Машинное обучение на Python

Код курса
PYML
Ближайшая дата курса
24 февраля, 2025
Продолжительность
24 ак.часов
Стоимость обучения
54 000 руб.

Плюсы логистической регрессии:

  1. Это относительно простой алгоритм, который требует небольшого количества вычислительных ресурсов и может быть эффективно использован для решения большого количества задач классификации.
  2. Интерпретируемость: логистическая регрессия позволяет понимать, какие переменные влияют на классификацию и каким образом.
  3. Работает хорошо на небольших наборах данных: логистическая регрессия показывает хорошие результаты на небольших наборах данных.
  4. Небольшая вероятность переобучения: логистическая регрессия склонна к менее переобучению, поскольку она не имеет множества параметров, которые нужно оптимизировать.

Минусы логистической регрессии:

  1. Требуется нормализация признаков: логистическая регрессия требует нормализации признаков, чтобы гарантировать, что признаки вносят одинаковый вклад в модель.
  2. Работает плохо на сложных задачах:  может работать плохо на задачах с большим количеством признаков или сложной структурой данных.
  3. Линейность: логистическая регрессия работает только с линейными границами решений, что ограничивает ее способность решать сложные задачи классификации.
  4. Низкая точность: логистическая регрессия может показывать низкую точность, если классы не являются линейно разделимыми.

Если вы хотите узнать больше о машинном обучении на Python и быть в курсе новейших методов и инструментов, мы рекомендуем посетить наш лицензированный учебный центр в Москве, который специализируется на повышении квалификации ИТ-специалистов. Там вы сможете пройти практические курсы «Машинное обучение на Python«.

Источники:

  1. https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html

Записаться на курс

Смотреть раcписание

 

Добавить комментарий

Поиск по сайту