для чего используется логистическая регрессия

Алгоритмы машинного обучения простым языком. Часть 3

для чего используется логистическая регрессия

Jun 8, 2019 · 5 min read

для чего используется логистическая регрессия

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

Итак, мы уже познакомились с линейной регрессией. Она определяла влияние переменных на другую переменную при условии, что: 1) результирующая переменная непрерывна и 2) отношение между независимыми переменными и результирующей линейное.

Но что, если результирующая переменная категориальная? Тогда и приходит на помощь логистическая регрессия!

Категориальные переменные — те, которые могут принимать лишь значения, обозначающие определённую категорию. Например, дни недели. Если у тебя есть точки на графике, обозначающие события определённого дня, то ни одна точка не может быть между понедельником и вторником. Если что-то произошло в понедельник, то оно произошло в понедельник, всё просто.

Те п ерь, если мы вспомним, как работает линейная регрессия, то как вообще можно определить линию наилучшего соответствия для чего-то категориального? Это невозможно! Поэтому логистическая регрессия выдаёт не численное значение, а вероятность соответствия той или иной категории. Поэтому модели, использующие логистическую регрессию, чаще всего используются для классификации.

Логистическая функция нелинейна. Как тогда логистическая регрессия может быть линейным классификатором?

Многомерная логистическая функция задаёт поверхность, которая поднимается от озёрной ложи (в точке ноль) к плато (в точке 1). Если вы заполните озеро до значения 0,5, то береговая линия будет прямой. Эта прямая и есть разделительная прямая для классификатора. В этом смысле логистическая регрессия — это линейный классификатор. Она работает лучше всего с линейно разделимыми классами”.

для чего используется логистическая регрессия

Вернёмся к тому, что мы называем линейную и логистическую регрессию “линейными”. Где же линейная часть логистической регрессии, когда мы не можем определить линию наилучшего соответствия? В мире логистической регрессии результирующая переменная находится в линейных отношениях с логарифмом отношения шансов независимых переменных.

Отношение шансов

Ядро логистической регрессии=отношение шансов.

Отношение шансов — это отношение вероятности успешного исхода к вероятности провала. Другими словами, это отношение вероятности того, что событие произойдёт, к вероятности того, что оно не произойдёт.

Для конкретного примера давай рассмотрим школьников, которые пишут тест. Известно, что для девушек отношение шансов того, что они сдадут тест, 5:1, а для парней — 3:10. Это значит, что из 6 девушек 5 скорее всего успешно сдадут тест, а из 13 парней — всего лишь 3. Общее количество учеников равно 19.

То есть отношение шансов и вероятность — одно и то же?

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

Отношение шансов — это отношение количества раз, когда произошло конкретное событие, к количеству раз, когда оно не произошло (из 30 подбрасываний в 10 случаях выпала решка, значит, в 20 она не выпала, тогда отношение шансов — 10:20).

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

Как получить вероятность из отношения шансов?

Давай рассмотрим это на определённой задаче классификации. Например, победит ли твоя любимая футбольная команда в матче с другой командой. Предположим, что отношение шансов того, что твоя любимая команда проиграет — 1:6 или 0,17, а того, что выиграет — 6:1 или 6. Эти числа можно представить на числовой прямой таким образом:

для чего используется логистическая регрессия

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

Логарифм отношения шансов

для чего используется логистическая регрессия

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

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

Хоть нам и до сих пор нужно число в промежутке от 0 до 1, достигнутая симметрия приближает нас к получению верного результата.

Логит-функция

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

Источник

Логистическая регрессия для машинного обучения

Дата публикации 2016-04-01

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

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

Прочитав этот пост, вы узнаете:

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

для чего используется логистическая регрессия

Логистическая функция

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

логистическая функцияСтатистиками также была разработана функция сигмоидальной функции, которая также описывала свойства роста популяции в экологии, которая быстро возрастала и максимально увеличивала пропускную способность окружающей среды. Это S-образная кривая, которая может принимать любое действительное число и отображать его в значение от 0 до 1, но никогда точно не в этих пределах.

для чего используется логистическая регрессия

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

Представление, используемое для логистической регрессии

Логистическая регрессия использует уравнение в качестве представления, очень похожего на линейную регрессию.

Входные значения (x) объединяются линейно с использованием весов или значений коэффициентов (называемых бета-заглавной греческой буквой) для прогнозирования выходного значения (y). Ключевым отличием от линейной регрессии является то, что моделируемое выходное значение представляет собой двоичные значения (0 или 1), а не числовое значение.

