Как сделать прогноз в питоне

Добавил пользователь Валентин П.
Обновлено: 04.10.2024

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

Вступление

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

Основная концепция анализа последовательностей или анализа временных рядов

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

Рассмотрим следующий пример, чтобы понять прогноз последовательности. Здесь A, B, C, D — заданные значения, и вы должны предсказать значение E, используя модель прогнозирования последовательности.

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

Установка полезных пакетов

Для анализа данных временных рядов с использованием Python нам необходимо установить следующие пакеты:

Панды

Pandas — это библиотека с открытым исходным кодом, имеющая лицензию BSD, которая обеспечивает высокую производительность, простоту использования структуры данных и инструменты анализа данных для Python. Вы можете установить Pandas с помощью следующей команды —

Если вы используете Anaconda и хотите установить с помощью менеджера пакетов conda , вы можете использовать следующую команду:

hmmlearn

Это BSD-библиотека с открытым исходным кодом, которая состоит из простых алгоритмов и моделей для изучения скрытых марковских моделей (HMM) в Python. Вы можете установить его с помощью следующей команды —

Если вы используете Anaconda и хотите установить с помощью менеджера пакетов conda , вы можете использовать следующую команду:

PyStruct

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

CVXOPT

Используется для выпуклой оптимизации на основе языка программирования Python. Это также бесплатный программный пакет. Вы можете установить его с помощью следующей команды —

Если вы используете Anaconda и хотите установить с помощью менеджера пакетов conda , вы можете использовать следующую команду:

Панды: обработка, нарезка и извлечение статистики из данных временных рядов

Панды — очень полезный инструмент, если вам приходится работать с данными временных рядов. С помощью панд вы можете выполнить следующее —

Создайте диапазон дат с помощью пакета pd.date_range

Индекс панды с датами с помощью пакета pd.Series

Выполните повторную выборку с помощью пакета ts.resample

Создайте диапазон дат с помощью пакета pd.date_range

Индекс панды с датами с помощью пакета pd.Series

Выполните повторную выборку с помощью пакета ts.resample

пример

В следующем примере показано, как обрабатывать и разрезать данные временных рядов с помощью Pandas. Обратите внимание, что здесь мы используем данные по месячным колебаниям в Арктике, которые можно загрузить с сайта month.ao.index.b50.current.ascii и которые мы можем преобразовать в текстовый формат.

Обработка данных временных рядов

Для обработки данных временных рядов вам необходимо выполнить следующие шаги:

Первый шаг включает в себя импорт следующих пакетов —

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

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

На этом этапе мы создаем данные временных рядов с помощью Pandas Series, как показано ниже —

Введите путь к входному файлу, как показано здесь —

Теперь преобразуйте столбец в формат временных рядов, как показано здесь —

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

В этой статье вы узнаете, как можно проанализировать текучесть кадров с помощью библиотеки Python’s Scikit-Learn. Мы познакомим вас с Logistic Regression, Random Forest, и Support Vector Machine. Мы также рассмотрим точность моделей, построенных с помощью Machine Learning, и оценим направления дальнейшего развития. И все это мы сделаем в Python. Давайте начнем!

Предварительная обработка данных

