共计 2663 个字符,预计需要花费 7 分钟才能阅读完成。
数据集背景与结构分析
2023 年泰迪杯数据挖掘挑战赛 B 题数据集聚焦于某电商平台的用户行为与交易数据,旨在通过数据挖掘技术提升业务洞察力。数据集包含约 50 万条记录,涵盖用户基础属性、行为日志、交易明细三类核心数据表,字段间通过用户 ID 关联。

- 用户表(user_info):包含用户年龄、性别、注册时长等静态特征,其中约 8% 的年龄字段存在缺失
- 行为表(behavior_log):记录用户点击、收藏、加购等事件,时间跨度为连续 30 天,存在明显的时段集中现象
- 交易表(transaction):包含订单金额、商品类别、支付方式等字段,部分高额订单需验证是否为异常值
通过 pandas 的 describe() 方法快速查看数值字段分布,发现交易金额呈现右偏分布,适合进行对数转换。类别型字段如商品类别需检查类别不平衡问题。
数据预处理实战
缺失值处理
采用分层填充策略,对数值型字段用中位数填充,类别型字段用众数填充:
import pandas as pd
# 加载数据集
user_df = pd.read_csv('user_info.csv')
# 数值字段填充
num_cols = ['age', 'credit_score']
user_df[num_cols] = user_df[num_cols].fillna(user_df[num_cols].median())
# 类别字段填充
cat_cols = ['occupation']
user_df[cat_cols] = user_df[cat_cols].fillna(user_df[cat_cols].mode().iloc[0])
异常值检测
使用 IQR 方法识别交易金额异常:
trans_df = pd.read_csv('transaction.csv')
Q1 = trans_df['amount'].quantile(0.25)
Q3 = trans_df['amount'].quantile(0.75)
IQR = Q3 - Q1
# 定义异常值边界
lower_bound = Q1 - 1.5*IQR
upper_bound = Q3 + 1.5*IQR
# 过滤异常值
clean_df = trans_df[(trans_df['amount'] >= lower_bound) &
(trans_df['amount'] <= upper_bound)]
特征工程建议
时序特征构造
从行为日志中提取关键时序特征:
# 转换时间格式
behavior_df['timestamp'] = pd.to_datetime(behavior_df['timestamp'])
# 计算用户活跃天数
active_days = behavior_df.groupby('user_id')['timestamp'].nunique()
# 最近一次行为距今的天数
last_act = (behavior_df.groupby('user_id')['timestamp'].max() -
pd.Timestamp('2023-01-01')).dt.days
交叉特征生成
结合用户属性和行为数据构造交叉特征:
# 合并用户基础属性与行为统计
user_features = pd.merge(
user_df,
behavior_df.groupby('user_id').size().rename('total_actions'),
on='user_id'
)
# 构造性别与商品类别的交叉特征
gender_cate = pd.crosstab(index=trans_df['user_id'],
columns=trans_df['category'],
values=trans_df['amount'],
aggfunc='sum'
).add_prefix('gender_cate_')
建模思路与算法选型
问题类型分析
根据赛题要求,主要任务包含:
1. 用户价值预测(回归问题)
2. 高潜力用户识别(分类问题)
算法对比
| 算法类型 | 适用场景 | 本赛题优势 | 潜在缺点 |
|---|---|---|---|
| LightGBM | 结构化数据 | 处理类别特征高效 | 需调参 |
| XGBoost | 中小规模数据 | 抗过拟合能力强 | 内存消耗大 |
| CatBoost | 含类别特征数据 | 自动处理类别型 | 训练速度较慢 |
推荐代码框架:
from lightgbm import LGBMClassifier
from sklearn.model_selection import train_test_split
# 准备特征矩阵和标签
X = final_features.drop('target', axis=1)
y = final_features['target']
# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 初始化模型
model = LGBMClassifier(
n_estimators=500,
learning_rate=0.05,
max_depth=7
)
# 训练与评估
model.fit(X_train, y_train)
print("Test AUC:", roc_auc_score(y_test, model.predict_proba(X_test)[:,1]))
性能优化技巧
内存管理
使用 category 类型减少内存占用:
cat_cols = ['gender', 'city']
df[cat_cols] = df[cat_cols].astype('category')
并行计算
利用 joblib 加速特征工程:
from joblib import Parallel, delayed
def process_feature(col):
return df[col].apply(complex_transformation)
results = Parallel(n_jobs=4)(delayed(process_feature)(col) for col in feature_cols
)
避坑指南
常见问题与解决方案
- 数据泄露:确保特征构造时仅使用历史数据,可通过时间序列分割验证集
- 类别不平衡:采用 SMOTE 过采样或调整类别权重参数
- 特征冗余:使用方差阈值或相关性矩阵筛选特征
- 过拟合:早停法(early stopping)配合交叉验证
总结与延伸
通过本案例我们系统性地完成了从数据理解到建模优化的全流程。建议读者进一步尝试:
– 使用 t -SNE 进行高维特征可视化
– 试验 Transformer 架构处理时序行为数据
– 应用 Optuna 进行超参数自动优化
期待大家在实践中发现更多特征组合与模型创新的可能性,欢迎分享你的实验成果与改进思路。
正文完
发表至: 未分类
近一天内