Ниже приведен пример уравнения логистической регрессии:

у = е ^ (b0 + b1 * x) / (1 + е ^ (b0 + b1 * x))

Фактическим представлением модели, которую вы бы сохранили в памяти или в файле, являются коэффициенты в уравнении (бета-значение или b).

Получите БЕСПЛАТНУЮ карту алгоритмов Mind

для чего используется логистическая регрессия

Я создал удобную карту разума из 60+ алгоритмов, организованных по типу.

Загрузите его, распечатайте и используйте.

Также получите эксклюзивный доступ к алгоритмам машинного обучения по электронной почте мини-курса.

Логистическая регрессия предсказывает вероятности (техническая интерлюдия)

Логистическая регрессия моделирует вероятность класса по умолчанию (например, первого класса).

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

P (пол = мужской | высота)

Другими словами, мы моделируем вероятность того, что вход (X) принадлежит классу по умолчанию (Y = 1), мы можем записать это формально как:

Мы предсказываем вероятности? Я думал, что логистическая регрессия была алгоритмом классификации?

Обратите внимание, что прогноз вероятности должен быть преобразован в двоичные значения (0 или 1), чтобы фактически сделать прогноз вероятности. Подробнее об этом позже, когда мы поговорим о прогнозировании.

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

p (X) = e ^ (b0 + b1 * X) / (1 + e ^ (b0 + b1 * X))

Я не хочу слишком углубляться в математику, но мы можем перевернуть вышеприведенное уравнение следующим образом (помните, что мы можем убрать e с одной стороны, добавив натуральный логарифм (ln) к другой):

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

Это соотношение слева называется коэффициентами класса по умолчанию (исторически сложилось, что мы используем коэффициенты, например, коэффициенты используются в скачках, а не вероятностях). Коэффициенты рассчитываются как отношение вероятности события, деленное на вероятность не события, например 0,8 / (1-0,8) с коэффициентом 4. Поэтому мы могли бы написать:

ln (коэффициент) = b0 + b1 * X

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

Мы можем переместить показатель степени вправо и записать его как:

шансы = е ^ (b0 + b1 * X)

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

Изучение модели логистической регрессии

Коэффициенты (бета-значения b) алгоритма логистической регрессии должны оцениваться на основе ваших тренировочных данных. Это делается с использованием оценки максимального правдоподобия.

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

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

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

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

для чего используется логистическая регрессия

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

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

Давайте сделаем это на конкретном примере.

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

y = e ^ (b0 + b1 * X) / (1 + e ^ (b0 + b1 * X))

y = exp (-100 + 0,6 * 150) / (1 + EXP (-100 + 0,6 * X))

Или вероятность, близкая к нулю, что человек является мужчиной.

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

0, если p (мужчина) & lt; 0,5

1, если р (мужской) = 0,5

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

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

Предположения, сделанные логистической регрессией о распределении и взаимосвязях в ваших данных, во многом совпадают с предположениями, сделанными в линейной регрессии.

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

Дальнейшее чтение

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

Ресурсы логистической регрессии

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

Логистическая регрессия в машинном обучении

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

Если бы я выбрал один, я бы указал наВведение в статистическое обучение, Это отличная книга со всех сторон.

Резюме

В этом посте вы обнаружили алгоритм логистической регрессии для машинного обучения и прогнозного моделирования. Вы много прошли и узнали:

У вас есть вопросы о логистической регрессии или об этом посте?
Оставьте комментарий и спросите, я сделаю все возможное, чтобы ответить.

Источник

Открытый курс машинного обучения. Тема 4. Линейные модели классификации и регрессии

для чего используется логистическая регрессия

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

Пример такой задачи – это соревнование Kaggle Inclass по идентификации пользователя в Интернете по его последовательности переходов по сайтам.

UPD: теперь курс — на английском языке под брендом mlcourse.ai со статьями на Medium, а материалами — на Kaggle (Dataset) и на GitHub.

Все материалы доступны на GitHub.
А вот видеозапись лекции по мотивам этой статьи в рамках второго запуска открытого курса (сентябрь-ноябрь 2017). В ней, в частности, рассмотрены два бенчмарка соревнования, полученные с помощью логистической регрессии.

1. Линейная регрессия

Метод наименьших квадратов

