Логистическая регрессия - это классификационный алгоритм, который используется для прогнозирования вероятности некоторого события, основанного на заданном наборе признаков. В отличие от линейной регрессии, которая предсказывает непрерывное значение, логистическая регрессия выводит категориальное значение (обычно "да" или "нет").
В этой статье мы шаг за шагом рассмотрим, как реализовать логистическую регрессию с нуля с помощью Python. Мы рассмотрим основные понятия, математику и код, необходимый для построения и оценки логистической модели регрессии.
Для работы с этой статьей вам потребуются следующие предпосылки:
Математическим уравнением логистической регрессии является:
P(y = 1 | x) = 1 / (1 + e^(-β0 + β1x1 + β2x2 + ... + βnxn))
где:
Это уравнение выводит вероятность события y = 1, которая ограничена между 0 и 1. Коэффициенты модели определяют форму и наклон кривой логической функции.
Давайте теперь реализуем логистическую регрессию с нуля на Python. Мы рассмотрим следующие шаги:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
Мы импортируем необходимые библиотеки: numpy
для математических операций, pandas
для работы с данными, а train_test_split
для разделения набора данных на обучающее и тестовое множества.
Мы используем набор данных о раке молочной железы Висенсского университета для этой демонстрации. Загрузим данные и подготовим их:
data = pd.read_csv('breast_cancer.csv')
X = data.drop(['diagnosis'], axis=1)
y = data['diagnosis'].values
Мы загрузили набор данных, удалили целевой столбец (diagnosis
) и сохранили его в X
, а также сохранили целевой столбец в y
.
Теперь мы инициализируем нашу модель логической регрессии:
class LogisticRegression:
def __init__(self, learning_rate=0.01, max_iter=1000):
self.learning_rate = learning_rate
self.max_iter = max_iter
self.coefficients = np.zeros(X.shape[1])
Мы определяем класс LogisticRegression
с атрибутами learning_rate
(скорость обучения), max_iter
(максимальное число итераций) и коэффициенты модели coefficients
.
Мы определяем функцию потери как бинарную кросс-энтропию:
def loss_function(self, X, y):
m = X.shape[0]
h = self.sigmoid(np.dot(X, self.coefficients))
loss = (-1 / m) * (np.sum(y * np.log(h) + (1 - y) * np.log(1 - h)))
return loss
Мы вычисляем потерю для каждого экземпляра в наборе данных и усредняем ее по размеру выборки.
Мы используем градиентный спуск для обновления коэффициентов модели:
def gradient_descent(self, X, y):
for _ in range(self.max_iter):
gradient = (-1 / X.shape[0]) * (np.dot(X.T, (y - self.sigmoid(np.dot(X, self.coefficients))))
self.coefficients -= self.learning_rate * gradient
Мы выполняем max_iter
итераций градиентного спуска, обновляя коэффициенты на каждом шаге.
После оптимизации модели мы оцениваем ее производительность с помощью точности:
def accuracy(self, X, y):
predictions = self.predict(X)
return np.mean(predictions == y)
Мы сначала делаем прогнозы для набора данных, а затем вычисляем точность как долю правильных прогнозов.
Мы создаем экземпляр нашей модели и обучаем ее на данных:
model = LogisticRegression()
model.fit(X, y)
После обучения мы можем сделать прогнозы для новых данных:
predictions = model.predict(new_data)
Мы успешно реализовали логистическую регрессию с нуля на Python. Наш код охватывает весь процесс, от подготовки данных до оптимизации модели и оценки ее производительности. Этот подход дает гибкость и понимание того, как работает логистическая регрессия под капотом.
Помните, что оптимизация hyperparameter модели является важным шагом для достижения наилучших результатов. Дополнительные функции, такие как регуляризация, могут быть добавлены для повышения производительности модели. Рассмотрите возможность использования библиотек машинного обучения, таких как scikit-learn, для более быстрого и простого решения.