Логистическая регрессия для решения задач классификации (пример)

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
м (Замечания)
(Исходный код)
 
(4 промежуточные версии не показаны)
Строка 144: Строка 144:
== Исходный код ==
== Исходный код ==
-
Скачать листинги алгоритмов можно [http://mlalgorithms.svn.sourceforge.net/viewvc/mlalgorithms/LogisticRegression/ здесь].
+
Скачать листинги алгоритмов можно [http://mlalgorithms.svn.sourceforge.net/svnroot/mlalgorithms/Group674/Dorofeev2009Logistic/ здесь].
== Смотри также ==
== Смотри также ==
Строка 161: Строка 161:
* [http://window.edu.ru/window_catalog/redir?id=28153&file=nsu032.pdf Н. Ибрагимов "Метод максимального правдоподобия" (сс. 78-81, 83-86)]
* [http://window.edu.ru/window_catalog/redir?id=28153&file=nsu032.pdf Н. Ибрагимов "Метод максимального правдоподобия" (сс. 78-81, 83-86)]
-
{{ЗаданиеВыполнено|Данила Дорофеев|В.В. Стрижов|28 мая 2009}}
+
{{ЗаданиеВыполнено|Данила Дорофеев|В.В. Стрижов|28 мая 2009|Danvik05|Strijov}}
-
 
+
-
== Замечания ==
+
-
<references/>
+
[[Категория:Линейные классификаторы]]
[[Категория:Линейные классификаторы]]
[[Категория:Регрессионный анализ]]
[[Категория:Регрессионный анализ]]
 +
[[Категория:Практика и вычислительные эксперименты]]

Текущая версия

Содержание

Логистическая регрессия - частный случай обобщенной линейной регрессии. Предполагается, что зависимая переменная принимает два значения и имеет биномиальное распределение.

На практике логистическая регрессия используется для решения задач классификации с линейно-разделяемыми классами.

Постановка задачи восстановления логистической регрессии

Задана выборка - множество m пар (\mathbf{x}_i,y_i), в которых описание i-го элемента \mathbf{x}_i\in\mathbb{R}^n, и значения зависимой переменной y\in\{0,1\}.

Принята модель логистической регрессии, согласно которой свободные переменные \mathbf{x} и зависимая переменная y связаны зависимостью

y=\text{logit}^{-1}(z)+\varepsilon=\frac{1}{1+\exp(-z)}+\varepsilon,

где z=w_0+\sum_{j=1}^nw_jx_j.

Примем обозначения p_i=f(\mathbf{w},\mathbf{x}_i), вектор \mathbf{w}=[w_0,\ldots,w_n]^T. Для удобства дальнейшего изложения обозначим выборку свободных переменных как

X = \left[ \begin{array}{cc}   1 & \mathbf{x}_1^T \\   \vdots & \vdots \\   1&\mathbf{x}_m^T \\ \end{array} \right].

Требуется найти такое значение вектора параметров \mathbf{w}, которое бы доставляло минимум норме вектора невязок

S = \|\mathbf{y}-\mathbf{p}\|^2 = \sum_{i=1}^m(y_i-p_i)^2.

Алгоритм отыскания оптимальных параметров

Оптимальные параметры отыскиваются последовательно с помощью итерационного итерационного взвешенного метода наименьших квадратов (IRLS) с использованием гребневой регрессии для решения проблемы мультиколлинеарности. Приведенный ниже алгоритм основан на алгоритме Ньютона-Рафсона.

В начале работы алгоритма задается начальньное приближение как решение задачи обычным МНК

\mathbf{w}=(X^TX)^{-1}X^T\mathbf{y},

Далее итеративно повторяется следующая процедура.

  • С использованием вектора параметров \mathbf{w} вычисляется переменная
    \mathbf{z}=X\mathbf{w}.
  • Вычисляется восстановленное значение выборки зависимой переменной
p=\frac{1}{1+\exp(\mathbf{-z})}.
  • Вычисляется вектор значений зависимой переменной для текущего шага линейной регрессии
\mathbf{u} = \mathbf{z} + \frac{\mathbf{y}-\mathbf{p}}{\mathbf{g}},
где

\mathbf{g} = \mathbf{p}(1-\mathbf{p}) - вектор весов значений зависимой переменной.

  • Решается задача наименьших квадратов с взвешиванием элементов выборки и регуляризацией. При этом

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

\mathbf{w} = (X^T\Gamma X+\tau E)^{-1}X^T\Gamma \mathbf{u},

где диагональная матрица весов \Gamma =\text{diag}(\mathbf{g}).

Процедура останавливается после того, как норма разности векторов параметров на каждой итерации не будет превышать заданную константу: \|\mathbf{w}^{next}-\mathbf{w}^{previuos}\|^2 \leq \Delta_{w}.

Вычислительный эксперимент

Показана работа алгоритма в серии задач, основанных как на реальных, так и на модельных данных.

Пример на реальных данных: Ирисы Фишера

Задача классификации ставится следующим образом: требуется определить принадлежность к классу Цетоза (Setosa) по длине и ширине чашелистника. Данные взяты из файла fisheriris.mat

Изображение:DemoFisherIrisLogReg.png

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

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

Модельные данные: устойчивость к шумам

Были сгенерированы 2 нормально распределённых линейно разделимых класса. На них наложен шум с большей дисперсией.

%% Create a demonstration data set
N = 100; % 1st class contains N objects
alpha = 1; % 2st class contains alpha*N ones
sig2 = 1; % assume 2nd class has the same variance as the 1st
dist2 = 6;
 
[X, y] = loadModelData(N, alpha, sig2, dist2);
% note that y contains only 1s and 0s
 
% generate noise 10%
NPart = 0.5;
clsNoise = 10 * randn(round(N*NPart), 2);
yN = 2 - randi(2, round(N*NPart), 1);
X = [X; clsNoise];
y = [y; yN];

Как видим, данный алгоритм достаточно устойчив к шумам. Классы разделены практически с максимальным зазором. Ошибки наблюдаются только в классификации выбросов. Для наглядности рядом приведен график отступов т.е. расстояния от объекта до разделяющей гипреплоскости. Если отступ отрицателен значит на объекте допущена ошибка классификации.

Модельные данные: сильно перекрывающиеся классы

%% Create a demonstration data set
 
N = 150; % 1st class contains N objects
alpha = 1; % 2st class contains alpha*N ones
sig2 = 1; % assume 2nd class has the same variance as the 1st
dist2 = 1;
 
[X, y] = loadModelData(N, alpha, sig2, dist2);
 
%% Plot the initial data
idx1 = find(y == 0); % object indices for the 1st class
idx2 = find(y == 1);
 
h = figure; hold on
plot(X(idx1,1), X(idx1,2), 'r*');
plot(X(idx2,1), X(idx2,2), 'b*');
axis tight
%close(h);
 
%% Training
w = logreglearn(X,y);
 
%% Recovering regression on the same data
p = logregmdl(w,X);
 
%%  Show the result
 
idx1 = find(p > 1/2); % object indices for the 1st class
idx2 = find(p <= 1/2);
% plot the classified data
plot(X(idx1,1), X(idx1,2), 'bo');
plot(X(idx2,1), X(idx2,2), 'ro');
 
% separation hyperplane, formed as a function (here it is a line)
separateXLim = inline( '(-b(1)- YLim*b(3))/b(2)', 'b','YLim');
% plot the hyperplane
plot(separateXLim(w,ylim), ylim, 'b-');

Алгоритм допустил около 30% ошибок классификация, но это и следовало ожидать, т.к. входные данные были принципиально линейно неразделимы. Для этого алгоритма построена ROC-кривая на этих модельных данных.

Исходный код

Скачать листинги алгоритмов можно здесь.

Смотри также

Литература


Данная статья была создана в рамках учебного задания.
Студент: Данила Дорофеев
Преподаватель: В.В. Стрижов
Срок: 28 мая 2009


В настоящее время задание завершено и проверено. Данная страница может свободно правиться другими участниками проекта MachineLearning.ru.

См. также методические указания по использованию Ресурса MachineLearning.ru в учебном процессе.

Личные инструменты