Рассказ про линейные модели мы начнем с линейной регрессии. В первую очередь, необходимо задать модель зависимости объясняемой переменной для чего используется логистическая регрессияот объясняющих ее факторов, функция зависимости будет линейной: для чего используется логистическая регрессия. Если мы добавим фиктивную размерность для чего используется логистическая регрессиядля каждого наблюдения, тогда линейную форму можно переписать чуть более компактно, записав свободный член для чего используется логистическая регрессияпод сумму: для чего используется логистическая регрессия. Если рассматривать матрицу наблюдения-признаки, у которой в строках находятся примеры из набора данных, то нам необходимо добавить единичную колонку слева. Зададим модель следующим образом:

для чего используется логистическая регрессия

Можем выписать выражение для каждого конкретного наблюдения

для чего используется логистическая регрессия

Также на модель накладываются следующие ограничения (иначе это будет какая то другая регрессия, но точно не линейная):

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

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

Один из способов вычислить значения параметров модели является метод наименьших квадратов (МНК), который минимизирует среднеквадратичную ошибку между реальным значением зависимой переменной и прогнозом, выданным моделью:

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

для чего используется логистическая регрессия

для чего используется логистическая регрессия

Итак, имея в виду все определения и условия описанные выше, мы можем утверждать, опираясь на теорему Маркова-Гаусса, что оценка МНК является лучшей оценкой параметров модели, среди всех линейных и несмещенных оценок, то есть обладающей наименьшей дисперсией.

Метод максимального правдоподобия

У читателя вполне резонно могли возникнуть вопросы: например, почему мы минимизируем среднеквадратичную ошибку, а не что-то другое. Ведь можно минимизировать среднее абсолютное значение невязки или еще что-то. Единственное, что произойдёт в случае изменения минимизируемого значения, так это то, что мы выйдем из условий теоремы Маркова-Гаусса, и наши оценки перестанут быть лучшими среди линейных и несмещенных.

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

Как-то после школы я заметил, что все помнят формулу этилового спирта. Тогда я решил провести эксперимент: помнят ли люди более простую формулу метилового спирта: для чего используется логистическая регрессия. Мы опросили 400 человек и оказалось, что формулу помнят всего 117 человек. Разумно предположить, что вероятность того, что следующий опрошенный знает формулу метилового спирта – для чего используется логистическая регрессия. Покажем, что такая интуитивно понятная оценка не просто хороша, а еще и является оценкой максимального правдоподобия.

Разберемся, откуда берется эта оценка, а для этого вспомним определение распределения Бернулли: случайная величина для чего используется логистическая регрессияимеет распределение Бернулли, если она принимает всего два значения ( для чего используется логистическая регрессияи для чего используется логистическая регрессияс вероятностями для чего используется логистическая регрессияи для чего используется логистическая регрессиясоответственно) и имеет следующую функцию распределения вероятности:

для чего используется логистическая регрессия

Похоже, это распределение – то, что нам нужно, а параметр распределения для чего используется логистическая регрессияи есть та оценка вероятности того, что человек знает формулу метилового спирта. Мы проделали для чего используется логистическая регрессиянезависимых экспериментов, обозначим их исходы как для чего используется логистическая регрессия. Запишем правдоподобие наших данных (наблюдений), то есть вероятность наблюдать 117 реализаций случайной величины для чего используется логистическая регрессияи 283 реализации для чего используется логистическая регрессия:

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

Перепишем модель в новом свете:

для чего используется логистическая регрессия

Так как примеры берутся независимо (ошибки не скоррелированы – одно из условий теоремы Маркова-Гаусса), то полное правдоподобие данных будет выглядеть как произведение функций плотности для чего используется логистическая регрессия. Рассмотрим логарифм правдоподобия, что позволит нам перейти от произведения к сумме:

для чего используется логистическая регрессия

Мы хотим найти гипотезу максимального правдоподобия, т.е. нам нужно максимизировать выражение для чего используется логистическая регрессия, а это то же самое, что и максимизация его логарифма. Обратите внимание, что при максимизации функции по какому-то параметру можно выкинуть все члены, не зависящие от этого параметра:

для чего используется логистическая регрессия

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

Разложение ошибки на смещение и разброс (Bias-variance decomposition)

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

Тогда ошибка в точке для чего используется логистическая регрессияраскладывается следующим образом:

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

для чего используется логистическая регрессия

для чего используется логистическая регрессия

