☰分类导航

机器学习/实战案例
课程进度 67% · 第8/11章第8/11章 · 标签 1/3
— 1 —

电商用户流失预测

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

数据准备


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

特征工程


```python
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['流失标记']
```
python
1
import pandas as pd
2
import numpy as np
3
from datetime import datetime
4
 
5
# 1. 加载数据
6
df = pd.read_csv('user_behavior.csv')
7
 
8
# 2. 时间特征处理
9
df['注册时间'] = pd.to_datetime(df['注册时间'])
10
df['最近登录'] = pd.to_datetime(df['最近登录'])
11
 
12
# 计算用户注册时长(天)
13
df['注册时长'] = (datetime.now() - df['注册时间']).dt.days
14
 
15
# 计算最近登录距离现在的时间(天)
16
df['最近登录间隔'] = (datetime.now() - df['最近登录']).dt.days
17
 
18
# 3. 用户行为特征
19
# 计算用户活跃度
20
df['活跃度'] = df['浏览时长'] / df['最近登录间隔']
21
 
22
# 计算购买频率
23
df['购买频率'] = df['购买次数'] / df['注册时长']
24
 
25
# 计算平均消费金额
26
df['平均消费'] = df['消费金额'] / df['购买次数']
27
 
28
# 4. 特征选择
29
features = [
30
'注册时长', '最近登录间隔', '购买次数', '消费金额',
31
'浏览时长', '收藏数', '购物车数', '活跃度',
32
'购买频率', '平均消费'
33
]
34
 
35
X = df[features]
36
y = df['流失标记']
— 2 —

模型训练与评估


```python
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)
```
python
1
from sklearn.model_selection import train_test_split
2
from sklearn.preprocessing import StandardScaler
3
from sklearn.ensemble import RandomForestClassifier
4
from sklearn.metrics import classification_report, roc_auc_score
5
import xgboost as xgb
6
 
7
# 1. 数据预处理
8
X_train, X_test, y_train, y_test = train_test_split(
9
X, y, test_size=0.2, random_state=42
10
)
11
 
12
# 标准化特征
13
scaler = StandardScaler()
14
X_train_scaled = scaler.fit_transform(X_train)
15
X_test_scaled = scaler.transform(X_test)
16
 
17
# 2. 训练模型
18
# 随机森林
19
rf_model = RandomForestClassifier(
20
n_estimators=100,
21
max_depth=5,
22
random_state=42
23
)
24
rf_model.fit(X_train_scaled, y_train)
25
 
26
# XGBoost
27
xgb_model = xgb.XGBClassifier(
28
n_estimators=100,
29
max_depth=5,
30
learning_rate=0.1,
31
random_state=42
32
)
33
xgb_model.fit(X_train_scaled, y_train)
34
 
35
# 3. 模型评估
36
models = {
37
'随机森林': rf_model,
38
'XGBoost': xgb_model
39
}
40
 
41
for name, model in models.items():
42
pred = model.predict(X_test_scaled)
43
proba = model.predict_proba(X_test_scaled)[:, 1]
44
 
45
print(f"\n{name}模型评估:")
46
print(classification_report(y_test, pred))
47
print(f"AUC分数: {roc_auc_score(y_test, proba):.3f}")
48
 
49
# 4. 特征重要性分析
50
rf_importance = pd.DataFrame({
51
'特征': features,
52
'重要性': rf_model.feature_importances_
53
}).sort_values('重要性', ascending=False)
54
 
55
print("\n特征重要性:")
56
print(rf_importance)

模型部署与应用


```python
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%}")
```
python
1
import joblib
2
import pandas as pd
3
from datetime import datetime
4
 
5
# 1. 保存模型
6
joblib.dump(rf_model, 'churn_prediction_model.pkl')
7
joblib.dump(scaler, 'feature_scaler.pkl')
8
 
9
# 2. 预测函数
10
def predict_churn(user_data):
11
# 加载模型和标准化器
12
model = joblib.load('churn_prediction_model.pkl')
13
scaler = joblib.load('feature_scaler.pkl')
14
 
15
# 特征工程
16
user_data['注册时长'] = (datetime.now() - pd.to_datetime(user_data['注册时间'])).dt.days
17
user_data['最近登录间隔'] = (datetime.now() - pd.to_datetime(user_data['最近登录'])).dt.days
18
user_data['活跃度'] = user_data['浏览时长'] / user_data['最近登录间隔']
19
user_data['购买频率'] = user_data['购买次数'] / user_data['注册时长']
20
user_data['平均消费'] = user_data['消费金额'] / user_data['购买次数']
21
 
22
# 选择特征
23
features = [
24
'注册时长', '最近登录间隔', '购买次数', '消费金额',
25
'浏览时长', '收藏数', '购物车数', '活跃度',
26
'购买频率', '平均消费'
27
]
28
 
29
# 标准化特征
30
X = scaler.transform(user_data[features])
31
 
32
# 预测
33
churn_prob = model.predict_proba(X)[:, 1]
34
 
35
return churn_prob
36
 
37
# 3. 使用示例
38
new_user = pd.DataFrame({
39
'注册时间': ['2023-06-01'],
40
'最近登录': ['2024-01-20'],
41
'购买次数': [3],
42
'消费金额': [800],
43
'浏览时长': [90],
44
'收藏数': [2],
45
'购物车数': [1]
46
})
47
 
48
churn_probability = predict_churn(new_user)
49
print(f"用户流失概率: {churn_probability[0]:.2%}")
RandomForestXGBoostAUC特征工程部署