Данные были загружены из Kaggle . Все достаточно просто. Каждая строка представляет сотрудника, каждый столбец содержит характеристики:

  • satisfaction_level (0-1)
  • last_evaluation (время, прошедшее с момента последней оценки в годах)
  • number_projects (количество выполненных проектов
  • average_monthly_hours (среднее количество рабочих часов за месяц)
  • time_spend_company (время работы в компании в годах)
  • work_accident (у сотрудника был несчастный случай на рабочем месте)
  • left (работник уволился (1 или 0))
  • promotion_last_5years (было ли у сотрудника повышение за последние 5 лет)
  • sales (отдел, в котором работает сотрудник)
  • salary (уровень заработной платы)

Названия столбцов:

['satisfaction_level', 'last_evaluation', 'number_project', 'average_montly_hours', 'time_spend_company', 'Work_accident', 'left', 'promotion_last_5years', 'sales', 'pay']

Пример данных:


Тип столбцов можно узнать следующим образом:


Наши данные полные, без пропущенных значений


Данные содержат 14999 сотрудников и 10 характеристик.

(14999, 10)

array([‘sales’, ‘accounting’, ‘hr’, ‘technical’, ‘support’, ‘management’,
‘IT’, ‘product_mng’, ‘marketing’, ‘RandD’], dtype=object)

Давайте объединим “technical”, “support” and “IT” вместе и назовем их “technical”.

После изменения это выглядит так:

[‘sales’ ‘accounting’ ‘hr’ ‘technical’ ‘management’ ‘product_mng’
‘marketing’ ‘RandD’]

Изучение данных

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


Согласно нашим данным, 3571 сотрудник ушел, а остались – 11428 работников.

Давайте получим представление чисел в этих двух классах:


Несколько наблюдений:

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



Визуализация данных

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

График текучести кадров по отделам


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

График сменяемости кадров в зависимости от среднего уровня заработной платы


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

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

Гистограмма числовых переменных


Создание фиктивных переменных для категориальных показателей

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

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

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

array([‘satisfaction_level’, ‘last_evaluation’, ‘number_project’,
‘average_montly_hours’, ‘time_spend_company’, ‘Work_accident’,
‘left’, ‘promotion_last_5years’, ‘department_RandD’,
‘department_accounting’, ‘department_hr’, ‘department_management’,
‘department_marketing’, ‘department_product_mng’,
‘department_sales’, ‘department_technical’, ‘salary_high’,
‘salary_low’, ‘salary_medium’], dtype=object)

“left” является конечной переменной, а все остальные – предикторы для прогнозирования.

Отбор признаков

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

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

[True True False False True True True True False True True False
False False False True True False]
[1 1 3 9 1 1 1 1 5 1 1 6 8 7 4 1 1 2]

[‘satisfaction_level’, ‘last_evaluation’, ‘time_spend_company’, ‘Work_accident’, ‘promotion_last_5years’, ‘department_RandD’, ‘department_hr’, ‘department_management’, ‘salary_high’, ‘salary_low’]

Logistic Regression Model

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=100, multi_class=’ovr’, n_jobs=1, penalty=’l2', random_state=None, solver=’liblinear’, tol=0.0001, verbose=0, warm_start=False)

Точность Logistic Regression Model: 0.771

Random Forest

RandomForestClassifier(bootstrap=True, class_weight=None, criterion=’gini’, max_depth=None, max_features=’auto’, max_leaf_nodes=None, min_impurity_split=1e-07, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, oob_score=False, random_state=None, verbose=0, warm_start=False)

Точность Random Forest: 0,988

Support Vector Machine

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma=’auto’, kernel=’rbf’,
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)

Точность Support Vector Machine: 0.909

Победитель… Random Forest, так ведь?

Cross Validation (перекрестная проверка)

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

Средняя точность 10-кратной кросс-валидации 0.977

Данный показатель близок по значению с показателем точности Random Forest.

Precision and recall

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

Random Forest



Logistic Regression




Support Vector Machine



Кривая ROC


Кривая ROC (receiver operating characteristic) является еще одним распространенным инструментом, используемым с бинарными классификаторами. Пунктирная красная линия представляет собой кривую ROC случайного классификатора. Подходящий классификатор располагается как можно дальше от этой линии (по направлению к верхнему левому углу).

Feature Importance (значимость признаков) для Random Forest Model

promotion_last_5years-0.20%
department_management-0.22%
department_hr-0.29%
department_RandD-0.34%
salary_high-0.55%
salary_low-1.35%
Work_accident-1.46%
last_evaluation-19.19%
time_spend_company-25.73%
satisfaction_level-50.65%

Согласно нашей модели Random Forest, выше по возрастанию представлены те признаки, которые влияют на уход сотрудников из компании.

Заключение

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

Прогнозирование временных рядов — это весьма популярная аналитическая задача. Для прогнозирования временных рядов в Python используют такие подходы, как ARIMA, ARCH и т. д. Но подбор параметров для ARIMA — сложный и трудоемкий процесс. Однако февраля 2017 года команда Core Data Science из Facebook выпустила новую библиотеку для работы с временными рядами — Prophet. Попробуем применить новую библиотеку и посмотрим на удобство в использовании и качество предсказания.