И теперь последний член суммы. Мы помним, что ошибка и целевая переменная независимы друг от друга:

для чего используется логистическая регрессия

Наконец, собираем все вместе:

для чего используется логистическая регрессия

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

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

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

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

Регуляризация линейной регрессии

Иногда бывают ситуации, когда мы намеренно увеличиваем смещенность модели ради ее стабильности, т.е. ради уменьшения дисперсии модели для чего используется логистическая регрессия. Одним из условий теоремы Маркова-Гаусса является полный столбцовый ранг матрицы для чего используется логистическая регрессия. В противном случае решение МНК для чего используется логистическая регрессияне существует, т.к. не будет существовать обратная матрица для чего используется логистическая регрессияДругими словами, матрица для чего используется логистическая регрессиябудет сингулярна, или вырожденна. Такая задача называется некорректно поставленной. Задачу нужно скорректировать, а именно, сделать матрицу для чего используется логистическая регрессияневырожденной, или регулярной (именно поэтому этот процесс называется регуляризацией). Чаще в данных мы можем наблюдать так называемую мультиколлинеарность — когда два или несколько признаков сильно коррелированы, в матрице для чего используется логистическая регрессияэто проявляется в виде «почти» линейной зависимости столбцов. Например, в задаче прогнозирования цены квартиры по ее параметрам «почти» линейная зависимость будет у признаков «площадь с учетом балкона» и «площадь без учета балкона». Формально для таких данных матрица для чего используется логистическая регрессиябудет обратима, но из-за мультиколлинеарности у матрицы для чего используется логистическая регрессиянекоторые собственные значения будут близки к нулю, а в обратной матрице для чего используется логистическая регрессияпоявятся экстремально большие собственные значения, т.к. собственные значения обратной матрицы – это для чего используется логистическая регрессия. Итогом такого шатания собственных значений станет нестабильная оценка параметров модели, т.е. добавление нового наблюдения в набор тренировочных данных приведёт к совершенно другому решению. Иллюстрации роста коэффициентов вы найдете в одном из наших прошлых постов. Одним из способов регуляризации является регуляризация Тихонова, которая в общем виде выглядит как добавление нового члена к среднеквадратичной ошибке:

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

Такая регрессия называется гребневой регрессией (ridge regression). А гребнем является как раз диагональная матрица, которую мы прибавляем к матрице для чего используется логистическая регрессия, в результате получается гарантированно регулярная матрица.

для чего используется логистическая регрессия

Такое решение уменьшает дисперсию, но становится смещенным, т.к. минимизируется также и норма вектора параметров, что заставляет решение сдвигаться в сторону нуля. На рисунке ниже на пересечении белых пунктирных линий находится МНК-решение. Голубыми точками обозначены различные решения гребневой регрессии. Видно, что при увеличении параметра регуляризации для чего используется логистическая регрессиярешение сдвигается в сторону нуля.

для чего используется логистическая регрессия

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

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

Линейный классификатор

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

для чего используется логистическая регрессия

Мы уже знакомы с линейной регрессией и методом наименьших квадратов. Рассмотрим задачу бинарной классификации, причем метки целевого класса обозначим «+1» (положительные примеры) и «-1» (отрицательные примеры).
Один из самых простых линейных классификаторов получается на основе регрессии вот таким образом:

для чего используется логистическая регрессия

Логистическая регрессия как линейный классификатор

Логистическая регрессия является частным случаем линейного классификатора, но она обладает хорошим «умением» – прогнозировать вероятность для чего используется логистическая регрессияотнесения примера для чего используется логистическая регрессияк классу «+»:

для чего используется логистическая регрессия

Прогнозирование не просто ответа («+1» или «-1»), а именно вероятности отнесения к классу «+1» во многих задачах является очень важным бизнес-требованием. Например, в задаче кредитного скоринга, где традиционно применяется логистическая регрессия, часто прогнозируют вероятность невозврата кредита (для чего используется логистическая регрессия). Клиентов, обратившихся за кредитом, сортируют по этой предсказанной вероятности (по убыванию), и получается скоркарта — по сути, рейтинг клиентов от плохих к хорошим. Ниже приведен игрушечный пример такой скоркарты.

для чего используется логистическая регрессия

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

