Menu
CoddyTech

Отток клиентов

Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 58 из 58.

Сервис доставки наборов для приготовления еды каждую неделю отправляет коробки. В файле subscribers.csv отслеживаются 300 клиентов и отмечается, отменили ли они подписку в течение двух месяцев. Пропущенные коробки — один из тревожных признаков:

Доля отменивших подписку в зависимости от числа пропущенных коробок за последние 3 месяца: 15% при 0 пропущенных, 36% при 1, 60% при 2, 61% при 3 и 86% при 4 или более

Команда хочет звонить клиентам из группы риска до того, как они уйдут. Одного признака недостаточно, поэтому лес учтёт их все.

Глубину нужно настроить, а ROC-кривая покажет, насколько хорошо оценки риска ранжируют пользователей по вероятности отмены подписки.

challenge icon

Задание

Сложно

prep содержит этапы обработки; программа считывает глубины деревьев в depths.

  1. Выдели стратифицированную тестовую четверть, random_state=0.
  2. Выполни поиск по сетке: prep и лес из 100 деревьев (random_state=0), проверяя значения из depths, с 5 блоками на обучающих строках. Выведи лучшую глубину и точность CV.
  3. По вероятностям отмены подписки на тестовой выборке выведи AUC и список для звонков: вероятности не ниже 0.5.
  4. Построй ROC-кривую с меткой forest, пунктирную диагональ coin toss и легенду; покажи график.

Для другой службы и глубин 3, 5:

Best depth: 3 (CV accuracy 0.761)
Test AUC: 0.802
Call list: 21 customers, 15 of them really cancelled

ROC-кривая с заголовком «Кто отменит подписку?»; сплошная кривая леса резко поднимается выше пунктирной диагонали подбрасывания монеты, рядом легенда

Затем Coddy опишет твою кривую.

Попробуйте сами

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_curve, roc_auc_score

subscribers = pd.read_csv("subscribers.csv")
numbers = ["months_subscribed", "boxes_skipped", "complaints", "monthly_price", "delivery_rating"]
text = ["plan", "channel"]
X = subscribers[numbers + text]
y = subscribers["churned"]

# Ветви, как в Prepare the Data
number_steps = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
text_steps = make_pipeline(SimpleImputer(strategy="constant", fill_value="unknown"), OneHotEncoder())
prep = ColumnTransformer([("numbers", number_steps, numbers), ("words", text_steps, text)])

# Глубины деревьев, которые нужно попробовать
n = int(input())
depths = []
for i in range(n):
    depths.append(int(input()))

fig, ax = plt.subplots()
ax.set_title("Who Will Cancel?")
ax.set_xlabel("False positive rate")
ax.set_ylabel("Recall")

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение с учителем

Потренируйтесь самостоятельно: Онлайн-компилятор Python