Будем прогнозировать колебания котировки валюты для пары UAH/USD. Prophet предоставляет API для Python и R, я использую Python. Установку необходимых библиотек произведем с помощью пакетного менеджера Сonda. Для анализа будем использовать данные за период 01.02.2012 / 05.09.2017.

Целевой переменной возьмем цену закрытия (Adj Close). Посмотрим, как выглядят исходные данные:


Подготовка исходных данных


Праздники

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

Построение прогноза

Интерфейс библиотеки полностью соответствует популярной библиотеке машинного обучения scikit-learn: создаем модель, обучаем ее с помощью метода .fit(), строим предсказание .predict(). Для обучения нужно передать DataFrame с колонками:

  • ds — время, формат поля должен быть datetime;
  • y — целевая переменная в числовом формате.

Для получения прогноза нужно передать новый DataFrame, содержащий столбец ds. Для этого в библиотеке есть функция make_future_dataframe, которая принимает параметр periods — период, для которого мы хотим получить прогноз и freq — частота временного ряда (значение по умолчанию — день).

Оценка качества модели

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

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

Прогноз

В виде прогноза Prophet вернет DataFrame с большим количеством столбцов. Наиболее интересные:

  • ds — временная метка для прогнозируемого значения;
  • yhat— прогнозируемое значение;
  • yhat_lower — нижняя граница прогноза;
  • yhat_upper — высшая граница прогноза.

Визуализация

Библиотека из коробки предоставляет удобные методы визуализации. Первый метод Prophet.plot отображает график прогноза:


Модель неплохо аппроксимирует исторические данные.

Второй метод Prophet.plot_components позволяет визуализировать отдельные компоненты: тренд, праздники, годовую и недельную сезонность:


Посмотрим на прогноз более подробно:


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

Выводы

  • Библиотека Prophet — удобный инструмент для прогнозирования временных рядов. Модель работает достаточно хорошо из коробки, при этом есть набор гиперпараметров, которые позволяют улучшить прогноз.
  • Отдельно стоит отметить встроенные возможности визуализации.
  • Из минусов — проект молодой, возможны какие-то неточности в работе. Неполная документация.
  • Задача прогнозировать колебания валюты — сложная. Особенно для украинской валюты в данный период времени.
  • Prophet хорошо аппроксимирует обучающую выборку. Стоит отметить и разумно выделенную годовую сезонность.
  • Полученные предсказания можно использовать как новый признак для других алгоритмов машинного обучения.

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

В избранное В избранном 0

Похожие статьи


50 комментариев

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

Легких путей не ищем :) Было интересно опробовать инструмент на сложном примере, а не на очевидном.

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

Ну, в общем, да. Работает, как и длинный список других аналогичных методов/пакетов.
Но, как по мне, топик очень важный. Он еще раз подчеркнул, что нет на DOU отдельного раздела для обсуждения задач DS, BD, AI и всего,что вокруг этого — ведь все таки это не программирование в традиционном понимании. А люди, которым это интересно — есть.
А может — даже не раздела, а отдельного форума, которого на просторах русскоязычного интернет тоже вроде — хотя это и очень странно — нет.

Ну так вносите свой вклад в развитие комьюнити ;) Будут обсуждения на форуме, будут статьи — сообщество будет развиваться.

Вы только что просто- напросто очередной раз подтвердили закон Парето.

Ігор Гомзяк Business Analyst / Attorney at law - Commercial Law в ЮКГ "Європейська правнича компанія" 06.06.2017 12:55

Стаття цікава, але прогноз ні. Власне — восени завши долар росте. В Україні — це багаторічна тенденція.

Те що прогноз підверджує наші спостереження, каже о гарній якості прогнозу :)
Тобто можно використовувати бібліотеку для аналізу інших даних с тенденціями яких ми не знайомі, чи використовувати в атоматичних системах.

вдохновились статьей на хабре? очень они похожи между собой

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

Ну, ахи и охи от желающих заработать на Форесксе малость поутихли. Теперь впору начать задавть вопросы профессиональные.
Итак — очередная библиотека для

