Skip to content
Dmitry Badeev edited this page Jul 3, 2024 · 50 revisions

Проект Datascience X Logistic Regression


Постановка задачи

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

При этом, необходимо:

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

  2. Создать несколько скриптов, визуализирующих ответы на следующие вопросы:

    • С помощью Гистограммы (histogram) определить, по какому учебному предмету оценки студентов имеют однородное распределение для всех четырех факультетов.
    • С помощью поиска по матрице корреляции отобразить в виде Диаграммы Рассеяния (scatter plot) учебные предметы, имеющие наибольшее сходство по оценкам у студентов.
    • С помощью визуализации Попарных Диаграмм Рассеяния (pair plot) для свойств в наборе данных, выбрать, какие из них будут использоваться при построении модели логистической регрессии.
  3. Построить, с помощью модели логистической регрессии, классификатор на основе стратегии «один-против-всех» (one-vs-all), определяющий по данным факультет на котором учится студент.

    • С помощью данных из файла dataset_train.csv, используя технику градиентного спуска (gradient descent) написать программу, обучающую модель логистической регрессии. На выходе должен быть сгенерирован файл, содержащий веса, которые будут использоваться для прогнозирования.
    • Написать программу, предсказывающую для тестовых данных на основе весов, полученных на предыдущем этапе, факультет, где обучается студент. Сохранить полученные данные в файл.
  4. Bonus:

    • Для статистического анализа (ч.1) использовать дополнительные статистические функции
    • При построении модели реализовать стохастический градиентный спуск (stochastic gradient descent)
    • При построении модели реализовать иные оптимизационные алгоритмы, например Batch GD/mini-batch GD

Замечание: Модель будет оцениваться с помощью accuracy из библиотеки Scikit-Learn. Результат работы должен иметь минимальную точность 98%.


Теория

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

Логистическая регрессия представляет собой одну из моделей, которые относятся к линейному классификатору. В методе логистической регрессии значением функции линейного классификатора является вероятность того, что данное исходное значение принадлежит к определенному классу, т.е. результат логистической регрессии всегда находится в интервале $\Large{[0,1]}$.

Уравнение линейной регрессии задается формулой

$\qquad \qquad \qquad \Large{f(w,x) = w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ ... \ + w_k \cdot x_k \qquad\qquad\qquad\qquad\qquad (1)}$,

где $\Large w_j$ — параметры (коэффициенты) регрессии, $\Large x_j$регрессоры (факторы или свойства модели), $\Large k$количество факторов (свойств) модели.

Или, если считать регрессор $\Large x_0$ константой и перенумеровать последовательность, можно записать:

$\qquad\qquad\qquad \Large f(w,x) = \sum \limits_{j=1}^{k} w_j \cdot x_j = \vec w^T \cdot \vec x$,

где $\Large \vec x = (x_1, x_2, \ ... \ , x_k)^T$ — вектор-столбец регрессоров, $\Large \vec w^T = {(w_1, w_2, \ ... \ , w_k)}$ — вектор параметров (коэффициентов).

В двумерном случае уравнение линейной регрессии имеет вид:

$\qquad\qquad\qquad \Large{f(w,x) = w_0 + w_1x_{1} + w_2x_{2}\qquad\qquad\qquad\qquad \qquad\qquad\qquad\qquad\qquad (2)}$

Прямая, определяемая уравнением $\Large{(2)}$, называется линейным дискриминантом, т.к. она является линейной с точки зрения своей функции, и позволяет модели производить разделение, дискриминацию точек на различные классы.

image

Важно: $\Large{x_1}$ и $\Large{x_2}$ являются исходными переменными, а выходная переменная не является частью исходного пространства в отличие от метода линейной регрессии.

Уравнение прямой делит плоскость на три части:

  1. Если точка $\Large{M(a,b)}$ находится под прямой, относим ее к классу $\Large{+}$. Чем больше расстояние от функции $\Large{f(w, x)}$ до точки $\Large{M(a,b)}$, тем выше вероятность $\Large{p_+}$, что точка $\Large{M(a,b)}$ принадлежит классу $\Large{+}$. Вероятность принадлежности точки $\Large{M(a,b)}$ классу $\Large{+}$ находится в диапазоне $\Large{(0.5,1]}$.
  2. Если точка $\Large{M(a,b)}$ находится над прямой, относим ее к классу $\Large{-}$. Чем больше расстояние от функции $\Large{f(w, x)}$ до точки $\Large{M(a,b)}$, тем выше вероятность, что точка $\Large{M(a,b)}$ принадлежит классу $\Large{-}$. Вероятность $\Large{p_+}$ принадлежности точки $\Large{M(a,b)}$ классу $\Large{-}$ находится в диапазоне $\Large{[0, 0.5)}$.
  3. Если точка $\Large{M(a,b)}$ находится на прямой $\Large{f(w, x)}$, относим ее к классу $\Large{0}$. Вероятность $\Large{p_+}$ принадлежности точки $\Large{M(a,b)}$ классу $\Large{0}$ равно $\Large{0.5}$

