Вот что мы вместе добьемся к концу этой статьи:

  1. Понять, как работает логистическая регрессия, и ее внутренние слои
  2. Реализуйте логистическую регрессию с нуля и сравните результаты с научными материалами

«Все искусство одновременно поверхность и символ. Те, кто идут под поверхность, делают это на свой страх и риск ».
-Оскар Уайльд

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

Итак, приступим, давайте разберемся с логистической регрессией!

Шаг 1. Разберитесь, как работает логистическая регрессия, и ее внутренние слои

Логистическая регрессия в основном используется в задачах типа классификации. Классификация может быть двоичной (0 или 1) или мультиклассовой (более 2 классов).

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

Но как работает логистическая регрессия? Как можно решить, к какому классу принадлежит конкретная строка?

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

Слой 1: линейный слой

Первый слой - это линейный слой. Этот линейный слой используется для расчета оценки, которая называется активацией.

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

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

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

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

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

Layer2: функция Softmax

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

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

Второй столбец рассчитывается путем взятия экспоненты от значения из первого столбца. 5,312 = exp (1,67)
575,36 = exp (6,35) .. и так далее ..

2522,412 - это сумма второго столбца, который составляет знаменатель функции Softmax.

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

Результатом или прогнозом является строка с максимальным значением в столбце Softmax. В данном случае это будет строка со значением 0,759.

Вот как работает логистическая регрессия. Преобразуйте матрицу ввода в категориальные коды, умножьте матрицу ввода на матрицу весов (которая оптимизирована), чтобы получить набор активаций. Функция Softmax применяется к активациям, чтобы получить прогноз, и прогноз представляет собой строку с наивысшим значением Softmax. В таблице 5 прогнозируемым значением будет Cat, так как оно имеет максимальное выходное значение 0,75.

Шаг 2. Реализуйте логистическую регрессию с нуля и сравните результаты с научными материалами

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

Давайте быстро повторим шаги для построения логистической регрессии:

  1. Инициализировать весовую матрицу случайными весами
  2. Умножьте матрицу весов на входную матрицу, чтобы получить активацию (линейный слой)
  3. Примените функцию Softmax к линейному слою, чтобы получить прогноз (нелинейный слой)

get_weights: функция, которая используется для случайной инициализации входной матрицы. Возвращает случайное количество измерений, переданных в качестве аргумента, деленное на количество строк. Веса инициализируются с помощью инициализации Kaiming He.

Softmax: принимает экспоненту от значения «x» и возвращает сумму экспоненты значений в векторе или столбце активации.

__init__: Инициализировать линейный слой со случайными весами, используя инициализацию Kaiming He. 784 * 10, потому что изображения в наборе данных MNIST имеют ширину 784 пикселя и существует 10 возможных результатов от 0 до 9.

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

Чтобы сравнить результаты с помощью sci-kit learn, нам нужно будет вызвать класс LogReg и вызвать для него .fit() с помощью оптимизатора, чтобы наилучшим образом оптимизировать матрицу весов.

m = LogReg().cuda()
opt=optim.Adam(m.parameters())
fit(m, md, n_epochs=1, crit=loss, opt=opt, metrics=metrics)

m: объект логистической регрессии

opt: Оптимизатор Адама, оптимизирующий матрицу весов.

md: Входная матрица

n_epochs: Количество проходов данных для оптимизации матрицы весов

crit: Критерий максимизации или функция потерь (в данном случае отрицательная логарифмическая вероятность)

metrics: Точность (будет отображаться как результат после подгонки)

Мы получаем точность прогноза 91,9 после того, как мы вызываем модель LogReg, чтобы делать прогнозы для набора данных MNIST. А для LogisticRegression from Sci-Kit learn мы получаем прогноз 89,9. Рабочий блокнот для этого можно найти по адресу https://nbviewer.jupyter.org/github/arora-aman123/ML-OOP/blob/master/Logistic%20Regression%20from%20Scratch/logreg.ipynb#.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ. Как и в предыдущих статьях, я хотел бы поблагодарить Джереми Ховарда за код, который был непосредственно скопирован из библиотеки fast.ai. Я также рекомендую всем пройти курс машинного обучения и глубокого обучения, доступный на сайте fast.ai.