Я не проводил сравнения с другими библиотеками. Но в публикации Sean J. Taylor, Benjamin Letham Forecasting at scale (где подробно описан принцип работы библиотеки) приводится график сравнение mean absolute percentage error для существующих подходов прогнозирования временных рядов, согласно которому Prophet имеет существенно более низкую ошибку.

А как она работает на процессах, которые действительно можно спрогнозировать?

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

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


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

Условия логистической регрессии

  • Бинарная логистическая регрессия требует, чтобы зависимая переменная также была бинарной.
  • Для бинарной регрессии фактор уровня 1 зависимой переменной должен представлять желаемый вывод.
  • Использоваться должны только значимые переменные.
  • Независимые переменные должны быть независимы друг от друга. Это значит, что модель должна иметь малую мультиколлинеарность или не иметь её вовсе.
  • Независимые переменные связаны линейно с логарифмическими коэффициентами.
  • Логистическая регрессия требует больших размеров выборки.

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

Данные

Набор данных взят с репозитория машинного обучения UCI и относится к прямым маркетинговым кампаниям (телефонный обзвон) португальского банковского учреждения. Цель классификации в прогнозировании успеха подписки клиента (1/0) на срочный депозит (переменная y). Загрузить этот набор данных можно здесь.

Эти данные предоставляют информацию о клиентах банка, которая включает 41,188 записей и 21 поле.


Вводные переменные

  1. age — возраст (число);
  2. job — вид должности (категории: “admin” (администратор), “blue-collar” (рабочий), “entrepreneur” (мелкий предприниматель), “housemaid” (горничная), “management” (руководитель), “retired” (на пенсии), “self-employed” (самозанятый), “services” (сфера услуг), “student” (учащийся), “technician” (техник), “unemployed” (не трудоустроен), “unknown” (неизвестно));
  3. marital — семейное положение (категории: “divorced” (разведён), “married” (замужем/женат), “single” (холост/не замужем), “unknown” (неизвестно));
  4. education — образование (категории: “basic.4y”, “basic.6y”, “basic.9y” (базовое), “high.school” (высшая школа), “illiterate” (без образования), “professional.course” (профессиональные курсы), “university.degree” (университетская степень), “unknown” (неизвестно));
  5. default — имеет ли просроченные кредиты (категории: “no” (нет), “yes” (да), “unknown” (неизвестно));
  6. housing — имеет ли жилищный кредит (категории: “no” (нет), “yes” (да), “unknown” (неизвестно));
  7. loan — имеет ли личный кредит (категории: “no” (нет), “yes” (да), “unknown” (неизвестно));
  8. contact — вид связи (категории: “cellular” (мобильный), “telephone” (стационарный));
  9. month — месяц последнего обращения (категории: “jan” (январь), “feb” (февраль), “mar” (март), …, “nov” (ноябрь), “dec” (декабрь));
  10. day_of_week — день недели последнего обращения (категории: “mon” (понедельник), “tue” (вторник), “wed” (среда), “thu” (четверг), “fri” (пятница));
  11. duration — продолжительность последнего обращения в секундах (число). Важно: этот атрибут оказывает сильное влияние на вывод (например, если продолжительность=0, тогда y=’no’). Продолжительность не известна до момента совершения звонка, а по его завершению y будет, очевидно, известна. Следовательно этот вводный параметр должен включаться только в целях эталонного тестирования, для получения же реалистичной модели прогноза его следует исключать.
  12. campaign — число обращений, установленных в процессе этой кампании и для этого клиента (представлено числом и включает последнее обращение);
  13. pdays — число дней, прошедших с момента последнего обращения к клиенту во время предыдущей кампании (число; 999 означает, что ранее обращений не было);
  14. previous — число обращений, совершённых до этой кампании (число);
  15. poutcome — итоги предыдущей маркетинговой кампании (категории: “failure” (провал), “nonexistent” (несуществующий), “success” (успех));
  16. emp.var.rate — коэффициент изменения занятости (число);
  17. cons.price.idx — индекс потребительских цен (число);
  18. cons.conf.idx — индекс потребительского доверия (число);
  19. euribor3m — 3-х месячная европейская межбанковская ставка (число);
  20. nr.employed — количество сотрудников (число).

Прогнозируемая переменная (желаемая цель):