На рисунке выше, нижняя зеленая точка имеет бОльшую вероятность принадлежности классу $\Large{+}$, чем верхняя зеленая точка. Красный квадратик имеет вероятность принадлежности классу $\Large{-}$ немного меньше $\Large{0.5}$.

От вероятности к бесконечности и обратно. Преобразования функции линейной регрессии в функцию логистического отклика

Преобразуем функцию линейной регрессии $\Large{f(w,x) = \vec{w}^T \vec{x}}$ в функцию логистического отклика $\Large{\sigma(\vec{w}^T \vec{x_i}) = \frac{1}{1+e^{-\vec{w}^T \vec{x}}}}$, чтобы совершив обратное преобразование, научиться по значению события предсказывать вероятность его принадлежности тому или иному классу.

Т.е. предстоит проделать путь Вероятность $\Large{[0,1]}$Шансы $\Large{[0,+\infty)}$$\Large{(-\infty,+\infty)}$Шансы $\Large{[0,+\infty)}$Вероятность $\Large{[0,1]}$.

Вероятность $\Large{[0,1]}$Шансы $\Large{[0,+\infty)}$
Пусть $\Large{p(X)}$— вероятность наступления события $\Large{X}$. Значения $\Large{p(X)}$ лежат в диапазоне $\Large{[0,1]}$.

Шансы $\Large{odds_+(X)}$ — это вероятность наступления события $\Large{X}$, деленная на вероятность того, что событие не произойдет. Формула шанса наступления события:

$\qquad\qquad\qquad \Large{odds_+(X) = \frac{p(X)}{1-p(X)}}$, где

$\Large{p(X)}$ — вероятность наступления события $\Large{X}$, $\Large{1 - p(X)}$ — вероятность НЕ наступления события $\Large{X}$.

Значения $\Large{odds_+(X)}$ лежат в диапазоне $\Large{[0,+\infty)}$.

Пример: Выражение ”Шансы 4 к 1”, эквивалентно отношению $\Large \frac{\frac{4}{4+1}}{1 - {\frac{4}{4+1}}} = \frac {0.8} {0.2} = \frac {4} {1}$

Выведем Обратную функцию шансов: Сначала представим Вероятность наступления события $\Large{X}$ через Шансы наступления события $\Large{X}:$

$\qquad\qquad\qquad \Large{p(X) = \frac{p(X)} {1-p(X) }:\frac{1}{1-p(X)} = \frac{p(X)} {1-p(X)}:\frac{1 - p(X) + p(X)}{1-p(X)} = \frac{p(X)} {1-p(X)}:(1 + \frac{p(X)}{1-p(X)}) = \frac{odds(X)}{1+odds(X)}\qquad\qquad(3)}$

Таким образом получили формулу представления вероятности из диапазона $\Large{[0,1]}$ через шансы из диапазона $\Large{[0,+\infty)}$.

Вероятность $\Large{[0,1]}$Шансы $\Large{[0,+\infty)}$$\Large{(-\infty,+\infty)}$

Теперь представим Вероятности через компоненты с диапазоном $\Large (-\infty,+\infty)$.

Прологарифмировав шансы $\Large{odds_+(X)}$ по основанию $\Large e$, получим логарифм отношения шансов $\Large{ln(odds_+(X))}$.

Значения $\Large{ln(odds_+(X))}$ лежат в диапазоне $\Large{(-\infty,+\infty)}$.

Таким образом, получен способ интерпретации результатов, подставленных в граничную функцию исходных значений. В используемой модели граничная функция определяет логарифм отношения шансов класса $\Large{+}$ .

$\Large{(-\infty,+\infty)}$Шансы $\Large{[0,+\infty)}$Вероятность $\Large{[0,1]}$
Теперь в обратную сторону, от бесконечности к вероятности.

$\qquad\qquad\qquad \Large{f(w,x)=\vec{w}^T\vec{x}=ln(odds_+)}$

Т.е. зная значение функции $\Large{f(w,x)}$, можно вычислить Шансы:

$\qquad\qquad\qquad \Large{odds_+(X) = e^{f(w,x)} = e^{\vec{w}^T\vec{x}}\qquad\qquad\qquad\qquad\qquad\qquad (4)}$

Подставляя в $\Large {(3)}$, получаем:

$\qquad\qquad\qquad \Large{p(X) = \frac{e^{\vec{w}^T\vec{x}}}{1+e^{\vec{w}^T\vec{x}}} = \frac{1}{1+e^{-\vec{w}^T\vec{x}}} = \sigma(\vec{w}^T\vec{x})}$