Итак, мы хотим прогнозировать вероятность для чего используется логистическая регрессия, а пока умеем строить линейный прогноз с помощью МНК: для чего используется логистическая регрессия. Каким образом преобразовать полученное значение в вероятность, пределы которой – [0, 1]? Очевидно, для этого нужна некоторая функция для чего используется логистическая регрессияВ модели логистической регрессии для этого берется конкретная функция: для чего используется логистическая регрессия. И сейчас разберемся, каковы для этого предпосылки.

для чего используется логистическая регрессия

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

Если вычислить логарифм для чего используется логистическая регрессия(то есть называется логарифм шансов, или логарифм отношения вероятностей), то легко заметить, что для чего используется логистическая регрессия. Его-то мы и будем прогнозировать с помощью МНК.

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

Шаг 1. Вычислить значение для чего используется логистическая регрессия. (уравнение для чего используется логистическая регрессиязадает гиперплоскость, разделяющую примеры на 2 класса);

Шаг 2. Вычислить логарифм отношения шансов: для чего используется логистическая регрессия.

Шаг 3. Имея прогноз шансов на отнесение к классу «+» – для чего используется логистическая регрессия, вычислить для чего используется логистическая регрессияс помощью простой зависимости:

для чего используется логистическая регрессия

В правой части мы получили как раз сигмоид-функцию.

Итак, логистическая регрессия прогнозирует вероятность отнесения примера к классу «+» (при условии, что мы знаем его признаки и веса модели) как сигмоид-преобразование линейной комбинации вектора весов модели и вектора признаков примера:

для чего используется логистическая регрессия

Следующий вопрос: как модель обучается? Тут мы опять обращаемся к принципу максимального правдоподобия.

Принцип максимального правдоподобия и логистическая регрессия

Теперь посмотрим, как из принципа максимального правдоподобия получается оптимизационная задача, которую решает логистическая регрессия, а именно, – минимизация логистической функции потерь.
Только что мы увидели, что логистическая регрессия моделирует вероятность отнесения примера к классу «+» как

для чего используется логистическая регрессия

Тогда для класса «-» аналогичная вероятность:

для чего используется логистическая регрессия

Оба этих выражения можно ловко объединить в одно (следите за моими руками – не обманывают ли вас):

для чего используется логистическая регрессия

Выражение для чего используется логистическая регрессияназывается отступом (margin) классификации на объекте для чего используется логистическая регрессия(не путать с зазором (тоже margin), про который чаще всего говорят в контексте SVM). Если он неотрицателен, модель не ошибается на объекте для чего используется логистическая регрессия, если же отрицателен – значит, класс для для чего используется логистическая регрессияспрогнозирован неправильно.
Заметим, что отступ определен для объектов именно обучающей выборки, для которых известны реальные метки целевого класса для чего используется логистическая регрессия.

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

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

для чего используется логистическая регрессия

для чего используется логистическая регрессия

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

Значит, выражение для чего используется логистическая регрессия– это своего рода «уверенность» модели в классификации объекта для чего используется логистическая регрессия:

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

где для чего используется логистическая регрессия– длина выборки для чего используется логистическая регрессия(число строк).

Как водится, возьмем логарифм данного выражения (сумму оптимизировать намного проще, чем произведение):

для чего используется логистическая регрессия

То есть в даном случае принцип максимизации правдоподобия приводит к минимизации выражения

для чего используется логистическая регрессия

Это логистическая функция потерь, просуммированная по всем объектам обучающей выборки.

Посмотрим на новую фунцию как на функцию от отступа: для чего используется логистическая регрессия. Нарисуем ее график, а также график 1/0 функциий потерь (zero-one loss), которая просто штрафует модель на 1 за ошибку на каждом объекте (отступ отрицательный): для чего используется логистическая регрессия.

для чего используется логистическая регрессия

Картинка отражает общую идею, что в задаче классификации, не умея напрямую минимизировать число ошибок (по крайней мере, градиентными методами это не сделать – производная 1/0 функциий потерь в нуле обращается в бесконечность), мы минимизируем некоторую ее верхнюю оценку. В данном случае это логистическая функция потерь (где логарифм двоичный, но это не принципиально), и справедливо

для чего используется логистическая регрессия

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

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

для чего используется логистическая регрессия-регуляризация логистических потерь

L2-регуляризация логистической регрессии устроена почти так же, как и в случае с гребневой (Ridge регрессией). Вместо функционала для чего используется логистическая регрессияминимизируется следующий:

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

Далее рассмотрим пример, позволяющий интуитивно понять один из смыслов регуляризации.

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

