Predict proba что это
Пошаговое построение логистической регрессии в Python
Jul 12, 2020 · 9 min read
Логистическая регрессия — это алгоритм классификации машинного обучения, используемый для прогнозирования вероятности категориальной зависимой переменной. В логистической регрессии зависимая переменная является бинарной переменной, содержащей данные, закодированные как 1 (да, успех и т.п.) или 0 (нет, провал и т.п.). Другими словами, модель логистической регрессии предсказывает P(Y=1) как функцию X.
Условия логистической регрессии
Держа в уме все перечисленные условия, давайте взглянем на наш набор данных.
Данные
Набор данных взят с репозитория машинного обучения UCI и относится к прямым маркетинговым кампаниям (телефонный обзвон) португальского банковского учреждения. Цель классификации в прогнозировании успеха подписки клиента (1/0) на срочный депозит (переменная y). Загрузить этот набор данных можно здесь.
Эт и данные предоставляют информацию о клиентах банка, которая включает 41,188 записей и 21 поле.
Прогнозируемая переменная (желаемая цель):
y —подписался ли клиент на срочный вклад (двоично: “1” означает “Да”, “0” означает “Нет”).
Колонка образования в наборе данных имеет очень много категорий, и нам нужно сократить их для оптимизации моделирования. В этой колонке представлены следующие категории:
predict_proba в Python не прогнозирует вероятности (и как с этим бороться)
Специалисты по анализу данных часто оценивают свои прогностические модели с точки зрения точности и погрешности, но редко спрашивают себя:
«Способна ли моя модель спрогнозировать реальные вероятности?»
Однако точная оценка вероятности чрезвычайно ценна с точки зрения бизнеса (иногда она даже ценнее погрешности). Хотите пример?
Представьте, что ваша компания продает два вида кружек: обычные белые кружки и кружки с котятами. Вам нужно решить, какую из кружек показать клиенту. Для этого нужно предсказать вероятность того, что пользовать может купить ту или другую кружку. Вы обучили пару моделей и у вас есть следующие результаты:
Итак, какую из кружек вы бы предложили пользователю?
Обе модели решили, что пользователь с наибольшей вероятностью купит обычную кружку (таким образом, у модели А и модели B одинаковая область под кривой ошибок, поскольку этот показатель оценивает только сортировку).
Но согласное модели А, вы сможете максимизировать ожидаемую прибыль, рекомендуя обычную кружку. Тогда как по модели B ожидаемая прибыль будет максимальной при выборе кружки с котенком.
В такие моменты жизненно важно выяснить, какая из моделей точнее оценивает вероятности (как визуально, так и численно) и как «подправить» имеющуюся модель, чтобы увеличить точность.
Что не так с predict_proba
У всех самых популярных библиотек машинного обучения есть метод под названием «predict_proba», это относится к Scikit-learn (например, LogisticRegression, SVC, randomForest. ), XGBoost, LightGBM, CatBoost, Keras…
Но несмотря на свое название predict_proba не совсем предсказывает вероятности. На самом деле, различные исследования (особенно это и это) показали, что самые популярные прогностические модели не откалиброваны.
Того факта, что число находится между нулем и единицей, уже достаточно, чтобы называть его вероятностью!
Но когда мы можем сказать, что число в самом деле представляет из себя вероятность?
Представьте, что вы обучили прогностическую модель, чтобы предсказать, разовьется ли у пациента рак. Допустим, что для данного пациента модель предсказывает вероятность 5%. По идее мы должны пронаблюдать одного и того же пациента в нескольких параллельных вселенных и посмотреть, действительно ли у него разовьется рак в 5% случаев.
Поскольку мы не можем идти по этому пути, лучшим прокси-сервером будет взять всех пациентов с вероятностью заболевания 5%, и подсчитать, у скольких из них развился рак. Если наблюдаемый процент на самом деле близок к 5%, мы говорим, что вероятности, выдаваемые моделью, откалиброваны.
Когда предсказанные вероятности отражают реальные базовые вероятности, они называются “откалиброванными”.
Но как проверить, откалибрована ли ваша модель?
Калибровочная кривая
Самый простой способ оценить калибровку вашей модели – это построить график, называемый «калибровочной кривой» (он же – диаграмма надежности).
Идея состоит в том, чтобы разделить наблюдения на ячейки вероятности. Таким образом, наблюдения, принадлежащие к одной и той же ячейке, имеют одинаковую вероятность. Итак, для каждой ячейки калибровочная кривая сравнивает спрогнозированное среднее (т.е. среднее значение предсказанной вероятности) с теоретическим средним (т.е. средним наблюдаемой целевой переменной).
Scikit-learn сделает все за вас с помощью функции calibration_curve :
Вам нужно только выбрать количество ячеек и (необязательно) стратегию распределения по ячейкам:
Для построения графиков лично я предпочитаю подход «quantile». На самом деле «Uniform»-распределение может дезориентировать, поскольку в некоторых ячейках может быть крайне мало наблюдений.
Функция Numpy возвращает два массива, содержащих среднюю вероятность и среднее значение целевой переменной для каждой ячейки. Поэтому все, что нам нужно сделать – это нарисовать график:
Предположим, что у вашей модели хорошая точность, тогда калибровочная кривая будет монотонно увеличиваться. Но это не значит, что модель хорошо откалибрована.
На самом деле, ваша модель хорошо откалибрована только в том случае, если калибровочная кривая очень близка к биссектрисе (т.е. серой пунктирной линии), поскольку это будет означать, что прогнозируемая вероятность в среднем близка к теоретической вероятности.
Давайте рассмотрим несколько примеров распространенных типов калибровочных кривых, которые указывают на неверную калибровку вашей модели:
Наиболее распространенными типами неправильной калибровки являются:
Систематическая переоценка. По сравнению с правильным распределением распределение прогнозируемых вероятностей смещается вправо. Так часто случается, когда вы обучаете модель на несбалансированном наборе данных с очень небольшим количеством положительных наблюдений.
Систематическая недооценка. По сравнению с правильным распределением распределение прогнозируемых вероятностей смещается влево.
Центр распределения слишком тяжелый. Так происходит, когда «такие алгоритмы, как метод опорных векторов или ускоренные деревья решений, имеют тенденцию отклонять прогнозируемые вероятности от 0 и 1» (цитата из «Прогнозирования хороших вероятностей при обучении с учителем»).
Хвосты распределения слишком тяжелые. Например, «Другие методы, такие как наивный байес, имеют противоположный уклон, и, как правило, приближают прогнозы к 0 и 1» (цитата из «Прогнозирования хороших вероятностей при обучении с учителем»).
Как исправить неправильную калибровку на Python
Допустим, вы обучили классификатор, который выдает точные, но некалиброванные вероятности. Идея калибровки вероятности состоит в том, чтобы построить вторую модель (называемую калибратором), которая способна исправлять имеющиеся вероятности до реальных.
Обратите внимание, что калибровку не следует проводить на тех же данных, которые использовались для обучения первого классификатора.
Таким образом, калибровка – это функция, которая преобразует одномерный вектор (некалиброванных вероятностей) в другой одномерный вектор (калиброванных вероятностей).
Для калибровки в основном используются два метода:
Изотоническая регрессия. Непараметрический алгоритм, который подгоняет неубывающую линию свободной формы под данные. Тот факт, что линия неубывающая, является основополагающим, поскольку так учитывается исходная сортировка.
Логистическая регрессия.
Давайте посмотрим, как использовать калибраторы на практике в Python, с помощью игрушечного набора данных.
Для начала нам нужно будет обучить классификатор. Давайте воспользуемся случайным лесом (но с любой другой моделью, у которой есть метод predict_proba, все будет в порядке).
Затем мы используем выходные данные классификатора (по данным валидации) для обучения калибратора и, наконец, для прогнозирования вероятностей по тестовым данным.
Изотоническая регрессия
Логистическая регрессия
На данный момент у нас есть три варианта прогнозирования вероятностей:
Обычный случайный лес
Случайный лес + изотоническая регрессия
Случайный лес + логистическая регрессия
Но как понять, какой из них лучше откалиброван?
Количественная оценка неправильной калибровки
Всем нравятся графики. Но помимо графика калибровки, нам нужен количественный способ измерения (неправильной) калибровки. Наиболее часто используемая метрика называется ожидаемой ошибкой калибровки. Она отвечает на вопрос: насколько далеко в среднем наша спрогнозированная вероятность от настоящей вероятности?
Возьмем, например, один классификатор:
Легко определить погрешность калибровки одной ячейки: нужно взять модуль разности среднего значения прогнозируемых вероятностей и доли положительных результатов в рамках одной ячейки.
Если подумать, то все интуитивно понятно. Возьмем одну ячейку и предположим, что среднее значение ее прогнозируемых вероятностей 25%. Таким образом, мы ожидаем, что доля положительных результатов в этой ячейке примерно равна 25%. Чем дальше имеющееся значение от 25%, тем хуже калибровка этой ячейки.
Таким образом, ожидаемая ошибка калибровки (ЕСЕ) представляет собой средневзвешенное значение ошибок калибровки отдельных ячеек, где каждая ячейка весит пропорционально количеству наблюдений, которые она содержит:
где b-определяет ячейку, а B – количество ячеек. Обратите внимание, что в знаменателе у нас просто общее число сэмплов.
Но в этой формуле остается проблема определения количества ячеек. Чтобы найти наиболее нейтральную метрику, я предпочитаю определять количество ячеек по правилу Фридмана-Диакониса (статистическое правило, предназначенное для определения количества ячеек, которое делает гистограмму максимально близкой к теоретическому распределению вероятностей).
Использовать правило Фридмана-Диакониса в Python очень просто, поскольку оно уже реализовано в функции histogram в numpy (нужно лишь передать строку « fd » в параметр « bins »).
Вот реализация ожидаемой ошибки калибровки на Python, с правилом Фридмана-Диакониса по умолчанию:
Теперь, когда у нас есть метрика для калибровки, давайте сравним калибровку трех моделей, которые у нас были выше (на тестовом наборе):
В нашем случае изотоническая регрессия обеспечила наилучший результат с точки зрения калибровки, в среднем с отклонением 1.2% от реальной вероятности. Это гигантское улучшение, если учитывать, что ECE обычного случайного леса составила 7%.
Источники
Вот несколько интересных работ, которые легли в основу этой статьи, и я их могу вам рекомендовать, если вы хотите углубиться в тему калибровки вероятности:
Всех желающих приглашаем на открытый урок «Multi-armed bandits для оптимизации AB тестирования, от теории — сразу в бой». На этом вебинаре мы разберем один из самых простых, но эффективных вариантов применения обучения с подкреплением. Посмотрим, как можно переформулировать задачу АБ тестирования в задачу байесовского вывода и получать выводы по тестам раньше, чем при классическом тестировании.
Логистическая регрессия в Python
Дата публикации Aug 3, 2019
Вероятность против вероятности
Прежде чем погрузиться в мельчайшие подробности логистической регрессии, важно понять разницу между вероятностью и вероятностью. Шансы рассчитываются исходя из количества событий, в которых что-то произошло, и деления на количество событий, в которых это же самое не произошло. Например, если шансы на победу в игре равны 5 к 2, мы рассчитываем соотношение как 5/2 = 2,5. С другой стороны, вероятность рассчитывается исходя из количества событий, в которых что-то произошло, и деления на общее количество событий (включая события, когда то же самое что-то происходило и не происходило). Например, вероятность выигрыша в игре с одинаковыми коэффициентами равна 5 / (5 + 2) = 0,714.
Одно важное различие между вероятностями и вероятностями, которое вступит в силу, когда мы начнем обучать модель, заключается в том, что вероятности находятся в диапазоне от 0 до 1, тогда какжурнал шансовможет варьироваться от отрицательной до положительной бесконечности. Мы берем журнал шансов, потому что в противном случае, когда мы рассчитываем шансы какого-либо события, происходящего (например, выигрыша в игре), если знаменатель больше, чем числитель, шансы будут варьироваться от 0 до 1. Однако, когда числитель больше знаменателя, то шансы будут варьироваться от 1 до бесконечности. Например, предположим, что мы сравнили шансы на победу в игре для двух разных команд. Команда А состоит из всех звезд, поэтому их шансы на победу в игре составляют 5 к 1.
С другой стороны, шансы команды Б на победу в игре составляют от 1 до 5.
Принимая журнал шансов, расстояние от начала (0) одинаково для обеих команд.
Мы можем перейти от вероятности к вероятности, разделив вероятность того, что событие происходит, на вероятность того, что оно не произошло.
Запишем общую формулу последнего следующим образом:
Как мы уже увидели, нам нужно переходить от вероятности к вероятности и обратно при определении оптимального соответствия для нашей модели.
Алгоритм
Предположим, мы хотели построить модель логистической регрессии, чтобы предсказать, будет ли студент сдавать или не сдавать, учитывая определенные переменные, такие как количество изученных часов. Точнее, мы хотим модель, которая выводит вероятность (число от 0 до 1), которую пропускает студент. Значение 1 означает, что студент гарантированно сдает, а значение 0 означает, что студент потерпит неудачу.
В математике мы называем следующее уравнение сигмоидальной функцией.
гдеYэто уравнение для линии.
Неважно, какое значение мы имеем дляYсигмоидная функция находится в диапазоне от 0 до 1. Например, когда у стремится к отрицательной бесконечности, вероятность приближается к нулю.
Когда у стремится к положительной бесконечности, вероятность приближается к единице.
В логистической регрессии мы используем функцию Sigmoid, чтобы описать вероятность того, что выборка принадлежит одному из двух классов. Форма функции Сигмоида определяет вероятности, предсказанные нашей моделью. Когда мы обучаем нашу модель, мы на самом деле пытаемся выбрать функцию Sigmoid, форма которой наилучшим образом соответствует нашим данным. Фактический способ выбора оптимальной линии включает в себя много математики. Как мы видели в линейной регрессии, мы можем использовать градиентный спуск или другой метод, чтобы сходиться к решению. Однако производная сигмоидальной функции довольно сложна.
Что если бы мы могли вместо этого оптимизировать уравнение прямой?
Как мы упоминали ранее, мы можем перейти от вероятностей (функция от 0 до 1) к логарифму (шансы) (функция от отрицательной до положительной бесконечности).
Например, предположим, что вероятность прохождения студентом составляет 0,8 или 80%. Мы можем найти соответствующую позицию на оси Y нового графа, разделив вероятность того, что они пройдут, на вероятность того, что они потерпят неудачу, и затем взяв логарифм результата.
Затем мы повторим процесс для каждой точки данных.
После того как мы нанесем каждую точку данных на новую ось Y, точно так же, как линейная регрессия, мы можем использовать оптимизатор для определения точки пересечения y и наклона наилучшей линии подгонки.
В этом примере мы рассмотрим, как оптимизировать функцию с максимальной вероятностью.
Сначала мы генерируем строку кандидата, а затем проецируем на нее исходные данные.
Мы смотрим наYЗначение каждой точки данных вдоль линии и преобразовать ее из журнала шансов в вероятность
После повторения процесса для каждой точки данных мы получаем следующую функцию.
Вероятность того, что студент пропустит это значение по оси Y в этой точке вдоль линии. Вероятность наблюдения за студентами с текущим распределением с учетом формы сигмоида является результатом наблюдения за каждым проходом студента в отдельности.
Далее мы включаем вероятности для студентов, которые не перешли к уравнению для общей вероятности. Поскольку сигмоидальная функция представляетвероятность того, что студент проходитвероятность того, что студент потерпит неудачу, равна 1 (общей вероятности) минусYзначение в этой точке вдоль линии.
Как правило, вы увидите журнал вероятности использования вместо этого. Произведение двух чисел внутри журнала эквивалентно добавлению их журналов.
В итоге мы получаем следующую вероятность.
Затем мы повторяем весь процесс для другой линии и сравниваем вероятности. Мы выбираем линию с максимальной вероятностью (наибольшее положительное число).
Давайте посмотрим, как мы можем реализовать Logistic Regression в Python. Для начала импортируйте следующие библиотеки.
Далее мы воспользуемся преимуществом make_classification функция от scikit-learn библиотека для генерации данных. Как мы упоминали ранее, логистическая регрессия применима только к задачам двоичной классификации. Таким образом, точки данных состоят из двух классов.
Мы строим отношения между функцией и классами.
Перед обучением нашей модели мы отложим часть наших данных, чтобы оценить ее производительность.
Мы создаем экземпляр экземпляра LogisticRegression класс и назвать fit функция с функциями и метками (поскольку Логистическая регрессия является алгоритмом контролируемого машинного обучения) в качестве аргументов.
Мы можем получить доступ к следующим свойствам, чтобы фактически увидеть коэффициент для наклона и y-пересечения наилучшей линии подгонки.
Давайте посмотрим, как модель работает с данными, на которых она не была обучена.
Учитывая, что это состоит из проблемы классификации, мы используем матрицу путаницы для измерения точности нашей модели.
От нашегоматрица путаницымы заключаем, что:
Если по какой-либо причине мы хотим проверить фактическую вероятность того, что точка данных принадлежит данному классу, мы можем использовать predict_proba функция.
Первый столбец соответствует вероятности того, что выборка принадлежит первому классу, а второй столбец соответствует вероятности того, что выборка принадлежит второму классу.
Прежде чем пытаться построить функцию Sigmoid, мы создаем и сортируем DataFrame, содержащий наши тестовые данные.
Логистическая регрессия в Python
Содержание
По мере того, как объем доступных данных, вычислительные мощности и количество улучшений алгоритмов продолжают расти, растет и важность науки о данных и машинного обучения. Классификация — одна из наиболее важных областей машинного обучения, а логистическая регрессия — один из ее основных методов. К концу этого урока вы узнаете о классификации в целом и основах логистической регрессии в частности, а также о том, как реализовать логистическую регрессию в Python.
В этом уроке вы узнаете:
Классификация
Классификация એ — очень важная область машинного обучения с учителем. В эту область входит большое количество важных проблем машинного обучения. Существует множество методов классификации, и логистическая регрессия — один из них.
Что такое классификация?
Алгоритмы контролируемого машинного обучения определяют модели, которые фиксируют взаимосвязи между данными. Классификация — это область машинного обучения с учителем, которая пытается предсказать, к какому классу или категории принадлежит тот или иной объект, на основе его характеристик.
Например, вы можете проанализировать сотрудников какой-либо компании и попытаться установить зависимость от характеристик или переменных, таких как уровень образования, количество лет на текущей должности, возраст, зарплата, шансы на продвижение по службе и т.д. Набор данных, относящихся к одному сотруднику — одно наблюдение. Характеристики или переменные могут принимать одну из двух форм:
В приведенном выше примере, когда вы анализируете сотрудников, вы можете предположить, что уровень образования, время в текущем положении и возраст как независимые друг от друга и рассматривать их как входные данные. Заработная плата и шансы на продвижение по службе могут быть результатами, которые зависят от вложений.
Примечание. Алгоритмы машинного обучения с учителем анализируют ряд наблюдений и пытаются математически выразить зависимость между входами и выходами. Эти математические представления зависимостей являются моделями.
Природа зависимых переменных различает проблемы регрессии и классификации. Задачи регрессии имеют непрерывные и обычно неограниченные результаты. Например, вы оцениваете зарплату как функцию от опыта и уровня образования. С другой стороны, задачи классификации имеют дискретные и конечные выходы, называемые классами или категориями. Например, прогнозирование того, будет ли сотрудник повышаться по службе или нет (правда или ложь), является проблемой классификации.
Есть два основных типа проблем классификации:
Когда вам нужна классификация?
Вы можете применять классификацию во многих областях науки и техники. Например, алгоритмы классификации текста используются для разделения легитимных писем и спама, а также положительных и отрицательных комментариев. Вы можете ознакомиться с Practical Text Classification With Python and Keras, чтобы получить некоторое представление об этой теме. Другие примеры включают медицинские приложения, биологическую классификацию, кредитный рейтинг и многое другое.
Задачи распознавания изображений часто представляют как задачи классификации. Например, вы можете спросить, имеется ли на изображение человеческое лицо или нет, мышь или слон, какую цифру от нуля до девяти оно представляет и т.д. Чтобы узнать больше об этом, ознакомьтесь с материалами Traditional Face Detection With Python и Face Recognition with Python, in Under 25 Lines of Code.
Понятие логистической регрессии
Логистическая регрессия એ — это фундаментальный метод классификации. Он принадлежит к группе линейных классификаторов и чем-то похож на полиномиальную и линейную регрессию. Логистическая регрессия выполняется быстро и относительно несложно, и вам удобно интерпретировать результаты. Хотя по сути это метод двоичной классификации, его также можно применить к мультиклассовым задачам.
Предварительные требования к математике
Вам потребуется понимание сигмоида એ и функции натурального логарифма, чтобы понять, что такое логистическая регрессия и как она работает.
Сигмоида имеет значения, очень близкие к 0 или 1 в большей части своей области. Это делает его пригодным для использования в методах классификации.
На этом изображении показан натуральный логарифм \log(x) некоторой переменной x для значений x от 0 до 1:
Формулировка проблемы
Методология
Функция логистической регрессии p(x) является сигмоидой f(x) :
Таким образом, она часто близка к 0 или 1. функция p(x) часто интерпретируется как прогнозируемая вероятность того, что выход для данного равен 1. Следовательно, 1 — p(x) — это вероятность того, что выход равен 0.
Существует несколько математических подходов, которые позволяют вычислить наилучшие веса, соответствующие максимальному LLF, но это выходит за рамки данного руководства. Теперь, вы можете оставить эти детали для библиотек Python логистической регрессии, которые вы научитесь использовать здесь!
Порог не обязательно должен быть 0,5, но обычно это так. Вы можете определить более низкое или более высокое значение, если это более удобно для вашей ситуации.
Есть еще одно важное соотношение между p(x) и f(x_i) :
Эффективность классификации
Бинарная классификация имеет четыре возможных типа результатов:
Вы обычно оцениваете точность своего классификатора, сравнивая фактические и прогнозируемые результаты и подсчитывая правильные и неправильные прогнозы.
Самый простой индикатор точности классификации — это отношение количества правильных предсказаний к общему количеству предсказаний (или наблюдений). Другие индикаторы бинарных классификаторов включают следующее:
Наиболее подходящий индикатор зависит от интересующей проблемы. В этом руководстве вы воспользуетесь самым простым способом определения точности классификации.
Логистическая регрессия по одной переменной
Многовариантная логистическая регрессия
Многовариантная логистическая регрессия имеет более одной входной переменной. На этом рисунке показана классификация с двумя независимыми переменными, x_1 и x_2 :
График отличается от одновариантного графика, потому что обе оси представляют входные данные. Выходы также различаются по цвету. Белые кружки показывают наблюдения, классифицированные как нули, а зеленые кружки — как единицы.
Регуляризация
Переобучение — одна из самых серьезных проблем, связанных с машинным обучением. Это происходит, когда модель слишком хорошо усваивает обучающие данные. Затем модель изучает не только отношения между данными, но и шум в наборе данных. Переобученные модели, как правило, имеют хорошую точность с данными, используемыми для их соответствия (данные обучения), но они плохо себя ведут с невидимыми данными (или тестовыми данными, которые не используются для соответствия модели).
Переобучение обычно происходит со сложными моделями. Регуляризация обычно пытается уменьшить сложность модели или снизить ее. Методы регуляризации, применяемые с логистической регрессией, в основном имеют тенденцию штрафовать за большие коэффициенты b_0, b_1,\dots, b_r :
Регуляризация может значительно улучшить точность модели для невидимых данных.
Логистическая регрессия в Python
Теперь, когда вы понимаете основы, вы готовы применять соответствующие пакеты, а также их функции и классы для выполнения логистической регрессии в Python. В этом разделе вы увидите следующее:
Приступим к реализации логистической регрессии в Python!
Пакеты Python для логистической регрессии
Для логистической регрессии в Python вам понадобится несколько пакетов. Все они бесплатны, имеют открытый исходный код и множество доступных ресурсов. Во-первых, вам понадобится NumPy, фундаментальный пакет для научных и числовых вычислений на Python. NumPy полезен и популярен, потому что он позволяет выполнять высокопроизводительные операции с одно- и многомерными массивами.
В NumPy есть много полезных процедур работы с массивами. Он позволяет писать элегантный и компактный код и хорошо работает со многими пакетами Python. Если вы хотите изучить NumPy, вы можете начать с официального руководства пользователя. Справочник NumPy также предоставляет исчерпывающую документацию по его функциям, классам и методам.
Примечание. Чтобы узнать больше о производительности NumPy и других преимуществах, которые он может предложить, ознакомьтесь с Сравнение производительности Pure Python vs NumPy vs TensorFlow и Look Ma, No For-Loops: Array Programming With NumPy.
Еще один пакет Python, который вы будете использовать, — это scikit‑learn. Это одна из самых популярных библиотек для науки о данных и машинного обучения. Вы можете использовать scikit‑learn для выполнения различных функций:
Вы найдете полезную информацию на официальном сайте scikit‑learn, где вы, возможно, захотите прочитать об обобщенных линейных моделях и реализации логистической регрессии. Если вам нужна функциональность, которую scikit‑learn не может предложить, вам может пригодиться StatsModels. Это мощная библиотека Python для статистического анализа. Более подробную информацию вы можете найти на официальном сайте.
Наконец, вы будете использовать Matplotlib для визуализации результатов вашей классификации. Это всеобъемлющая библиотека Python, которая широко используется для высококачественного построения графиков.
Для получения дополнительной информации вы можете проверить официальный сайт и руководство. пользователя. Существует несколько ресурсов для изучения Matplotlib, которые могут оказаться полезными, например, Matplotlib: краткое руководство.
Логистическая регрессия в Python с помощью scikit‑learn: пример 1
Первый пример связан с проблемой двоичной классификации по одной переменной. Это наиболее простой вид классификационной задачи. При подготовке моделей классификации вы должны предпринять несколько общих шагов:
Достаточно хорошая модель, которую вы определяете, может использоваться для дальнейших прогнозов, связанных с новыми, невидимыми данными. Вышеупомянутая процедура одинакова для классификации и регрессии.
Шаг 1. Импортируйте пакеты, функции и классы
Теперь вы импортировали все необходимое для логистической регрессии в Python с помощью scikit‑learn!
Шаг 2. Получение данных
На практике у вас обычно есть какие-то данные для работы. Для целей этого примера давайте просто создадим массивы для входных (x) и выходных (y) значений:
Входные и выходные данные должны быть массивами NumPy (экземпляры класса numpy.ndarray ) или аналогичными объектами. numpy.arange() создает массив последовательных, равномерно распределенных значений в заданном диапазоне. Для получения дополнительной информации об этой функции посмотрите NumPy: Справочное руководтсво.
Вот как теперь выглядят x и y :
x имеет два измерения:
y — одномерный с десятью элементами. Опять же, каждый пункт соответствует одному наблюдению. Он содержит только нули и единицы, так как это проблема двоичной классификации.
Шаг 3. Создание модели и её обучение
После того, как вы подготовили вход и выход, вы можете создать и определить свою модель классификации. Вы собираетесь представить его с помощью экземпляра класса LogisticRegression :
Приведенный выше оператор создает экземпляр LogisticRegression и связывает его ссылки с моделью переменных. LogisticRegression имеет несколько дополнительных параметров, которые определяют поведение модели и подход:
Вам следует тщательно согласовать решатель и метод регуляризации по нескольким причинам:
Здесь представлено текстовое описание подобранной модели.
На этом этапе у вас определена модель классификации.
Это пример двоичной классификации, и y может быть 0 или 1, как указано выше.
Вы также можете получить значение наклона b_1 и точку пересечения b_0 линейной функции f следующим образом:
Шаг 4: Оценка модели
Эта функция возвращает предсказанные выходные значения в виде одномерного массива.
На рисунке ниже показаны результаты входа, выхода и классификации:
.score() принимает входные и выходные данные в качестве аргументов и возвращает отношение количества правильных прогнозов к количеству наблюдений.
Вы можете получить больше информации о точности модели с помощью матрицы ошибок. В случае бинарной классификации матрица ошибок показывает следующие числа:
Чтобы создать матрицу ошибок, вы можете использовать confusion_matrix() и предоставить фактические и прогнозируемые результаты в качестве аргументов:
Полученная матрица показывает следующее:
Приведенный выше код создает тепловую карту, которая и есть визуальное представление матрицы ошибок:
Вы можете получить более полный отчет о классификации с помощью метода classification_report() :
Эта функция также принимает фактические и прогнозируемые выходные данные в качестве аргументов. Она возвращает отчет о классификации в виде словаря, если вы указали output_dict = True или строку в противном случае.
Примечание. Обычно для оценки модели лучше использовать данные, которые вы не использовали для обучения. Так вы избегаете предвзятости и обнаруживаете переобучение. Позже здесь вы увидите пример.
Улучшение модели
Вы можете улучшить свою модель, задав разные параметры. Например, давайте работать с силой регуляризации C, равной 10,0, вместо значения по умолчанию 1,0:
Теперь у вас есть еще одна модель с другими параметрами. Он также будет иметь другую матрицу вероятностей и другой набор коэффициентов и прогнозов:
Оценка (или точность) 1 и нули в нижнем левом и верхнем правом полях матрицы ошибок указывают на то, что фактический и прогнозируемый выходные данные совпадают. Это также показано на рисунке ниже:
На этом рисунке показано, что оценочная линия регрессии теперь имеет другую форму и что четвертая точка правильно классифицируется как 0. Красный знак \times отсутствует, поэтому нет неверного прогноза.
Логистическая регрессия в Python с помощью scikit‑learn: пример 2
Решим еще одну задачу классификации. Она похожа на предыдущую, только за исключением того, что выход отличается вторым значением. Код будет аналогичен предыдущему случаю:
Этот образец кода классификации дает следующие результаты:
На рисунке ниже показан этот пример с восемью правильными и двумя неправильными прогнозами:
Имейте в виду, что логистическая регрессия — это, по сути, линейный классификатор, поэтому вы теоретически не можете создать модель логистической регрессии с точностью до 1 в этом случае.
Логистическая регрессия в Python с помощью StatsModels: пример
Вы также можете реализовать логистическую регрессию в Python с помощью пакета StatsModels. Обычно это требуется, когда вам нужно больше статистических данных, относящихся к моделям и результатам. Процедура аналогична scikit‑learn.
Шаг 1. Импортируйте пакеты
Все, что вам нужно для импорта, это NumPy и statsmodels.api :
Теперь у вас есть нужные пакеты.
Шаг 2. Получите данные
add_constant() принимает массив x в качестве аргумента и возвращает новый массив с дополнительным столбцом единиц. Вот как выглядят x и y :
Шаг 3. Создайте модель и обучите её
Шаг 4: Оцените модель
Вы можете использовать результаты, чтобы получить вероятность того, что прогнозируемые результаты будут равны единице:
Этот пример такой же, как и при использовании scikit‑learn, потому что прогнозируемые результаты равны. Матрицы ошибок, полученные с помощью StatsModels и scikit‑learn, различаются типами их элементов (числа с плавающей запятой и целые числа).
Это подробные отчеты со значениями, которые можно получить с помощью соответствующих методов и атрибутов. Для получения дополнительной информации ознакомьтесь с официальной документацией по LogitResults.
Логистическая регрессия в Python: распознавание рукописного ввода
Предыдущие примеры иллюстрировали реализацию логистической регрессии в Python, а также некоторые детали, связанные с этим методом. В следующем примере показано, как использовать логистическую регрессию для решения реальной проблемы классификации. Подход очень похож на то, что вы уже видели, но с большим набором данных и несколькими дополнительными проблемами.
Этот пример касается распознавания изображений. Если быть более точным, вы будете работать над распознаванием рукописных цифр. Вы будете использовать набор данных с 1797 наблюдениями, каждое из которых представляет собой изображение одной рукописной цифры. Каждое изображение имеет размер 64 пикселя, ширину 8 пикселей и высоту 8 пикселей.
Примечание. Чтобы узнать больше об этом наборе данных, обратитесь к официальной документации.
inputs(x) — это векторы с 64 измерениями или значениями. Каждый входной вектор описывает одно изображение. Каждое из 64 значений представляет один пиксель изображения. Входные значения — это целые числа от 0 до 16, в зависимости от оттенка серого для соответствующего пикселя. outputs(y) каждого наблюдения является целое число от 0 до 9, соответствует цифре на изображении. Всего существует десять классов, каждый из которых соответствует одному изображению.
Шаг 1. Импортируйте пакеты
Вам нужно будет импортировать Matplotlib, NumPy, а также несколько функций и классов из scikit‑learn:
Это оно! У вас есть все функции, необходимые для выполнения классификации.
Шаг 2а: Получите данные
Теперь у вас есть данные. Вот как выглядят x и y :
Это ваши данные, с которыми нужно работать. x — это многомерный массив с 1797 строками и 64 столбцами. Он содержит целые числа от 0 до 16. y — одномерный массив с 1797 целыми числами от 0 до 9.
Шаг 2b: разделение данных
Хорошая и широко распространенная практика — разделить набор данных, с которым вы работаете, на два подмножества. Это обучающий набор и тестовый набор. Это разделение обычно выполняется случайным образом. Вы должны использовать обучающий набор в соответствии с вашей моделью. После того, как модель найдена, вы оцениваете ее характеристики с помощью набора для испытаний. Важно не использовать тестовый набор в процессе обучения модели. Такой подход позволяет объективно оценить модель. Один из способов разделить ваш набор данных на обучающий и тестовый — применить train_test_split():
Шаг 2c: масштабирование данных
Стандартизация — это процесс преобразования данных таким образом, что среднее значение каждого столбца становится равным нулю, а стандартное отклонение каждого столбца равно единице. Таким образом, вы получите одинаковый масштаб для всех столбцов. Сделайте следующие шаги для стандартизации ваших данных:
Рекомендуется стандартизировать входные данные, которые вы используете для логистической регрессии, хотя во многих случаях в этом нет необходимости. Стандартизация может улучшить производительность вашего алгоритма. Это помогает, если вам нужно сравнить и интерпретировать веса. Это важно, когда вы применяете штрафы, потому что алгоритм на самом деле штрафует за большие значения весов.
.fit_transform() помещает экземпляр StandardScaler в массив, переданный в качестве аргумента, преобразует этот массив и возвращает новый стандартизованный массив. Теперь x_train — это стандартизированный входной массив.
Шаг 3. Создайте модель и обучите её
Когда вы работаете с проблемами с более чем двумя классами, вы должны указать параметр multi_class в LogisticRegression. Он определяет, как решить проблему:
Это параметры вашей модели. Теперь она определена и готов к следующему шагу.
Шаг 4: Оцените модель
Вы должны оценить свою модель аналогично тому, что вы делали в предыдущих примерах, с той разницей, что вы в основном будете использовать x_test и y_test, которые не используются для обучения. Если вы решили стандартизировать x_train, то полученная модель полагается на масштабированные данные, поэтому x_test также следует масштабировать с помощью того же экземпляра StandardScaler :
Фактически, вы можете получить два значения точности: одно получено с помощью обучающего набора, а другое — с помощью набора тестов. Было бы неплохо сравнить эти два, поскольку ситуация, когда точность обучающего набора намного выше, может указывать на переобучение. Точность набора тестов более важна для оценки валидности на невидимых данных, поскольку она не является предвзятой.
Вы можете получить матрицу ошибок с confusion_matrix() :
Полученная матрица ошибок имеет большие размеры. В данном случае у него 100 номеров. Это ситуация, когда было бы действительно полезно визуализировать её:
Вот вам визуальное представление матрицы ошибок, полученное этим кодом:
Это тепловая карта, которая иллюстрирует матрицу ошибок с числами и цветами. Вы можете видеть, что оттенки фиолетового представляют небольшие числа (например, 0, 1 или 2), в то время как зеленый и желтый показывают гораздо большие числа (27 и выше).
Цифры на главной диагонали (27, 32,…, 36) показывают количество правильных прогнозов из тестового набора. Например, есть 27 изображений с нулем, 32 изображения с одним и так далее, которые правильно классифицированы. Остальные числа соответствуют неверным предсказаниям. Например, цифра 1 в третьей строке и первом столбце показывает, что есть одно изображение с номером 2, ошибочно классифицированным как 0.
В заключение,вы можете получить отчет о классификации в виде строки или словаря с помощью метода classification_report() :
В этом отчете представлена дополнительная информация, например, поддержка и точность классификации каждой цифры.
За пределами логистической регрессии в Python
Логистическая регрессия — это фундаментальный метод классификации. Это относительно несложный линейный классификатор. Несмотря на свою простоту и популярность, бывают случаи (особенно с очень сложными моделями), когда логистическая регрессия не работает. В таких обстоятельствах вы можете использовать другие методы классификации:
К счастью, существует несколько всеобъемлющих библиотек Python для машинного обучения, которые реализуют эти методы. Например, пакет scikit‑learn, который вы видели здесь в действии, реализует все вышеупомянутые методы,за исключением нейронных сетей.
Для всех этих методов scikit‑learn предлагает подходящие классы с такими методами, как model.fit(), model.predict_proba(), model.predict(), model.score() и так далее. Вы можете комбинировать их с train_test_split(), confusion_matrix(), classification_report() и другими.
Нейронные сети (включая глубокие нейронные сети) стали очень популярными для задач классификации. Такие библиотеки, как TensorFlow, PyTorch или Keras предлагают подходящую, производительную и мощную поддержку для этих типов моделей.
Заключение
Теперь вы знаете, что такое логистическая регрессия и как ее можно реализовать для классификации с помощью Python. Вы использовали множество пакетов с открытым исходным кодом, включая NumPy, для работы с массивами и Matplotlib для визуализации результатов. Вы также использовали scikit‑learn и StatsModels для создания, подгонки, оценки и применения моделей.
В общем-то, логистическая регрессия в Python имеет простую и удобную реализацию. Обычно он состоит из следующих шагов:
Вы прошли долгий путь в понимании одной из важнейших областей машинного обучения! Если у вас есть вопросы или комментарии, пожалуйста, оставьте их в разделе комментариев ниже.