Menu
CoddyTech

Khách hàng rời bỏ

Thuộc phần Học có giám sát trong hành trình Machine Learning của Coddy. Bài học 58 trên 58.

Một dịch vụ giao bộ nguyên liệu nấu ăn theo tuần. subscribers.csv theo dõi 300 khách hàng và việc họ có hủy dịch vụ trong vòng hai tháng hay không. Bỏ qua các hộp hàng là một dấu hiệu cảnh báo:

Tỷ lệ khách hàng hủy dịch vụ theo số hộp hàng đã bỏ qua trong 3 tháng gần nhất: 15% khi bỏ qua 0 hộp, 36% khi bỏ qua 1 hộp, 60% khi bỏ qua 2 hộp, 61% khi bỏ qua 3 hộp và 86% khi bỏ qua từ 4 hộp trở lên

Nhóm muốn gọi cho những khách hàng có nguy cơ rời đi trước khi họ rời đi. Một dấu hiệu là chưa đủ, vì vậy mô hình rừng sẽ cân nhắc tất cả các dấu hiệu.

Cần điều chỉnh độ sâu của mô hình, và đường cong ROC sẽ cho thấy điểm rủi ro xếp hạng những người sẽ hủy tốt đến đâu.

challenge icon

Thử thách

Khó

prep chứa các bước xử lý dữ liệu; chương trình đọc độ sâu của cây vào depths.

  1. Tách một phần tư dữ liệu làm tập kiểm tra, có phân tầng, với random_state=0.
  2. Tìm kiếm lưới trên prep cùng một rừng gồm 100 cây (random_state=0) qua các giá trị trong depths, dùng 5 phần chia trên các hàng dữ liệu huấn luyện. In độ sâu tốt nhất và độ chính xác CV.
  3. Dựa vào xác suất khách hàng hủy dịch vụ trong tập kiểm tra, in AUC và danh sách cần gọi, gồm những người có xác suất từ 0.5 trở lên.
  4. Vẽ đường cong ROC với nhãn forest, đường chéo nét đứt coin toss và chú giải, rồi hiển thị biểu đồ.

Với một dịch vụ khác và các độ sâu 3, 5:

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

Đường cong ROC có tiêu đề Who Will Cancel? với đường cong forest liền nét tăng nhanh vượt lên trên đường chéo coin toss nét đứt và có chú giải

Sau đó, Coddy mô tả đường cong của bạn.

Tự làm thử

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

# Các luồng xử lý, như trong phần 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)])

# Các độ sâu của cây cần thử
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")

# Viết code của bạn bên dưới
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Học có giám sát

Tự luyện tập: Trình biên dịch Python online