y —подписался ли клиент на срочный вклад (двоично: “1” означает “Да”, “0” означает “Нет”).

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


Давайте сгруппируем “basic.4y”, “basic.9y” и “basic.6y” и назовём их “basic” (базовое).

После группировки мы получим следующие колонки:


Изучение данных


  • Процент не подписавшихся — 88,73458288821988;
  • Процент подписавшихся — 11,265417111780131.

Наши классы не сбалансированы, и соотношение не подписавшихся к подписавшимся составляет 89:11. Прежде чем мы перейдём к балансировке, давайте проведём дополнительное исследование.


Наблюдения:

  • Средний возраст потребителей, купивших срочный депозит, выше, чем тех, кто его не купил.
  • pdays (дни, прошедшие с момента последнего обращения к клиенту) по понятным причинам ниже для тех, кто купил депозит. Чем меньше показатель pdays, тем лучше память о последнем звонке и выше шансы успешной продажи.
  • На удивление, показатель campaigns (число обращений или звонков, сделанных во время текущей кампании) меньше для потребителей, купивших срочный депозит.

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




Частота покупки депозита во многом зависит от должности клиента. Следовательно этот показатель может послужить хорошим фактором прогноза итоговой переменной.


Семейное же положение не является существенным прогнозирующим фактором.


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


День недели может не являться хорошим прогнозирующим фактором.


Месяц может оказаться хорошим прогнозирующим фактором.


Большинство клиентов банка в этом наборе данных находятся в возрасте от 30 до 40 лет.


Poutcome (итоги предыдущей маркетинговой кампании) кажется хорошим прогнозирующим фактором.

Создание индикаторных переменных

Это переменные со всего двумя значениями — ноль и единица.

Наши итоговые колонки данных будут:


Over-Sampling при помощи SMOTE

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

  1. создаёт синтетические образцы на основе выборок минорного класса (не подписавшихся) вместо создания их копий;
  2. случайно выбирает одного из ближайших k-соседей и использует его для создания схожих, но случайно изменённых новых сведений.

Мы будем реализовывать SMOTE в Python.


Теперь у нас есть идеально сбалансированные данные. Вы могли заметить, что я выполнил over-sampling только для обучающих данных, поскольку в таком случае информация из тестовых данных не используется для создания синтетических сведений, и, следовательно, не произойдёт её утечки в обучающую модель.

Рекурсивное устранение признаков

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


При помощи RFE мы выбрали следующие признаки: “euribor3m”, “job_blue-collar”, “job_housemaid”, “marital_unknown”, “education_illiterate”, “default_no”, “default_unknown”, “contact_cellular”, “contact_telephone”, “month_apr”, “month_aug”, “month_dec”, “month_jul”, “month_jun”, “month_mar”, “month_may”, “month_nov”, “month_oct”, “poutcome_failure”, “poutcome_success”.

Реализация модели


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


Подгонка модели логистической регрессии


Прогнозирование результатов тестового набора и вычисление точности.

Точность классификатора логистической регрессии для тестового набора: 0,74.

Матрица ошибок

[[6124 1542]

[2505 5170]]

Результат показывает, что у нас 6124+5170 верных прогнозов и 2505+1542 ошибочных.

Вычисление точности, полноты, F-меры и поддержки

Приведу цитату из Scikit Learn:

Точность является соотношением tp/(tp + fp), где tp является числом верно-положительных, а fp — числом ложно-положительных. Точность — это интуитивно понятная способность классификатора не помечать выборку как положительную, если она отрицательна.

Полнота— это пропорция tp/(tp +fn), где tp представляет число верно-положительных результатов, а fn — число ложно-отрицательных. Полнота является интуитивно понятной способностью классификатора находить все положительные выборки.

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

Показатель F-бета определяет, насколько значимость полноты больше, чем точности, опираясь на фактор бета. Например, beta = 1.0 означает, что полнота и точность равно важны.

Поддержка — это число вхождений каждого класса в y_test.


Интерпретация: из всего тестового набора 74% рекламируемых срочных депозитов понравились клиентам. Из всего тестового набора 74% клиентов предпочли рекламируемые срочные депозиты.

ROC-кривая


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

Jupyter notebook, использованный для написания этой статьи, доступен здесь.

Читайте также: