Примечание. португальская версия этой статьи доступна по адресу « Como criar um modelo para predição de churn »

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

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

В этой статье используется набор данных о клиентах оттока телефонных компаний, доступный на Kaggle. И весь код для этого примера написан на python и доступен здесь.

Давайте начнем.

Набор данных

Для работы с набором данных воспользуемся библиотекой pandas. Сначала давайте прочитаем набор данных.

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

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

Набор данных относится к телекоммуникационной компании. Есть информация о клиентах, таких как Партнер, иждивенцы и т. Д., и об их контрактах, например PhoneService, MonthlyCharges и т. Д. Некоторые функции показывают, как долго клиент использовал услуга, такая как срок пребывания и TotalCharges, соответственно, означает / представляет время в месяцах, в течение которого клиент получает услугу, и общую сумму, уплаченную клиентом.

Теперь посмотрим на распределение оттока с помощью библиотеки seaborn.

Этикетка несбалансированная. У нас 27% оттока и 73% оттока в этом наборе данных. Это может быть проблемой для получения наилучших результатов от модели.

Мы можем использовать функцию head (), чтобы просмотреть первые 5 строк таблицы и увидеть ее данные.

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

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

Применим предварительную обработку сейчас.

Глядя на данные, мы видим, что некоторые функции имеют три уникальных значения, избыточные значения. Например, в функции MultipleLines у нас есть «Нет телефонной связи», однако у нас уже есть функция PhoneService с этой информацией, поэтому мы можем просто изменить ее на «Нет» и оставить два уникальных значения . Мы можем применить это к функциям OnlineBackup, OnlineSecurity, DeviceProtection, TechSupport, StreamingMovies и StreamingTV.

У нас есть некоторые числовые функции, мы можем использовать такие функции, как countplot () из seaborn и hist () из pandas, чтобы иметь представление об этом распределении данных и связи с меткой. .

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

Теперь у нас есть все категориальные функции, и мы можем использовать эти функции в этом формате, но некоторые алгоритмы принимают только числа, и для их проверки нам нужно перейти к числовым значениям. Для этого у нас есть несколько вариантов, таких как One-Hot Encoding и Label / Integer Encoding.

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

Чтобы применить изменения, мы можем использовать LabelEncoding из sklearn, чтобы создать целочисленную кодировку, и мы можем использовать get_dummies () из pandas, чтобы получить One-Hot Encoding.

Теперь мы можем увидеть взаимосвязь между функциями в очищенных данных с помощью функции heatmap () из библиотеки seaborn.

Модели

Теперь у нас есть данные, подготовленные для модели, нам просто нужно разделить данные для обучения и проверки модели. Для этого у нас есть train_test_split () из sklearn.

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

Теперь у нас есть обученная модель, и мы можем просто проверить ее с помощью метода pred () из моделей.

И мы видим результаты.

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

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

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

Заключение

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

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



использованная литература

Tds Feature Engineering

Прогнозирование: как решить проблему машинного обучения

Утечка данных в машинном обучении

Выбор правильного алгоритма машинного обучения

Как и когда использовать кривые ROC и кривые прецизионного вызова для классификации в Python