Отток клиентов
Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 58 из 58.
Сервис доставки наборов для приготовления еды каждую неделю отправляет коробки. В файле subscribers.csv отслеживаются 300 клиентов и отмечается, отменили ли они подписку в течение двух месяцев. Пропущенные коробки — один из тревожных признаков:
Команда хочет звонить клиентам из группы риска до того, как они уйдут. Одного признака недостаточно, поэтому лес учтёт их все.
Глубину нужно настроить, а ROC-кривая покажет, насколько хорошо оценки риска ранжируют пользователей по вероятности отмены подписки.
Задание
Сложноprep содержит этапы обработки; программа считывает глубины деревьев в depths.
- Выдели стратифицированную тестовую четверть,
random_state=0. - Выполни поиск по сетке:
prepи лес из 100 деревьев (random_state=0), проверяя значения изdepths, с 5 блоками на обучающих строках. Выведи лучшую глубину и точность CV. - По вероятностям отмены подписки на тестовой выборке выведи AUC и список для звонков: вероятности не ниже 0.5.
- Построй 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Затем 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")
# Напишите свой код ниже
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Обучение с учителем
1Ваша первая модель
Обучение на примерахОбучающая и тестовая выборкиОбучение и предсказаниеОценка моделиПовторение: сортировщик семян4Логистическая регрессия
Предсказания «да» или «нет»Порог принятия решенияВеса как свидетельстваНесколько классовПовторение: спам-фильтр2Метод ближайших соседей
Как работает k-NNВыбор kГраницы принятия решенийМасштабирование признаков для поиска соседейПовторение: соседи для вин5Оценка классификаторов
Матрица ошибокТочность и полнотаF1-мераНесбалансированные классыROC-кривыеПовторение: скрининговый тест8Кросс-валидация
K-блочная проверкаСправедливое сравнение моделейПоиск по сеткеПовторение: ремонт скейтбордов11Проект: виды пингвинов
Знакомство с пингвинамиПодготовка данныхВыбор моделиНастройка лучшей моделиЗапуск моделиПотренируйтесь самостоятельно: Онлайн-компилятор Python