Получили выражение вероятности наступления cобытия через функцию логистического отклика или сигмоид-функцию.

image

Функция потерь логистической регрессии

Для функции потерь использовать $\Large MSE$, как это делалось в линейной регрессии не получится, т.к. сигмоида - нелинейная функция и, если ее поместить в $\Large MSE$, то на выходе получится невыпуклая (non-convex) функция с неоднозначным минимумом.

image

$\qquad\qquad\qquad\qquad\qquad$ Сравнение выпуклой и невыпуклой функции


Вместо $\Large MSE$ в качестве функции потерь будет использоваться функция логистической ошибки, или функция бинарной кросс-энтропии (log loss, binary cross-entropy loss).

image


Наша модель $\Large p(X)$ может выдавать значения из диапазона $\Large{[0,1]}$, фактическое же значение будет одно из $\Large{(0,1)}$. Т.е., если истинное значение для эксперимента известно как $\Large 1$, то ошибка по результату нашей модели вычисляется по синей ветви. И, чем ближе выдаваемая моделью вероятность к единице, тем меньше ошибка. Для истинного значения $\Large 0$ ошибка аналогично вычисляется по оранжевой ветви.

Таким образом, функцию потерь $\Large J(w)$ можно записать так:

image

Или, одной строкой:

$\Large J(w) = -\frac{1}{n} \sum y \cdot log(p(x)) + (1-y) \cdot log(1-p(x))$, где $\Large n$ - число экспериментов.

Наша цель - подобрать коэффициенты (параметры) $\Large w$ таким образом, чтобы функция потерь $\Large J(w) \rightarrow min$. Как и для решения задачи линейной регрессии, для нахождения минимума, воспользуемся методом градиентного спуска.
Т.е. зафиксировав некоторые начальные коэффициенты (параметры) $\Large w$, будем двигаться по функции потерь $\Large J(w)$ в направлении антиградиента (т.е. уменьшения функции) к минимуму, на каждом шаге изменяя новые коэффициенты (параметры) $\Large w$ на небольшие значения.
Как было указано выше, ввиду выпуклости, мы гарантировали, что желанный минимум у функции потерь - единственный.

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

Запишем $\Large J(w)$ в следующем виде:

$\Large J = y \cdot log(h) + (1-y) \cdot log(1-h)$, где $\Large h = 1 / (1 + e^{-z})$, $\Large z(w)$ - линейная функция регрессора $\Large x$.

Таким образом, мы ищем производную $\Large \frac{\partial J}{\partial w} = \frac{\partial J}{\partial h} \cdot \frac{\partial h}{\partial z} \cdot \frac{\partial z}{\partial w}$

  1. Считаем первый сомножитель $\Large {\frac{\partial J}{\partial h}}$

Воспользуемся формулой $\Large (ln (x))'_x = \frac{1}{x}$

$\Large x, y$ - константы. Поэтому

$\Large (y \cdot log(h) + (1-y) \cdot log(1-h))'_h = y \cdot (log(h))'_h + (1-y) \cdot (log(1-h))'_h \Longrightarrow$

$\qquad\qquad$ image

$\Large \Longrightarrow \frac {y}{h} - \frac{1 - y}{1 - h} = \frac {y - h}{h \cdot (1 - h)}$

  1. Считаем второй сомножитель $\Large \frac{\partial h}{\partial z}$
image

$\qquad\qquad\ \Large {{((1+e^{-z})}^{-1})}'_{(1+e^{-z})} = - \frac {1}{(1+e^{-z})^2};$

$\qquad\qquad$ image

$\Large \Longrightarrow - \frac {1}{(1+e^{-z})^2} \cdot (- e^{-z}) = \frac {e^{-z}}{(1+e^{-z})^2} = \frac{1}{1+e^{-z}} \cdot \frac{e^{-z}}{1+e^{-z}} = \frac{1}{1+e^{-z}} \cdot \frac{(1+e^{-z})-1}{1+e^{-z}} =$
$\Large = \frac{1}{1+e^{-z}} \cdot \left( \frac{1+e^{-z}}{1+e^{-z}}-\frac{1}{1+e^{-z}} \right) = \frac{1}{1+e^{-z}} \cdot \left( 1-\frac{1}{1+e^{-z}} \right)$

Вспоминаем, что $\Large h = 1 / (1 + e^{-z})$. Окончательно для второго сомножителя получаем:

$\Large h \cdot (1-h)$

  1. Считаем третий сомножитель $\Large \frac{\partial z}{\partial w}$

Поскольку $\Large z(w)$ - линейная функция регрессора $\Large x$, $\Large \frac{\partial z}{\partial w} = x$


Перемножив найденные производные получим градиент по каждому из признаков $\Large j$ для $\Large n$ наблюдений:

$\qquad\qquad\ \Large \frac{\partial J}{\partial w} = (\frac{y-h}{h \cdot(1-h)}) \cdot (h \cdot (1-h)) \cdot x_j \cdot \frac{1}{n} = x_j \cdot (y-h) \cdot \frac{1}{n}$

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

$\qquad\qquad\ \Large \nabla J = X^T(h(X)-y) \times \frac{1}{n}$

Теперь можно переходить к Решению.


Решение

Статистический анализ данных

Набор статистических характеристик свойств объектов подробно описан в документации.
Ниже - статистическая информация по некоторым свойствам объектов из файла datasets/dataset-train.csv

image

Визуализация - Гистограмма

Результат работы программы histogram.py - гистограмма распределений оценок по предметам на каждом факультете.

image

Анализ гистограмм позволяет сделать вывод о гомогенном распределении оценок по предметам Arithmancy и Care of Magical Creatures.

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

Визуализация - Диаграммы Рассеяния (scatter plot)

В программе scatter_plot.py подсчитывается корреляция по оценкам учебных предметов у студентов и выбирается пара с максимальной похожестью.
Наибольшее сходство отображено на представленной Диаграмме Рассеяния (scatter plot).

image
Т.е. отметки студентов по предметам Astronomy и Defence Against the Dark Arts оказались коллинеарны.

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

Визуализация - Попарные Диаграммы Рассеяния (pair plot)

В программе pair_plot.py подсчитывается попарная корреляция по оценкам студентов между всеми учебными предметами и строятся графики.
Результат представлен на рисунке, где изображены все Попарные Диаграммы Рассеяния (pair plot).

image

По диаграммам видно, что предыдущие выводы подтверждаются - как по предметам Arithmancy и Care of Magical Creatures (диагональные рисунки), так и по предметам Astronomy и Defence Against the Dark Arts, диаграммы для которых явно выделяются среди остальных попарных диаграмм.

Построение модели

Для построения модели в столбце Best Hand значения меняются на числовые, исключаются столбцы, содержащие нечисловые данные (First Name, Last Name, Birthday). Также исключаются признанные неинформативными Arithmancy, Care of Magical Creatures и Astronomy (коллинеарный Defence Against the Dark Arts остается в качестве значимого признака).

В итоге, модель логистической регрессии будет строиться по оставшимся 12 признакам.

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

И для значений каждого столбца с помощью функции minmax производится регуляризация: $\Large x_{new} = (x - min) / (max - min)$

Кроме того, добавляется bias - столбец $\Large w_0$ со значениями равными $\Large 1$.

Затем, для предсказания принадлежности студентов по их данным по каждому из четырех факультету строится модель (вычисляются параметры (коэффициенты) регрессии $\Large w_i$ в формуле $\Large (1)$ ).

Перед тренировкой модели веса инициализируются небольшими случайными значениями из интервала $\Large [-0.1, 0.1]$

Данные из тренировочного набора для итеративного градиентного спуска функции логистической регрессии к минимуму могут подаваться одним из выбранных пользователей способов: с помощью batch, mini-batch, sgd.
При batch потери (loss) в зависимости от эпох уменьшаются равномерно, поскольку все градиенты обучающих данных усредняются за один шаг.
Потери (loss) при mini-batch градиентном спуске подвержены бОльшим колебаниям, поскольку одновременно усредняется небольшое количество данных.
При стохастическом градиентном спуске (SGD) рассматривается всего одно значение данных, выбранное случайно. График потерь (loss), как и в случае mini-batch гладкостью не отличаются.

Замечание: Для больших данных используются именно sgd и mini-batch, поскольку с количеством эпох сходимость функции потерь к минимуму для всех методов примерно схожа, но количество вычислений для последних двух существенно меньше.

На рисунке ниже приведен пример работы программы logreg_train.py с параметром -d отражения основных этапов работы.
Для градиентного спуска использовался batch , количество эпох epochs = 5000.

При тренировки модели использовалась стратегия «один-против-всех»: в цикле для каждого из факультетов присваиваивалась $\Large 1$ для значений текущего класса и $\Large 0$ для всех остальных. Т.е. для каждого шага цикла получалась задача бинарной классификации.

image

Для каждой модели указаны промежутчные значения Loss и Accuracy, а также приведены значения получившихся весов (параметров (коэффициентов) регрессии).
По окончании работы программы, значения весов записываются в файл datasets/weights.csv. Они будут использоваться на этапе предсказания по тестовым данным факультета на котором учится студент.

Предсказания модели

Для получения предсказаний, запускается программа logreg_predict.py с параметрами файла данных и файла весов.

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

image

Полученные результаты сохраняются в файл datasets/dataset_test.csv для дальнейшего анализа.

Оценка результата

Результат оценки качества модели представлен ниже:

image