Пошаговая логистическая регрессия в python

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

Данные – User_Data

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

магистрант, кафедра информационных технологий МУИТ,

Республика Казахстан, г. Алматы

Аннотация. Логистическая регрессия на данный момент является одним из основных алгоритмов в решении задач классификаций в машинном обучении. В данной статье проведен обзор данного алгоритма и его применение в создании модели при помощи языка программирования Python.

Ключевые слова: машинное обучение, логистическая регрессия, алгоритм, глубокое обучение, линейная регрессия, статистика.

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

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

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

  • Задачи регрессии. Решают проблемы вещественного предсказания.
  • Задачи классификации. Решают проблемы категориального предсказания.
  • Задачи кластеризации. Решают проблемы разбиения входных данных на категории.

Классификация является одной из самых популярных типов задач где машинное обучение прекрасно справляется. Приблизительно 70 % задач в машинном обучении относятся к типу задач классификаций.

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

Логистическая регрессия — метод построения линейного классификатора, который позволяет оценивать вероятность принадлежности объекта к определенным классам [1, с. 56].

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

Отличие от линейной регрессией

Главное отличие логистической регрессии от линейной является то, что в логистической регрессии ответ является конкретной константой. Тогда как в линейной регрессии ответ предсказания имеет непрерывный вид. В качестве примера к линейной регрессии можно отнести решение задачи покупки товара клиентом, а в логистической регрессии примером может послужить предсказание цены на товар, акцию, дом. Зависимую переменную в логистической регрессии традиционно кодируют как 0–1, где 0 обозначает отсутствие какой-то характеристики, а 1 – ее наличие [6, с. 297].

Логистическая регрессия в расчетах использует метод максимального правдоподобия (maximum likelihood estimation), тогда как линейная регрессия использует метод наименьших квадратов. «Данный метод является весьма эффективным средством решения задачи оценивания параметров случайного процесса по данным наблюдений при известном виде законов распределения соответствующих случайных выборок, зависящих от оцениваемых параметров» [2, с. 357]. Метод был проанализирован, рекомендован и значительно популяризирован Р. Фишером между 1912 и 1922 годам. Р. Фишер с 1912 по 1922 годов активно анализировал, рекомендовал и популяризовал. На данный является одним из самых популярных методов оценке в статистике.

Виды логистической регрессии

Логистическая регрессия может быть трех видов:

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

Требования к данным

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

  • Независимость. Каждый испытуемый не должен зависеть от других испытуемых.
  • Линейность. Между хотя бы одной из непрерывных независимых переменных и логитом зависимой переменной должна наблюдаться линейная зависимость.
  • Отсутствие мультиколлинеарности. Независимые переменные не должны быть слишком связаны между собой.
  • Нет полного разделения. Значение одной переменной нельзя точно предсказать по значению другой переменной.
Читайте также:  Как открыть все элементы панели управления

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

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

В качестве примера будем решать задачу по определению будет ли у пациента диабет или нет. Для решения данной задачи нам понадобится:

  • Язык программирования Python версии 3.6.
  • Библиотека Pandas. Это программная библиотека на языке Python для обработки и анализа данных
  • Библиотека машинного обучения Scikit-learn для языка программирования Python.

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

Рисунок 1. Импорт данных

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

Рисунок 2. Определение зависимых и независимых значений

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

  1. Данные для тренировки (trait dataset)
  2. Данные для проверки (test dataset)

Рисунок 3. Разбивка данных

В scikit-learn имеет метод train_test_split позволяющий один набор данных разделить на необходимые 2 набора данных. Параметр test_size определяет в какой пропорций разделять основной набор данных.

Завершающим шагом является создание объекта класса LogisticRegression. LogisticRegression это класс в библиотеке scikit-learn, который реализует всю необходимую логику логистической регрессии.

Рисунок 4. Создание и обучение модели

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

Список литературы:

  1. Sebastian Raschka, Vahid Mirjalili. Python Machin Learning, 2015
  2. И.К. Волков, СМ. Зуев, Г.М. Цветкова. Случайные процессы, 1999
  3. Newsom. I. Data Analysis II: Logistic Regression, 2015
  4. Э. Ллойд, У. Ледерман. Справочник по прикладной статистике, 1989.
  5. И. Елисеева, М. Юзбашева. Общая теория статистики.
  6. С. Бослаф. Статистика для всех, 2015

Линейная регрессия применяется для анализа данных и в машинном обучении. Постройте свою модель на Python и получите первые результаты!

Регрессия ищет отношения между переменными.

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

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