В 1 статье уже приводился пример того, как полиномиальные признаки позволяют линейным моделям строить нелинейные разделяющие поверхности. Покажем это в картинках.

Посмотрим, как регуляризация влияет на качество классификации на наборе данных по тестированию микрочипов из курса Andrew Ng по машинному обучению.
Будем использовать логистическую регрессию с полиномиальными признаками и варьировать параметр регуляризации C.
Сначала посмотрим, как регуляризация влияет на разделяющую границу классификатора, интуитивно распознаем переобучение и недообучение.
Потом численно установим близкий к оптимальному параметр регуляризации с помощью кросс-валидации (cross-validation) и перебора по сетке (GridSearch).

Загружаем данные с помощью метода read_csv библиотеки pandas. В этом наборе данных для 118 микрочипов (объекты) указаны результаты двух тестов по контролю качества (два числовых признака) и сказано, пустили ли микрочип в производство. Признаки уже центрированы, то есть из всех значений вычтены средние по столбцам. Таким образом, «среднему» микрочипу соответствуют нулевые значения результатов тестов.

RangeIndex: 118 entries, 0 to 117
Data columns (total 3 columns):
test1 118 non-null float64
test2 118 non-null float64
released 118 non-null int64
dtypes: float64(2), int64(1)
memory usage: 2.8 KB

Посмотрим на первые и последние 5 строк.

для чего используется логистическая регрессия

для чего используется логистическая регрессия

Сохраним обучающую выборку и метки целевого класса в отдельных массивах NumPy. Отобразим данные. Красный цвет соответствует бракованным чипам, зеленый – нормальным.

для чего используется логистическая регрессия

Определяем функцию для отображения разделяющей кривой классификатора

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

для чего используется логистическая регрессия

Например, для для чего используется логистическая регрессияэто будут следующие признаки:

для чего используется логистическая регрессия

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

Создадим объект sklearn, который добавит в матрицу для чего используется логистическая регрессияполиномиальные признаки вплоть до степени 7 и обучим логистическую регрессию с параметром регуляризации для чего используется логистическая регрессия. Изобразим разделяющую границу.
Также проверим долю правильных ответов классификатора на обучающей выборке. Видим, что регуляризация оказалась слишком сильной, и модель «недообучилась». Доля правильных ответов классификатора на обучающей выборке оказалась равной 0.627.

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

Еще увеличим для чего используется логистическая регрессия– до 10 тысяч. Теперь регуляризации явно недостаточно, и мы наблюдаем переобучение. Можно заметить, что в прошлом случае (при для чего используется логистическая регрессия=1 и «гладкой» границе) доля правильных ответов модели на обучающей выборке не намного ниже, чем в 3 случае, зато на новой выборке, можно себе представить, 2 модель сработает намного лучше.
Доля правильных ответов классификатора на обучающей выборке – 0.873.

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

Промежуточные выводы:

Настройка параметра регуляризации

Теперь найдем оптимальное (в данном примере) значение параметра регуляризации для чего используется логистическая регрессия. Сделать это можно с помощью LogisticRegressionCV – перебора параметров по сетке с последующей кросс-валидацией. Этот класс создан специально для логистической регрессии (для нее известны эффективные алгоритмы перебора параметров), для произвольной модели мы бы использовали GridSearchCV, RandomizedSearchCV или, например, специальные алгоритмы оптимизации гиперпараметров, реализованные в hyperopt.

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

для чего используется логистическая регрессия

Выделим участок с «лучшими» значениями C.

для чего используется логистическая регрессия

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

4. Где логистическая регрессия хороша и где не очень

Анализ отзывов IMDB к фильмам

Будем решать задачу бинарной классификации отзывов IMDB к фильмам. Имеется обучающая выборка с размеченными отзывами, по 12500 отзывов известно, что они хорошие, еще про 12500 – что они плохие. Здесь уже не так просто сразу приступить к машинному обучению, потому что готовой матрицы для чего используется логистическая регрессиянет – ее надо приготовить. Будем использовать самый простой подход – мешок слов («Bag of words»). При таком подходе признаками отзыва будут индикаторы наличия в нем каждого слова из всего корпуса, где корпус – это множество всех отзывов. Идея иллюстрируется картинкой

для чего используется логистическая регрессия

Загрузим данные отсюда (краткое описание — тут). В обучающей и тестовой выборках по 12500 тысяч хороших и плохих отзывов к фильмам.

