共计 1950 个字符,预计需要花费 5 分钟才能阅读完成。
一、数据挖掘的起点:脏数据清洗实战
电商场景的原始用户行为日志通常存在三大问题:

- 字段缺失 :约 15% 的 user_id 字段为空,30% 的点击事件缺少时间戳
- 噪声干扰 :存在测试账号产生的异常数据(如单日点击量超过 10 万次)
- 格式混乱 :时间戳包含多种时区格式(UTC+ 8 和 Unix 时间戳混用)
使用 Pandas 进行数据清洗的核心操作:
# 处理缺失值(删除无效行 + 填充默认值)df = df.dropna(subset=['user_id']) # 关键 ID 不能缺失
df['click_duration'] = df['click_duration'].fillna(0) # 未记录时长按 0 处理
# 过滤异常数据(基于业务常识)normal_range = df['daily_clicks'].quantile(0.99) # 取 99 分位数作为阈值
df = df[df['daily_clicks'] < normal_range]
# 统一时间格式
import pytz
df['event_time'] = pd.to_datetime(df['event_time']).dt.tz_convert('Asia/Shanghai')
二、特征工程:用 RFM 模型量化用户价值
RFM 模型是分析用户行为的经典框架:
- Recency:最近一次访问距今的天数
- Frequency:最近 30 天访问频次
- Monetary:历史累计消费金额
代码实现示例:
# 计算 RFM 特征
current_date = pd.to_datetime('2023-08-01', utc=True)
rfm = df.groupby('user_id').agg(recency=('event_time', lambda x: (current_date - x.max()).days),
frequency=('event_id', 'count'),
monetary=('order_amount', 'sum')
)
# 分箱离散化(5 等分)rfm['r_score'] = pd.qcut(rfm['recency'], 5, labels=False)
rfm['f_score'] = pd.qcut(rfm['frequency'], 5, labels=False)
rfm['m_score'] = pd.qcut(rfm['monetary'], 5, labels=False)
三、模型对比:决策树 vs 逻辑回归
数据准备关键点
- 类别特征必须进行独热编码(One-Hot Encoding)
- 数值特征需要标准化(StandardScaler)
- 务必先拆分训练集 / 测试集再处理
from sklearn.model_selection import train_test_split
# 先拆分再预处理!X_train, X_test, y_train, y_test = train_test_split(features, label, test_size=0.2)
scaler = StandardScaler().fit(X_train[numeric_cols]) # 只用训练集统计量
X_train[numeric_cols] = scaler.transform(X_train[numeric_cols])
X_test[numeric_cols] = scaler.transform(X_test[numeric_cols]) # 相同转换
性能对比结果
| 指标 | 决策树 | 逻辑回归 |
|---|---|---|
| 准确率 | 0.82 | 0.78 |
| AUC-ROC | 0.85 | 0.81 |
| 训练速度 (s) | 0.3 | 1.2 |
决策树更适合处理非线性关系,但需要注意防止过拟合(设置 max_depth=5)
四、避坑指南:数据泄漏的典型场景
- 时间穿越问题 :用未来数据预测过去
- 错误做法:用全量数据计算 RFM 特征后拆分数据集
-
正确做法:按时间先后划分训练 / 测试集
-
预处理陷阱 :
- 标准化时使用全量数据均值方差(应仅用训练集)
- 在交叉验证时在每折内部重复上述错误
五、扩展应用:文本数据的特征工程
同样的方法论可迁移到社交媒体分析:
- 将 RFM 模型调整为 LAST 模型:
- L(Latest Post Time)
- A(Activity Frequency)
- S(Social Connections)
-
T(Text Complexity)
-
用 TF-IDF 替代数值特征:
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(max_features=500)
text_features = tfidf.fit_transform(df['post_content'])
通过这个完整案例,我们实践了从原始数据到可运行模型的每个关键步骤。建议读者尝试用自己熟悉的业务数据复现流程,特别注意避免数据泄漏这个新手最容易踩的坑。
正文完