Таким же способом можно установить математическую зависимость между ценами домов в определённой области, количеством комнат, расстоянием от центра и т. д.

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

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

Зависимые данные называются зависимыми переменными, выходами или ответами.

Независимые данные называются независимыми переменными, входами или предсказателями.

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

Общей практикой является обозначение данных на выходе – ?, входных данных – ?. В случае с двумя или более независимыми переменными, их можно представить в виде вектора ? = (?₁, …, ?ᵣ), где ? – количество входных переменных.

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

Где она вообще нужна?

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

Читайте также:  Заводы в японии список

Линейная регрессия – одна из важнейших и широко используемых техник регрессии. Эта самый простой метод регрессии. Одним из его достоинств является лёгкость интерпретации результатов.

Постановка проблемы

Линейная регрессия некоторой зависимой переменной ? на набор независимых переменных ? = (?₁, …, ?ᵣ), где ? – это число предсказателей, предполагает, что линейное отношение между ? и ?: ? = ?₀ + ?₁?₁ + ⋯ + ?ᵣ?ᵣ + ?. Это уравнение регрессии. ?₀, ?₁, …, ?ᵣ – коэффициенты регрессии, и ? – случайная ошибка.

Линейная регрессия вычисляет оценочные функции коэффициентов регрессии или просто прогнозируемые весы измерения, обозначаемые как ?₀, ?₁, …, ?ᵣ. Они определяют оценочную функцию регрессии ?(?) = ?₀ + ?₁?₁ + ⋯ + ?ᵣ?ᵣ. Эта функция захватывает зависимости между входами и выходом достаточно хорошо.

Для каждого результата наблюдения ? = 1, …, ?, оценочный или предсказанный ответ ?(?ᵢ) должен быть как можно ближе к соответствующему фактическому ответу ?ᵢ. Разницы от ?ᵢ − ?(?ᵢ) для всех результатов наблюдений ? = 1, …, ? называются остатками. Регрессия определяет лучшие прогнозируемые весы измерения, которые соответствуют наименьшим остаткам.

Для получения лучших весов, вам нужно минимизировать сумму остаточных квадратов (SSR) для всех результатов наблюдений ? = 1, …, ?: SSR = Σᵢ(?ᵢ − ?(?ᵢ))². Этот подход называется методом наименьших квадратов.

Простая линейная регрессия

Простая или одномерная линейная регрессия – случай линейной регрессии с единственной независимой переменной ? = ?.

Реализация простой линейной регрессии начинается с заданным набором пар (зелёные круги) входов-выходов (?-?). Эти пары – результаты наблюдений. Наблюдение, крайнее слева (зелёный круг) имеет на входе ? = 5 и соответствующий выход (ответ) ? = 5. Следующее наблюдение имеет ? = 15 и ? = 20, и так далее.

Оценочная функция регрессии (чёрная линия) выражается уравнением ?(?) = ?₀ + ?₁?. Нужно рассчитать оптимальные значения спрогнозированных весов ?₀ и ?₁ для минимизации SSR и определить оценочную функцию регрессии. Величина ?₀, также называемая отрезком, показывает точку, где расчётная линия регрессии пересекает ось ?. Это значение расчётного ответа ?(?) для ? = 0. Величина ?₁ определяет наклон расчетной линии регрессии.

Предсказанные ответы (красные квадраты) – точки линии регрессии, соответствующие входным значениям. Для входа ? = 5 предсказанный ответ равен ?(5) = 8.33 (представленный крайним левыми квадратом).

Остатки (вертикальные пунктирные серые линии) могут быть вычислены как ?ᵢ − ?(?ᵢ) = ?ᵢ − ?₀ − ?₁?ᵢ для ? = 1, …, ?. Они представляют собой расстояния между зелёными и красными пунктами. При реализации линейной регрессии вы минимизируете эти расстояния и делаете красные квадраты как можно ближе к предопределённым зелёным кругам.

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

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

NumPy – фундаментальный научный пакет для быстрых операций над одномерными и многомерными массивами. Он облегчает математическую рутину и, конечно, находится в open-source.

Незнакомы с NumPy? Начните с официального гайда.

Пакет scikit-learn – это библиотека, широко используемая в машинном обучении. Она предоставляет значения для данных предварительной обработки, уменьшает размерность, реализует регрессию, классификацию, кластеризацию и т. д. Находится в open-source, как и NumPy.

Начните знакомство с линейными моделями и работой пакета на сайте scikit-learn.

Простая линейная регрессия со scikit-learn

Начнём с простейшего случая линейной регрессии.

