Рубрики

Понимание логистической регрессии

Предварительное условие: линейная регрессия
В этой статье рассматриваются основы логистической регрессии и ее реализация в Python. Логистическая регрессия — это в основном контролируемый алгоритм классификации. В задаче классификации целевая переменная (или выход), y, может принимать только дискретные значения для данного набора признаков (или входов), X.

Вопреки распространенному мнению, логистическая регрессия является регрессионной моделью. Модель строит регрессионную модель для прогнозирования вероятности того, что данная запись данных принадлежит категории, обозначенной как «1». Точно так же, как Линейная регрессия предполагает, что данные следуют линейной функции, Логистическая регрессия моделирует данные с использованием сигмоидальной функции.

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

Решение о значении порогового значения в основном зависит от значений точности и отзыва. В идеале мы хотим, чтобы и точность, и отзыв были равны 1, но это редко имеет место. В случае компромисса Precision-Recall мы используем следующие аргументы, чтобы принять решение о пороге:

1. Низкая точность / высокая степень повторного вызова. В тех случаях, когда мы хотим уменьшить количество ложных отрицательных результатов без необходимости уменьшения количества ложных положительных результатов, мы выбираем значение решения, которое имеет низкое значение точности или высокое значение повторного вызова. Например, при диагностике рака мы не хотим, чтобы какой-либо больной пациент классифицировался как не затронутый, не обращая особого внимания на то, если у пациента ошибочно поставлен диагноз рака. Это связано с тем, что отсутствие рака можно обнаружить по другим медицинским заболеваниям, но наличие заболевания нельзя обнаружить у уже отклоненного кандидата.

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

Исходя из количества категорий, логистическая регрессия может быть классифицирована как:

  1. binomial: целевая переменная может иметь только 2 возможных типа: «0» или «1», которые могут представлять «выигрыш» против «проигрыша», «пас» против «неудачи», «мертвый» против «живого» и т. д.
  2. полиномиальная: целевая переменная может иметь 3 или более возможных типа, которые не упорядочены (то есть типы не имеют количественного значения), такие как «болезнь A» против «болезнь B» против «болезнь C».
  3. порядковый номер: он имеет дело с целевыми переменными с упорядоченными категориями. Например, результат теста можно отнести к категории: «очень плохой», «плохой», «хороший», «очень хороший». Здесь каждой категории можно присвоить оценку, например, 0, 1, 2, 3.

Прежде всего, мы исследуем простейшую форму логистической регрессии, то есть биномиальную логистическую регрессию .

Биномиальная логистическая регрессия

Рассмотрим пример набора данных, который сопоставляет количество часов обучения с результатами экзамена. Результат может принимать только два значения: прошло (1) или не удалось (0):

Hours(x)0.500.751.001.251.501.752.002.252.502.753.003.253.503.754.004.254.504.755.005.50
Pass(y)00000010101010111111

Итак, мы имеем

т.е. y является категориальной целевой переменной, которая может принимать только два возможных типа: «0» или «1».
Чтобы обобщить нашу модель, мы предполагаем, что:

  • Набор данных имеет переменные функции «p» и наблюдения «n».
  • Матрица объектов представлена в виде:

    Вот, обозначает значения особенность для наблюдение.
    Здесь мы придерживаемся соглашения о = 1. (Продолжайте читать, через несколько минут вы поймете логику).
  • наблюдение, , может быть представлен как:
  • представляет прогнозируемый ответ для наблюдение, т.е. , Формула, которую мы используем для расчета называется гипотеза .

Если вы прошли через линейную регрессию, вы должны помнить, что в линейной регрессии гипотеза, которую мы использовали для предсказания, была:

где, являются коэффициентами регрессии.
Пусть коэффициент регрессии матрица / вектор, быть:

Затем, в более компактной форме,

The reason for taking = 1 is pretty clear now.
We needed to do a matrix product, but there was no
actual multiplied to in original hypothesis formula. So, we defined = 1.

Теперь, если мы попытаемся применить линейную регрессию к вышеуказанной проблеме, мы, вероятно, получим непрерывные значения, используя гипотезу, которую мы обсуждали выше. Кроме того, это не имеет смысла для принимать значения больше 1 или меньше 0.
Итак, внесены некоторые изменения в гипотезу для классификации:

где,

называется логистической функцией или сигмовидной функцией .
Вот график, показывающий g (z):

