AI時代系列(1) 機器學習三部曲: 🔹 第一部:《機器學習 —— AI 智慧的啟航》
69/100 第七週:機器學習專案實作
69. 客戶流失預測 📉 找出即將流失的客戶,提前挽回!
客戶流失預測 📉
找出即將流失的客戶,提前挽回,提升企業營收與用戶黏著!
________________________________________
🔎 一、專案目標
• 利用機器學習模型預測「哪些客戶有可能即將流失」
• 幫助企業提早鎖定高風險客戶,進行精準挽留行銷
• 廣泛應用於電信、金融、訂閱制平台、電商等產業
________________________________________
🌟 二、應用場景與價值
產業 / 平台 : 應用舉例
電信公司 : 預測近期可能取消門號的用戶
銀行 / 保險 : 預測即將停用信用卡或保單的客戶
訂閱平台(Netflix、Spotify) : 預測會取消訂閱的用戶
電商平台 : 預測長期不活躍或可能流失的會員
________________________________________
🛠 三、核心技術與建模流程
1️⃣ 常見特徵設計
特徵範例 說明
活躍天數 : 最近 30 天登入或使用次數
交易次數 / 金額 : 最近 3 個月消費頻率和金額
客服聯絡紀錄 : 投訴或負評次數
會員等級變化 : 是否降級、VIP 資格取消等
續約或訂閱行為 : 續約次數、退訂記錄
2️⃣ 建模技術
邏輯迴歸(Logistic Regression) : 簡單直觀,可解釋特徵影響力
隨機森林 / XGBoost : 效果強大,處理高維數據與非線性關係
神經網路(MLP) : 適合大量特徵場景
深度學習(RNN / LSTM) : 適合有行為序列的時間序列特徵
________________________________________
💻 四、Python 簡易實作範例(以 XGBoost 為例)
python
import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score
from xgboost import XGBClassifier
# 1️⃣ 產生 100 筆虛擬資料(5 個特徵,流失比例 15%)
X, y = make_classification(
n_samples=100,
n_features=5,
n_informative=3,
n_redundant=0,
n_repeated=0,
weights=[0.85], # 0.85 留存、0.15 流失
class_sep=1.0,
random_state=42
)
# 轉成 DataFrame(可省略,僅為示範欄位名稱)
feature_names = [f"Feature{i+1}" for i in range(X.shape[1])]
data = pd.DataFrame(X, columns=feature_names)
data["Churn"] = y
print("📊 資料前 5 筆:\n", data.head())
# 2️⃣ 特徵 / 標籤切分
X = data.drop("Churn", axis=1)
y = data["Churn"]
# 3️⃣ 訓練 / 測試分割(30% 測試,保持比例)
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.3,
stratify=y,
random_state=42
)
# 4️⃣ 建立 XGBoost 分類器
# scale_pos_weight ≈ (負樣本數 / 正樣本數) = (0.85 / 0.15) ≈ 5.7
pos_weight = (y_train == 0).sum() / (y_train == 1).sum()
model = XGBClassifier(
n_estimators=200,
max_depth=3,
learning_rate=0.1,
subsample=0.8,
colsample_bytree=0.8,
scale_pos_weight=pos_weight,
eval_metric="logloss",
random_state=42
)
model.fit(X_train, y_train)
# 5️⃣ 預測與評估
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]
print("\n=== Classification Report ===")
print(classification_report(y_test, y_pred, digits=3))
print("AUC-ROC:", roc_auc_score(y_test, y_prob).round(3))
這段程式碼示範「以 XGBoost 預測客戶流失」的完整流程:先用 make_classification 隨機產生 100 筆、5 個特徵的資料,其中約 15 % 樣本標記為流失 (Churn = 1),模擬真實業務中的不平衡情況。接著將資料分成 70 % 訓練集與 30 % 測試集,並計算 scale_pos_weight(= 訓練集中負樣本數 ÷ 正樣本數)來告訴 XGBoost 必須加重少數流失樣本的學習權重。模型以 200 顆樹、最大深度 3、學習率 0.1 等參數訓練完成後,對測試集進行分類與機率預測,最後輸出 classification_report(包含 Precision、Recall、F1)與 AUC‑ROC 分數,用來評估模型整體區分留存/流失的能力。
模型在 測試資料上的表現解讀如下:
• 整體準確率 93.3 %:大部分樣本被正確分類。
• Churn = 1(流失客戶)
o Recall = 1.00 → 所有實際流失的 4 位客戶全數被抓到(零漏判)。
o Precision = 0.67 → 預測為流失的 6 人中,有 2 人其實未流失,仍有些「假警報」。
• Churn = 0(留存客戶)
o Precision = 1.00、Recall = 0.923 → 幾乎沒有把留存客戶誤判為流失。
• AUC ROC = 0.962:曲線下面積接近 1,代表模型對留存/流失的區分能力非常強。
總結:模型成功偵測所有流失客戶(召回率 100 %),同時保持高整體準確度;若想進一步減少假警報,可微調阈值或進行特徵/參數優化。
________________________________________
📈 五、重點處理 - 不平衡問題(Churn 通常 < 10%)
✅ 使用 SMOTE 進行過取樣
✅ 調整 class_weight 或 scale_pos_weight
✅ 選擇 AUC-ROC 作為主要評估指標
________________________________________
🎯 六、可視化與商業洞察
✅ 特徵重要性排名(如「最近消費下降幅度」最關鍵)
✅ 流失風險分層(高、中、低風險客戶)
✅ 可生成流失預警清單交給業務部門精準行銷
________________________________________
📌 七、產業應用價值
✅ 提高用戶留存,降低行銷成本
✅ 精準設計優惠方案,挽回高價值客戶
✅ 提升企業營收與品牌忠誠度
✅ 支援企業客戶關係管理(CRM)系統升級
________________________________________
✅ 八、總結金句:
📉 掌握客戶流失風險,就是掌握企業營收的命脈!
________________________________________
😎