Следуйте пяти шагам реализации линейной регрессии:

  1. Импортируйте необходимые пакеты и классы.
  2. Предоставьте данные для работы и преобразования.
  3. Создайте модель регрессии и приспособьте к существующим данным.
  4. Проверьте результаты совмещения и удовлетворительность модели.
  5. Примените модель для прогнозов.

Это общие шаги для большинства подходов и реализаций регрессии.

Шаг 1: Импортируйте пакеты и классы

Первым шагом импортируем пакет NumPy и класс LinearRegression из sklearn.linear_model :

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

Фундаментальный тип данных NumPy – это тип массива numpy.ndarray . Далее под массивом подразумеваются все экземпляры типа numpy.ndarray .

Класс sklearn.linear_model.LinearRegression используем для линейной регрессии и прогнозов.

Шаг 2 : Предоставьте данные

Вторым шагом определите данные, с которыми предстоит работать. Входы (регрессоры, ?) и выход (предсказатель, ?) должны быть массивами (экземпляры класса numpy.ndarray ) или похожими объектами. Вот простейший способ предоставления данных регрессии:

Читайте также:  Как включать музыку в scp

Теперь у вас два массива: вход x и выход y. Вам нужно вызвать .reshape() на x, потому что этот массив должен быть двумерным или более точным – иметь одну колонку и необходимое количество рядов. Это как раз то, что определяет аргумент (-1, 1).

Вот как x и y выглядят теперь:

Шаг 3: Создайте модель

На этом шаге создайте и приспособьте модель линейной регрессии к существующим данным.

Давайте сделаем экземпляр класса LinearRegression , который представит модель регрессии:

Эта операция создаёт переменную model в качестве экземпляра LinearRegression . Вы можете предоставить несколько опциональных параметров классу LinearRegression :

  • fit_intercept – логический ( True по умолчанию) параметр, который решает, вычислять отрезок ?₀ ( True ) или рассматривать его как равный нулю ( False ).
  • normalize – логический ( False по умолчанию) параметр, который решает, нормализовать входные переменные ( True ) или нет ( False ).
  • copy_X – логический ( True по умолчанию) параметр, который решает, копировать ( True ) или перезаписывать входные переменные ( False ).
  • n_jobs – целое или None (по умолчанию), представляющее количество процессов, задействованных в параллельных вычислениях. None означает отсутствие процессов, при -1 используются все доступные процессоры.

Наш пример использует состояния параметров по умолчанию.

Пришло время задействовать model . Сначала вызовите .fit() на model :

С помощью .fit() вычисляются оптимальные значение весов ?₀ и ?₁, используя существующие вход и выход (x и y) в качестве аргументов. Другими словами, .fit() совмещает модель. Она возвращает self – переменную model . Поэтому можно заменить две последние операции на:

Эта операция короче и делает то же, что и две предыдущие.

Шаг 4: Получите результаты

После совмещения модели нужно убедиться в удовлетворительности результатов для интерпретации.

Вы можете получить определения (?²) с помощью .score() , вызванной на model :

.score() принимает в качестве аргументов предсказатель x и регрессор y, и возвращает значение ?².

model содержит атрибуты .intercept_ , который представляет собой коэффициент, и ?₀ с .coef_ , которые представляют ?₁:

Код выше показывает, как получить ?₀ и ?₁. Заметьте, что .intercept_ – это скаляр, в то время как .coef_ – массив.

Примерное значение ?₀ = 5.63 показывает, что ваша модель предсказывает ответ 5.63 при ?, равным нулю. Равенство ?₁ = 0.54 означает, что предсказанный ответ возрастает до 0.54 при ?, увеличенным на единицу.

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

Как вы видите, пример похож на предыдущий, но в данном случае .intercept_ – одномерный массив с единственным элементом ?₀, и .coef_ – двумерный массив с единственным элементом ?₁.

Шаг 5: Предскажите ответ

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

Получите предсказанный ответ, используя .predict() :

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

Вот почти идентичный способ предсказать ответ:

В этом случае вы умножаете каждый элемент массива x с помощью model.coef_ и добавляете model.intercept_ в ваш продукт.

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

Измените количество измерений x до одного, и увидите одинаковый результат. Для этого замените x на x.reshape(-1) , x.flatten() или x.ravel() при умножении с помощью model.coef_ .

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

Здесь .predict() применяется на новом регрессоре x_new и приводит к ответу y_new . Этот пример удобно использует arange() из NumPy для генерации массива с элементами от 0 (включительно) до 5 (исключительно) – 0, 1, 2, 3, и 4.

О LinearRegression вы узнаете больше из официальной документации.

Теперь у вас есть своя модель линейной регрессии!