机器学习实战案例
电商用户流失预测
项目背景
电商平台需要预测哪些用户可能会流失,以便及时采取挽留措施。本项目使用机器学习方法,基于用户的历史行为数据,预测用户在未来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%}")