导航菜单

机器学习实战案例

电商用户流失预测

项目背景

电商平台需要预测哪些用户可能会流失,以便及时采取挽留措施。本项目使用机器学习方法,基于用户的历史行为数据,预测用户在未来30天内是否会流失。

数据准备

# 用户行为数据示例
用户ID  注册时间    最近登录  购买次数  消费金额  浏览时长  收藏数  购物车数  流失标记
001     2023-01-01  2024-01-15  5        1000     120       3       2        0
002     2023-02-01  2024-01-20  8        2000     180       5       3        0
003     2023-03-01  2024-01-25  2        500      60        1       1        1
...

特征工程

import pandas as pd
import numpy as np
from datetime import datetime

# 1. 加载数据
df = pd.read_csv('user_behavior.csv')

# 2. 时间特征处理
df['注册时间'] = pd.to_datetime(df['注册时间'])
df['最近登录'] = pd.to_datetime(df['最近登录'])

# 计算用户注册时长(天)
df['注册时长'] = (datetime.now() - df['注册时间']).dt.days

# 计算最近登录距离现在的时间(天)
df['最近登录间隔'] = (datetime.now() - df['最近登录']).dt.days

# 3. 用户行为特征
# 计算用户活跃度
df['活跃度'] = df['浏览时长'] / df['最近登录间隔']

# 计算购买频率
df['购买频率'] = df['购买次数'] / df['注册时长']

# 计算平均消费金额
df['平均消费'] = df['消费金额'] / df['购买次数']

# 4. 特征选择
features = [
    '注册时长', '最近登录间隔', '购买次数', '消费金额',
    '浏览时长', '收藏数', '购物车数', '活跃度',
    '购买频率', '平均消费'
]

X = df[features]
y = df['流失标记']

模型训练与评估

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, roc_auc_score
import xgboost as xgb

# 1. 数据预处理
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 标准化特征
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 2. 训练模型
# 随机森林
rf_model = RandomForestClassifier(
    n_estimators=100,
    max_depth=5,
    random_state=42
)
rf_model.fit(X_train_scaled, y_train)

# XGBoost
xgb_model = xgb.XGBClassifier(
    n_estimators=100,
    max_depth=5,
    learning_rate=0.1,
    random_state=42
)
xgb_model.fit(X_train_scaled, y_train)

# 3. 模型评估
models = {
    '随机森林': rf_model,
    'XGBoost': xgb_model
}

for name, model in models.items():
    pred = model.predict(X_test_scaled)
    proba = model.predict_proba(X_test_scaled)[:, 1]
    
    print(f"\n{name}模型评估:")
    print(classification_report(y_test, pred))
    print(f"AUC分数: {roc_auc_score(y_test, proba):.3f}")

# 4. 特征重要性分析
rf_importance = pd.DataFrame({
    '特征': features,
    '重要性': rf_model.feature_importances_
}).sort_values('重要性', ascending=False)

print("\n特征重要性:")
print(rf_importance)

模型部署与应用

import joblib
import pandas as pd
from datetime import datetime

# 1. 保存模型
joblib.dump(rf_model, 'churn_prediction_model.pkl')
joblib.dump(scaler, 'feature_scaler.pkl')

# 2. 预测函数
def predict_churn(user_data):
    # 加载模型和标准化器
    model = joblib.load('churn_prediction_model.pkl')
    scaler = joblib.load('feature_scaler.pkl')
    
    # 特征工程
    user_data['注册时长'] = (datetime.now() - pd.to_datetime(user_data['注册时间'])).dt.days
    user_data['最近登录间隔'] = (datetime.now() - pd.to_datetime(user_data['最近登录'])).dt.days
    user_data['活跃度'] = user_data['浏览时长'] / user_data['最近登录间隔']
    user_data['购买频率'] = user_data['购买次数'] / user_data['注册时长']
    user_data['平均消费'] = user_data['消费金额'] / user_data['购买次数']
    
    # 选择特征
    features = [
        '注册时长', '最近登录间隔', '购买次数', '消费金额',
        '浏览时长', '收藏数', '购物车数', '活跃度',
        '购买频率', '平均消费'
    ]
    
    # 标准化特征
    X = scaler.transform(user_data[features])
    
    # 预测
    churn_prob = model.predict_proba(X)[:, 1]
    
    return churn_prob

# 3. 使用示例
new_user = pd.DataFrame({
    '注册时间': ['2023-06-01'],
    '最近登录': ['2024-01-20'],
    '购买次数': [3],
    '消费金额': [800],
    '浏览时长': [90],
    '收藏数': [2],
    '购物车数': [1]
})

churn_probability = predict_churn(new_user)
print(f"用户流失概率: {churn_probability[0]:.2%}")