Из приведенного выше графика можно сделать вывод, что:

  • g (z) стремится к 1 как
  • g (z) стремится к 0 как
  • g (z) всегда ограничено между 0 и 1

Итак, теперь мы можем определить условные вероятности для 2 меток (0 и 1) для наблюдение как:

Мы можем написать это более компактно как:

Теперь мы определяем еще один термин, вероятность параметров как:

Likelihood is nothing but the probability of data(training examples), given a model and specific parameter values(here, ). It measures the support provided by the data for each possible value of the . We obtain it by multiplying all for given .

А для более простых расчетов мы берем логарифмическую вероятность :

Функция стоимости для логистической регрессии пропорциональна обратной вероятности параметров. Следовательно, мы можем получить выражение для функции стоимости J, используя логарифмическое уравнение правдоподобия как:

и наша цель состоит в том, чтобы оценить так что функция стоимости минимизирована !!

Использование алгоритма градиентного спуска

Во-первых, мы берем частные производные по каждому для получения правила стохастического градиентного спуска (здесь мы представляем только окончательное производное значение):

Здесь y и h (x) представляют вектор ответа и предсказанный вектор ответа (соответственно). Также, вектор, представляющий значения наблюдения для особенность.
Теперь, чтобы получить мин ,

где называется скоростью обучения и должна быть установлена явно.
Давайте посмотрим реализацию вышеописанной техники на Python на примере набора данных (загрузите его отсюда ):

2,25 2,50 2,75 3,00 3,25 3,50 3,75 4,00 4,25 4,50 4,75 5,00 5,50

import csv

import numpy as np

import matplotlib.pyplot as plt

  

  

def loadCSV(filename):

    «»»

    функция для загрузки набора данных

    «»»

    with open(filename,"r") as csvfile:

        lines = csv.reader(csvfile)

        dataset = list(lines)

        for i in range(len(dataset)):

            dataset[i] = [float(x) for x in dataset[i]]     

    return np.array(dataset)

  

  

def normalize(X):

    «»»

    функция нормализации матрицы элементов, X

    «»»

    mins = np.min(X, axis = 0)

    maxs = np.max(X, axis = 0)

    rng = maxs - mins

    norm_X = 1 - ((maxs - X)/rng)

    return norm_X

  

  

def logistic_func(beta, X):

    «»»

    логистическая (сигмоидальная) функция

    «»»

    return 1.0/(1 + np.exp(-np.dot(X, beta.T)))

  

  

def log_gradient(beta, X, y):

    «»»

    функция логистического градиента

    «»»

    first_calc = logistic_func(beta, X) - y.reshape(X.shape[0], -1)

    final_calc = np.dot(first_calc.T, X)

    return final_calc

  

  

def cost_func(beta, X, y):

    «»»

    функция стоимости, Дж

    «»»

    log_func_v = logistic_func(beta, X)

    y = np.squeeze(y)

    step1 = y * np.log(log_func_v)

    step2 = (1 - y) * np.log(1 - log_func_v)

    final = -step1 - step2

    return np.mean(final)

  

  

def grad_desc(X, y, beta, lr=.01, converge_change=.001):

    «»»

    функция градиентного спуска

    «»»

    cost = cost_func(beta, X, y)

    change_cost = 1

    num_iter = 1

      

    while(change_cost > converge_change):

        old_cost = cost

        beta = beta - (lr * log_gradient(beta, X, y))

        cost = cost_func(beta, X, y)

        change_cost = old_cost - cost

        num_iter += 1

      

    return beta, num_iter 

  

  

def pred_values(beta, X):

    «»»

    функция для прогнозирования меток

    «»»

    pred_prob = logistic_func(beta, X)

    pred_value = np.where(pred_prob >= .5, 1, 0)

    return np.squeeze(pred_value)

  

  

def plot_reg(X, y, beta):

    «»»

    функция для построения границы решения

    «»»

    # помеченные наблюдения

    x_0 = X[np.where(y == 0.0)]

    x_1 = X[np.where(y == 1.0)]

      

    # построение точек с цветом diff для метки diff

    plt.scatter([x_0[:, 1]], [x_0[:, 2]], c='b', label='y = 0')

    plt.scatter([x_1[:, 1]], [x_1[:, 2]], c='r', label='y = 1')

      

    # построение границы решения

    x1 = np.arange(0, 1, 0.1)

    x2 = -(beta[0,0] + beta[0,1]*x1)/beta[0,2]

    plt.plot(x1, x2, c='k', label='reg line')

  

    plt.xlabel('x1')

    plt.ylabel('x2')

    plt.legend()

    plt.show()

      

  

      