Пример плохого отзыва:

‘Words can\’t describe how bad this movie is. I can\’t explain it by writing only. You have too see it for yourself to get at grip of how horrible a movie really can be. Not that I recommend you to do that. There are so many clich\xc3\xa9s, mistakes (and all other negative things you can imagine) here that will just make you cry. To start with the technical first, there are a LOT of mistakes regarding the airplane. I won\’t list them here, but just mention the coloring of the plane. They didn\’t even manage to show an airliner in the colors of a fictional airline, but instead used a 747 painted in the original Boeing livery. Very bad. The plot is stupid and has been done many times before, only much, much better. There are so many ridiculous moments here that i lost count of it really early. Also, I was on the bad guys\’ side all the time in the movie, because the good guys were so stupid. «Executive Decision» should without a doubt be you\’re choice over this one, even the «Turbulence»-movies are better. In fact, every other movie in the world is better than this one.’

Пример хорошего отзыва:

Простой подсчет слов

Составим словарь всех слов с помощью CountVectorizer. Всего в выборке 74849 уникальных слов. Если посмотреть на примеры полученных «слов» (лучше их называть токенами), то можно увидеть, что многие важные этапы обработки текста мы тут пропустили (автоматическая обработка текстов – это могло бы быть темой отдельной серии статей).

[’00’, ‘000’, ‘0000000000001’, ‘00001’, ‘00015’, ‘000s’, ‘001’, ‘003830’, ‘006’, ‘007’, ‘0079’, ‘0080’, ‘0083’, ‘0093638’, ’00am’, ’00pm’, ’00s’, ’01’, ’01pm’, ’02’, ‘020410’, ‘029’, ’03’, ’04’, ‘041’, ’05’, ‘050’, ’06’, ’06th’, ’07’, ’08’, ‘087’, ‘089’, ’08th’, ’09’, ‘0f’, ‘0ne’, ‘0r’, ‘0s’, ’10’, ‘100’, ‘1000’, ‘1000000’, ‘10000000000000’, ‘1000lb’, ‘1000s’, ‘1001’, ‘100b’, ‘100k’, ‘100m’]
[‘pincher’, ‘pinchers’, ‘pinches’, ‘pinching’, ‘pinchot’, ‘pinciotti’, ‘pine’, ‘pineal’, ‘pineapple’, ‘pineapples’, ‘pines’, ‘pinet’, ‘pinetrees’, ‘pineyro’, ‘pinfall’, ‘pinfold’, ‘ping’, ‘pingo’, ‘pinhead’, ‘pinheads’, ‘pinho’, ‘pining’, ‘pinjar’, ‘pink’, ‘pinkerton’, ‘pinkett’, ‘pinkie’, ‘pinkins’, ‘pinkish’, ‘pinko’, ‘pinks’, ‘pinku’, ‘pinkus’, ‘pinky’, ‘pinnacle’, ‘pinnacles’, ‘pinned’, ‘pinning’, ‘pinnings’, ‘pinnochio’, ‘pinnocioesque’, ‘pino’, ‘pinocchio’, ‘pinochet’, ‘pinochets’, ‘pinoy’, ‘pinpoint’, ‘pinpoints’, ‘pins’, ‘pinsent’]

Закодируем предложения из текстов обучающей выборки индексами входящих слов. Используем разреженный формат. Преобразуем так же тестовую выборку.

Обучим логистическую регрессию и посмотрим на доли правильных ответов на обучающей и тестовой выборках. Получается, на тестовой выборке мы правильно угадываем тональность примерно 86.7% отзывов.

Коэффициенты модели можно красиво отобразить.

для чего используется логистическая регрессия

Подберем коэффициент регуляризации для логистической регрессии. Используем sklearn.pipeline, поскольку CountVectorizer правильно применять только на тех данных, на которых в текущий момент обучается модель (чтоб не «подсматривать» в тестовую выборку и не считать по ней частоты вхождения слов). В данном случае pipeline задает последовательность действий: применить CountVectorizer, затем обучить логистическую регрессию. Так мы поднимаем долю правильных ответов до 88.5% на кросс-валидации и 87.9% – на отложенной выборке.

для чего используется логистическая регрессия

Теперь то же самое, но со случайным лесом. Видим, что с логистической регрессией мы достигаем большей доли правильных ответов меньшими усилиями. Лес работает дольше, на отложенной выборке 85.5% правильных ответов.

XOR-проблема

