Логистическая регрессия: вычисления на Python

Что такое регрессия?

Классификаци при помощи логистической регрессии на Python

Регрессия в анализе данных — попытка выделить в них какую-либо аналитическую модель зависимости, что предполагает сведение данных к небольшому числу параметров модели. Гораздо удобней иметь дело с небольшим числом параметров, нежели с огромным массивом исходных данных; более того, построенная аналитическая модель может служить отправной точкой для построения прогнозов.

Например, имеется множество измерений \(x_i, y_i\), \(i=\overline{1,\ldots,N}\), которые можно представить точками на плоскости; поставим задачу отыскания такой прямой, которая  «наилучшим» образом характеризует зависимость между \(x_i\) и \(y_i\). Требование «наилучшего» в этом случае нуждается в разъяснении. Крайне маловероятно, что все точки будут одновременно принадлежать прямой, поэтому, как правило, понятие «наилучшей», предполагает отыскание такой прямой, сумма квадратов расстояний от которой до точек минимальна. Такая прямая проходит максимально близко ко всем точкам одновременно. Это по сути регрессионная задача, итогом решения которой являются параметры прямой (\(y=k\cdot x + b\)). Таким образом, большой набор значений сводится к модели данных, представляемой в виде двух параметров прямой -  углового коэффициента  (\(k\)) и параметра (\(b\)) вертикального ее смещения.

 

Многообразие регрессионных моделей определяется выбором ее аналитического вида (линейная, нелинейная), набором параметров, критериями построения оценок параметров по исходным данным. Рассмотренный пример  нахождения прямой — двухпараметрическая задача линейной регрессии (в случае минимизации квадратов расстояний до точек соответствует методу главных компонент).

Независимо от выбираемой аналитической модели и критерия для оценки ее параметров,  назначение регрессии — сведение исходного набора данных к малому числу количественных характеристик и построение им (данным) наилучшего аналитического приближения.

Рассмотрим один из видов регрессии — логистическую регрессию, целью которой является построение модели распределения вероятностей для случая, когда зависимая переменная (моделируемое значение, или (аналог переменной \(y\) в линейной модели) может принимать два значения 0 или 1.

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

Формулировка задачи.

Имеется набор данных \( (y_i, x_i)\), где \(x_i \in R^n\) - т. е. являются векторами в n-мерном числовом пространстве; \(y_i =  {0, 1}\) - допустимые значения зависимой переменной. Необходимо построить модель распределения значений \(y\) в многомерном пространстве \(R^n\); иными словами, исходя из имеющихся данных, необходимо восстановить распределение вероятностей \(P_y(x)\).
 
Если \(P_{y=0}(x) \) известна, то \( P_{y=1}(x) = 1-P_{y=0}(x) \), так как \(y\) может принимать только значения 0 или 1.

Дальнейшие шаги в восстановлении распределения состоят в выборе модели для  \(P_{y=0}(x) \). Кривая логистического роста $$f(x) = \frac{1}{1+e^{-x}}$$ вполне удовлетворяет требованиям, накладываемым на функции распределения вероятностей; нужно однако несколько изменить ее вид, добавив для гибкости параметры, которые будут оцениваться по набору данных.  Вполне естественным шагом «добавления» в модель параметров, является использование их линейной комбинации.
Таким образом, приходим к задаче логистической регрессии: необходимо оценить параметры (\(w_1,\ldots, w_n, c\)) для модели $$ P_{y=0}(x) = f(x) = \frac{1}{1+e^{w^T x + c}}, P_{y=1}(x) = 1-f(x),$$ где \(w^T+c = w_1\cdot x_1 + w_2\cdot x_2 + \ldots + w_n\cdot x_n +c\), исходя из наблюдаемых данных.

Для оценки параметров в таких задачах обычно используют метод максимального правдоподобия: его суть заключается в том, что параметры \(w_i, c\)  должны выбираться таким образом, что в случае подстановки наблюдаемых данных в модель, обеспечивалась максимальная вероятность осуществления события, которое соответствует наблюдаемым данным. В случае равноправных измерений, такое условие должно одновременно распространяться на все наблюдаемые данные. Требование одновременной оптимизации \(P_{y_i=0}(x_i, w, c)\) для всего набора данных нередко записывают как задачу оптимизации произведения значений модельных вероятностей. Произведение с одной стороны отражает «одновременность» оптимальности для всех данных, а с другой может быть очень удобно в случае моделей, содержащих экспоненту: в этом случае путем логарифмирования (операции не влияющей на результат) оптимизация произведения может быть сведена к оптимизации суммы логарифмов составляющих, а взятие логарифмов от экспонент приводит к существенному упрощению задачи.

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

Классификация с помощью логистической регрессии: пример на Python и Scikit-Learn

Рассмотрим пример построения оценок вероятностей принадлежности точек факторного пространства двум классам для специально сгенерированных данных.

# coding: utf8

import numpy as np
from pylab import *
from sklearn import linear_model


# Для вопроизодимости результатов, зависящих от генератора случайных чисел
np.random.seed(1000)


# Настройка шрифтов для будущих графиков
rcParams['font.family'] = 'DejaVu Sans' # Понимает русские буквы
rcParams['font.size'] = 16


# ---------------- Создание модельных данных  -----------------------
mean1 = [0.5, 2]

cov1 = [[1, 1.1], [-1.1, 1]]

mean2 = [2.3, -0.5]
cov2 = [[1.3, -1.5], [1.5, 1.6]]


# Данные первого класса
data1 = np.random.multivariate_normal(mean1, cov1, 100)
# Данные второго класса
data2 = np.random.multivariate_normal(mean2, cov2, 100)

# -------------------------------------------------------------------

После того, как обучающая выборка сгенерирована (100 точек класса 0, и 100 точек класса 1), воспользуемся функцией выполнения логистической регрессии из пакета Scikit-Learn.

# Формируем обучающую выборку
X = np.vstack([data1, data2])
# Групповая переменная
Y = [0]*len(data1) + [1]*len(data2)


# Настраиваем модель логистической регрессии
logreg = linear_model.LogisticRegression(C=1e5)
logreg.fit(X, Y)


# Массив точек для классификации и последующей заливки в соотвтетсвии с классом
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))

# Выполнение классификации каждой точки массива
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])

# логарифмы вероятностей принадлежности к классам
probabilities = logreg.predict_log_proba(np.c_[xx.ravel(), yy.ravel()])


# преобразование формата (как требует pcolormesh)
Z = Z.reshape(xx.shape)
p1 = probabilities[:,0].reshape(xx.shape)
p2 = probabilities[:,1].reshape(xx.shape)

И, наконец,  финальный этап — отрисовка результатов классификации и оценок вероятностей принадлежности классам.

# Отрисовка результатов классификации и оценок вероятностей

title(u'Результаты классификации')
plot(data1[:, 0], data1[:, 1], 'oy')
plot(data2[:, 0], data2[:, 1], 'sc')
pcolormesh(xx, yy, Z, cmap='RdYlBu')
gca().set_xlim([x_min, x_max])
gca().set_ylim([y_min, y_max])


figure()
title(u'Лог-Вероятности класса 1')
pcolormesh(xx, yy, p1, cmap='cool')
colorbar()
gca().set_xlim([x_min, x_max])
gca().set_ylim([y_min, y_max])


figure()
title(u'Лог-Вероятности класса 2')
pcolormesh(xx, yy, p2, cmap='cool')
colorbar()
gca().set_xlim([x_min, x_max])
gca().set_ylim([y_min, y_max])


show()
Python, Логистическая регрессия: результаты классификации

Классификация каждой из точек двумерного факторного пространства позволила визуализировать области принятия решений (отнесения объекта к первому, либо второму классу).

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

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

Оценка вероятности принадлежности к классу Оценка вероятности принадлежности к классу

Логистическая регрессия: вычисления на Python, Scikit-Learn (2,7 KB)

blog comments powered by Disqus