if __name__ == "__main__":

    # загрузить набор данных

    dataset = loadCSV('dataset1.csv')

      

    # нормализующая матрица признаков

    X = normalize(dataset[:, :-1])

      

    # укладка столбцов со всеми в матрице объектов

    X = np.hstack((np.matrix(np.ones(X.shape[0])).T, X))

  

    # вектор ответа

    y = dataset[:, -1]

  

    # начальные бета-значения

    beta = np.matrix(np.zeros(X.shape[1]))

  

    # бета-значения после запуска градиентного спуска

    beta, num_iter = grad_desc(X, y, beta)

  

    # оценочные значения бета и количество итераций

    print("Estimated regression coefficients:", beta)

    print("No. of iterations:", num_iter)

  

    # предсказанные метки

    y_pred = pred_values(beta, X)

      

    # количество правильно предсказанных меток

    print("Correctly predicted labels:", np.sum(y == y_pred))

      

    # построение линии регрессии

    plot_reg(X, y, beta)

Estimated regression coefficients: [[  1.70474504  15.04062212 -20.47216021]]
No. of iterations: 2612
Correctly predicted labels: 100


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

  • BFGS (алгоритм Бройдена – Флетчера – Гольдфарба – Шанно)
  • L-BFGS (как BFGS, но использует ограниченную память)
  • Сопряженный градиент

Преимущества / недостатки использования любого из этих алгоритмов по сравнению с градиентным спуском:

  • преимущества
    • Не нужно выбирать скорость обучения
    • Часто бегают быстрее (не всегда так)
    • Может численно приблизить градиент для вас (не всегда хорошо работает)
  • Недостатки
    • Более сложный
    • Больше черного ящика, если вы не изучите специфику

Полиномиальная логистическая регрессия

В многочленной логистической регрессии выходная переменная может иметь более двух возможных дискретных выходов . Рассмотрим набор данных цифр . Здесь выходной переменной является цифровое значение, которое может принимать значения из (0, 12, 3, 4, 5, 6, 7, 8, 9).
Ниже приведена реализация полиномиальной логистической регрессии с использованием scikit-learn для прогнозирования набора цифр.

from sklearn import datasets, linear_model, metrics

   
# загрузить набор цифр

digits = datasets.load_digits()

   
# определение матрицы признаков (X) и вектора ответа (y)

X = digits.data

y = digits.target

  
# разбиение X и Y на обучающие и тестовые наборы

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4,

                                                    random_state=1)

   
# создать объект логистической регрессии

reg = linear_model.LogisticRegression()

   
# обучаем модель с использованием тренировочных наборов
reg.fit(X_train, y_train)

  
# делать прогнозы на тестовом наборе

y_pred = reg.predict(X_test)

   
# сравнение фактических значений ответа (y_test) с предсказанными значениями ответа (y_pred)

print("Logistic Regression model accuracy(in %):"

metrics.accuracy_score(y_test, y_pred)*100)

Logistic Regression model accuracy(in %): 95.6884561892

Наконец, вот несколько моментов о логистической регрессии, над которыми стоит задуматься:

  • НЕ предполагает линейную связь между зависимой переменной и независимыми переменными, но она предполагает линейную связь между логитом объясняющих переменных и ответом .
  • Независимыми переменными могут быть даже степенные члены или некоторые другие нелинейные преобразования исходных независимых переменных.
  • Зависимая переменная НЕ нуждается в нормальном распределении, но обычно она предполагает распределение из экспоненциального семейства (например, биномиальное, пуассоновское, полиномиальное, нормальное и т. Д.); бинарная логистическая регрессия предполагает биномиальное распределение ответа.
  • Однородность дисперсии не должна быть удовлетворена.
  • Ошибки должны быть независимыми, но НЕ распространяться нормально.
  • Он использует оценку максимального правдоподобия (MLE), а не обычные наименьшие квадраты (OLS) для оценки параметров и, таким образом, опирается на приближения большой выборки .

Ссылки:

Эта статья предоставлена Нихилом Кумаром . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Понимание логистической регрессии

0.00 (0%) 0 votes