Теперь рассмотрим пример, где линейные модели справляются хуже.

Линейные методы классификации строят все же очень простую разделяющую поверхность – гиперплоскость. Самый известный игрушечный пример, в котором классы нельзя без ошибок поделить гиперплоскостью (то есть прямой, если это 2D), получил имя «the XOR problem».

XOR – это «исключающее ИЛИ», булева функция со следующей таблицей истинности:

для чего используется логистическая регрессия

XOR дал имя простой задаче бинарной классификации, в которой классы представлены вытянутыми по диагоналям и пересекающимися облаками точек.

для чего используется логистическая регрессия

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

для чего используется логистическая регрессия

А вот если на вход подать полиномиальные признаки, в данном случае до 2 степени, то проблема решается.

для чего используется логистическая регрессия

Здесь логистическая регрессия все равно строила гиперплоскость, но в 6-мерном пространстве признаков для чего используется логистическая регрессияи для чего используется логистическая регрессия. В проекции на исходное пространство признаков для чего используется логистическая регрессияграница получилась нелинейной.

На практике полиномиальные признаки действительно помогают, но строить их явно – вычислительно неэффективно. Гораздо быстрее работает SVM с ядровым трюком. При таком подходе в пространстве высокой размерности считается только расстояние между объектами (задаваемое функцией-ядром), а явно плодить комбинаторно большое число признаков не приходится. Про это подробно можно почитать в курсе Евгения Соколова (математика уже серьезная).

5. Кривые валидации и обучения

Мы уже получили представление о проверке модели, кросс-валидации и регуляризации.
Теперь рассмотрим главный вопрос:

Если качество модели нас не устраивает, что делать?

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

Будем работать со знакомыми данными по оттоку клиентов телеком-оператора.

Логистическую регрессию будем обучать стохастическим градиентным спуском. Пока объясним это тем, что так быстрее, но далее в программе у нас отдельная статья про это дело. Построим валидационные кривые, показывающие, как качество (ROC AUC) на обучающей и проверочной выборке меняется с изменением параметра регуляризации.

для чего используется логистическая регрессия

Тенденция видна сразу, и она очень часто встречается.

Для простых моделей тренировочная и валидационная ошибка находятся где-то рядом, и они велики. Это говорит о том, что модель недообучилась: то есть она не имеет достаточное кол-во параметров.

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

Сколько нужно данных?

Известно, что чем больше данных использует модель, тем лучше. Но как нам понять в конкретной ситуации, помогут ли новые данные? Скажем, целесообразно ли нам потратить N\$ на труд асессоров, чтобы увеличить выборку вдвое?

Поскольку новых данных пока может и не быть, разумно поварьировать размер имеющейся обучающей выборки и посмотреть, как качество решения задачи зависит от объема данных, на котором мы обучали модель. Так получаются кривые обучения (learning curves).

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

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

для чего используется логистическая регрессия

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

Если добавить еще данные, ошибка на обучающей выборке не будет расти, но с другой стороны, ошибка на тестовых данных не будет уменьшаться.

Получается, ошибки «сошлись», и добавление новых данных не поможет. Собственно, это случай – самый интересный для бизнеса. Возможна ситуация, когда мы увеличиваем выборку в 10 раз. Но если не менять сложность модели, это может и не помочь. То есть стратегия «настроил один раз – дальше использую 10 раз» может и не работать.

Что будет, если изменить коэффициент регуляризации (уменьшить до 0.05)?

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

для чего используется логистическая регрессия

А если усложнить модель ещё больше (для чего используется логистическая регрессия)?

Проявляется переобучение – AUC падает как на обучении, так и на валидации.

для чего используется логистическая регрессия

Строя подобные кривые, можно понять, в какую сторону двигаться, и как правильно настроить сложность модели на новых данных.

Выводы по кривым валидации и обучения

6. Плюсы и минусы линейных моделей в задачах машинного обучения

7. Домашнее задание № 4

Актуальные домашние задания объявляются во время очередной сессии курса, следить можно в группе ВК и в репозитории курса.

8. Полезные ресурсы

Статья написана в соавторстве с mephistopheies (Павлом Нестеровым). Он же – автор домашнего задания. Авторы домашнего задания в первой сессии курса (февраль-май 2017)– aiho (Ольга Дайховская) и das19 (Юрий Исаков). Благодарю bauchgefuehl (Анастасию Манохину) за редактирование.

Источник


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *