Алгоритмы классификации - логистическая регрессия
Введение в логистическую регрессию
Логистическая регрессия - это алгоритм классификации с контролируемым обучением, используемый для прогнозирования вероятности целевой переменной. Природа целевой или зависимой переменной является дихотомической, что означает, что может быть только два возможных класса.
Проще говоря, зависимая переменная является двоичной по своей природе, а данные закодированы как 1 (означает успех / да) или 0 (означает сбой / нет).
Математически модель логистической регрессии предсказывает P (Y = 1) как функцию от X. Это один из простейших алгоритмов машинного обучения, который можно использовать для различных задач классификации, таких как обнаружение спама, прогнозирование диабета, обнаружение рака и т. Д.
Типы логистической регрессии
Как правило, логистическая регрессия означает двоичную логистическую регрессию, имеющую двоичные целевые переменные, но могут быть еще две категории целевых переменных, которые можно предсказать с ее помощью. Основываясь на этом количестве категорий, логистическую регрессию можно разделить на следующие типы:
Двоичный или биномиальный
В такой классификации зависимая переменная будет иметь только два возможных типа: 1 и 0. Например, эти переменные могут представлять успех или неудачу, да или нет, победу или поражение и т. Д.
Полиномиальный
В такой классификации зависимая переменная может иметь 3 или более возможных неупорядоченных типа или типы, не имеющие количественной значимости. Например, эти переменные могут представлять «Тип A», «Тип B» или «Тип C».
Порядковый
В такой классификации зависимая переменная может иметь 3 или более возможных упорядоченных типа или типов, имеющих количественное значение. Например, эти переменные могут представлять «плохо» или «хорошо», «очень хорошо», «отлично», и каждая категория может иметь такие баллы, как 0,1,2,3.
Допущения логистической регрессии
Прежде чем погрузиться в реализацию логистической регрессии, мы должны знать о следующих предположениях о том же:
В случае бинарной логистической регрессии целевые переменные всегда должны быть бинарными, а желаемый результат представлен уровнем фактора 1.
В модели не должно быть мультиколлинеарности, что означает, что независимые переменные должны быть независимыми друг от друга.
Мы должны включить в нашу модель значимые переменные.
Мы должны выбрать большой размер выборки для логистической регрессии.
Модель бинарной логистической регрессии
Простейшей формой логистической регрессии является бинарная или биномиальная логистическая регрессия, в которой целевая или зависимая переменная может иметь только 2 возможных типа: 1 или 0. Это позволяет нам моделировать взаимосвязь между несколькими переменными-предикторами и бинарной / биномиальной целевой переменной. В случае логистической регрессии линейная функция в основном используется в качестве входных данных для другой функции, например, в следующем соотношении:
$$ h _ {\ theta} {(x)} = g (\ theta ^ {T} x) ℎ 0≤h _ {\ theta} ≤1 $$Вот логистическая или сигмовидная функция, которую можно задать следующим образом:
$$ g (z) = \ frac {1} {1 + e ^ {- z}} ℎ = \ theta ^ {T} $$Сигмовидную кривую можно представить с помощью следующего графика. Мы можем видеть, что значения оси Y лежат между 0 и 1 и пересекают ось в 0,5.
Классы можно разделить на положительные и отрицательные. Результат подпадает под класс вероятности положительного, если он лежит между 0 и 1. Для нашей реализации мы интерпретируем результат функции гипотезы как положительный, если он равен ≥0,5, в противном случае - отрицательный.
Нам также необходимо определить функцию потерь, чтобы измерить, насколько хорошо алгоритм работает с использованием весов функций, представленных тета следующим образом:
ℎ = ()
$$ J (\ theta) = \ frac {1} {m}. (- y ^ {T} log (h) - (1 -y) ^ Tlog (1-h)) $$Теперь, после определения функции потерь, наша основная цель - минимизировать функцию потерь. Это можно сделать с помощью подгонки весов, то есть увеличения или уменьшения веса. С помощью производных функции потерь по каждому весу мы сможем узнать, какие параметры должны иметь больший вес, а какие - меньший.
Следующее уравнение градиентного спуска говорит нам, как изменится потеря, если мы изменим параметры -
$$ \ frac {()} {\ theta_ {j}} = \ frac {1} {m} X ^ {T} (() -) $$Реализация на Python
Теперь мы реализуем описанную выше концепцию биномиальной логистической регрессии в Python. Для этой цели мы используем многомерный набор данных о цветах с именем «iris», который имеет 3 класса по 50 экземпляров в каждом, но мы будем использовать первые два столбца функций. Каждый класс представляет собой разновидность цветка ириса.
Во-первых, нам нужно импортировать необходимые библиотеки следующим образом:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets
Затем загрузите набор данных радужной оболочки следующим образом -
iris = datasets.load_iris()
X = iris.data[:, :2]
y = (iris.target != 0) * 1
Мы можем построить наши обучающие данные следующим образом:
plt.figure(figsize=(6, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend();
Затем мы определим сигмовидную функцию, функцию потерь и спуск градиента следующим образом:
class LogisticRegression:
def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):
self.lr = lr
self.num_iter = num_iter
self.fit_intercept = fit_intercept
self.verbose = verbose
def __add_intercept(self, X):
intercept = np.ones((X.shape[0], 1))
return np.concatenate((intercept, X), axis=1)
def __sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def __loss(self, h, y):
return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
def fit(self, X, y):
if self.fit_intercept:
X = self.__add_intercept(X)
Теперь инициализируйте веса следующим образом -
self.theta = np.zeros(X.shape[1])
for i in range(self.num_iter):
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
gradient = np.dot(X.T, (h - y)) / y.size
self.theta -= self.lr * gradient
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
loss = self.__loss(h, y)
if(self.verbose ==True and i % 10000 == 0):
print(f'loss: {loss} \t')
С помощью следующего скрипта мы можем предсказать вероятности вывода -
def predict_prob(self, X):
if self.fit_intercept:
X = self.__add_intercept(X)
return self.__sigmoid(np.dot(X, self.theta))
def predict(self, X):
return self.predict_prob(X).round()
Затем мы можем оценить модель и построить ее следующим образом:
model = LogisticRegression(lr=0.1, num_iter=300000)
preds = model.predict(X)
(preds == y).mean()
plt.figure(figsize=(10, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend()
x1_min, x1_max = X[:,0].min(), X[:,0].max(),
x2_min, x2_max = X[:,1].min(), X[:,1].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_prob(grid).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='red');
Модель полиномиальной логистической регрессии
Другой полезной формой логистической регрессии является полиномиальная логистическая регрессия, в которой целевая или зависимая переменная может иметь 3 или более возможных неупорядоченных типа, то есть типы, не имеющие количественной значимости.
Реализация на Python
Теперь мы реализуем описанную выше концепцию полиномиальной логистической регрессии в Python. Для этого мы используем набор данных из sklearn с именем digit.
Во-первых, нам нужно импортировать необходимые библиотеки следующим образом:
Import sklearn
from sklearn import datasets
from sklearn import linear_model
from sklearn import metrics
from sklearn.model_selection import train_test_split
Затем нам нужно загрузить набор цифровых данных -
digits = datasets.load_digits()
Теперь определите матрицу признаков (X) и вектор ответа (y) следующим образом:
X = digits.data
y = digits.target
С помощью следующей строки кода мы можем разделить X и y на наборы для обучения и тестирования -
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)
Теперь создайте объект логистической регрессии следующим образом:
digreg = linear_model.LogisticRegression()
Теперь нам нужно обучить модель, используя обучающие наборы следующим образом:
digreg.fit(X_train, y_train)
Затем сделайте прогнозы на тестовом наборе следующим образом:
y_pred = digreg.predict(X_test)
Затем распечатайте точность модели следующим образом -
print("Accuracy of Logistic Regression model is:",
metrics.accuracy_score(y_test, y_pred)*100)
Вывод
Accuracy of Logistic Regression model is: 95.6884561891516
Из вышеприведенного вывода мы видим, что точность нашей модели составляет около 96 процентов.