Menu
CoddyTech

Abandono de clientes

Parte de la sección Aprendizaje supervisado del Journey de Machine Learning de Coddy. Lección 58 de 58.

Un servicio de kits de comida envía cajas semanalmente. subscribers.csv sigue a 300 clientes e indica si cancelaron en un plazo de dos meses. Las cajas omitidas son una señal de alerta:

Barras de la proporción de clientes que cancelaron según las cajas omitidas en los últimos 3 meses: 15% con 0 omitidas, 36% con 1, 60% con 2, 61% con 3 y 86% con 4 o más

El equipo quiere llamar a los clientes en riesgo antes de que se vayan. Una sola señal no es suficiente, así que un bosque las ponderará todas.

Es necesario ajustar su profundidad, y una curva ROC mostrará qué tan bien ordenan las puntuaciones de riesgo a quienes cancelan.

challenge icon

Desafío

Difícil

prep contiene los procesos; el programa lee las profundidades de los árboles en depths.

  1. Separa una cuarta parte estratificada para la prueba, con random_state=0.
  2. Realiza una búsqueda en cuadrícula de prep más un bosque de 100 árboles (random_state=0) entre los valores de depths, con 5 pliegues, usando las filas de entrenamiento. Imprime la mejor profundidad y la precisión de validación cruzada.
  3. A partir de las probabilidades de cancelación del conjunto de prueba, imprime el AUC y la lista de llamadas: probabilidades de 0.5 o más.
  4. Traza la curva ROC como forest, una diagonal discontinua de coin toss y una leyenda; muéstrala.

Para otro servicio y las profundidades 3, 5:

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

Una curva ROC titulada Who Will Cancel? con una curva forest continua que asciende pronunciadamente por encima de una diagonal discontinua de coin toss y una leyenda

Después, Coddy describe tu curva.

Pruébalo tú mismo

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"]

# Las rutas, como en 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)])

# Las profundidades del árbol que se van a probar
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")

# Escribe tu código a continuación
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Aprendizaje supervisado

Practica por tu cuenta: Compilador de Python online