共计 2105 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
用户行为数据是互联网企业最宝贵的资产之一,但这类数据往往存在几个典型问题:

-
高维度稀疏性 :用户行为记录通常包含大量离散特征(如点击的页面 ID、操作类型),经过 One-Hot 编码后维度急剧膨胀,但每个样本中非零值占比极低。
-
时间依赖性 :用户行为具有明显的时间序列特征,简单截取片段会损失上下文信息。
-
正负样本不均衡 :关键行为(如购买、注册)的发生频次远低于普通行为。
技术选型
针对用户行为数据的特点,主流分类算法表现对比:
- 逻辑回归 :训练速度快,可解释性强,但对非线性关系和特征交互捕捉能力弱
- 随机森林 :自动处理特征交互,抗过拟合能力强,但不适合高维稀疏数据
- XGBoost:内置缺失值处理,支持并行计算,在 Kaggle 竞赛中表现突出
建议优先选择 XGBoost 或 LightGBM 这类梯度提升树模型。
完整实现
数据预处理
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# 读取原始日志数据
df = pd.read_csv('user_behavior.csv')
# 处理缺失值
df['action_type'] = df['action_type'].fillna('unknown')
# 时间戳转换
df['event_time'] = pd.to_datetime(df['event_time'])
df['hour'] = df['event_time'].dt.hour
# 类别型特征编码
cat_cols = ['device_type', 'os_version']
for col in cat_cols:
le = LabelEncoder()
df[col] = le.fit_transform(df[col])
特征工程
from sklearn.feature_extraction.text import TfidfVectorizer
# 文本特征处理
tfidf = TfidfVectorizer(max_features=100)
page_title_vec = tfidf.fit_transform(df['page_title'])
# 构造时序特征
df['prev_action_interval'] = df.groupby('user_id')['event_time'].diff().dt.total_seconds()
# 选择最终特征
features = pd.concat([df[['hour', 'device_type']],
pd.DataFrame(page_title_vec.toarray())
], axis=1)
模型训练
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(features, df['label'], test_size=0.2, random_state=42)
# 处理样本不均衡
pos_ratio = y_train.mean()
scale_pos_weight = (1 - pos_ratio) / pos_ratio
# 训练模型
model = XGBClassifier(
max_depth=5,
learning_rate=0.1,
scale_pos_weight=scale_pos_weight,
n_estimators=100
)
model.fit(X_train, y_train)
模型评估
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
from sklearn.metrics import plot_roc_curve
# 输出分类报告
print(classification_report(y_test, model.predict(X_test)))
# 绘制 ROC 曲线
plot_roc_curve(model, X_test, y_test)
plt.title('ROC Curve')
plt.show()
生产建议
-
特征重要性分析 :
from xgboost import plot_importance plot_importance(model) plt.show() -
类别不平衡处理 :
- 上采样少数类(SMOTE 算法)
- 调整类别权重(如 XGBoost 的 scale_pos_weight 参数)
-
使用 F1-score 作为评估指标
-
模型部署 :
import joblib # 保存模型 joblib.dump(model, 'behavior_model.pkl') # 线上加载 clf = joblib.load('behavior_model.pkl')
延伸思考
- 尝试添加用户历史行为统计特征(如 7 天内的平均点击次数)
- 测试不同时间窗口对预测效果的影响
- 用 Optuna 进行超参数自动优化
学习资源
- 《Feature Engineering for Machine Learning》
- XGBoost 官方文档
- Kaggle 用户行为预测竞赛案例
正文完
