Datawhale AI夏令营第一期(机器学习方向)Task2笔记:用户新增预测挑战赛——从业务理解到技术实现
一、任务核心:业务与技术的“翻译”
本次Task聚焦“用户新增预测挑战赛”的核心逻辑,核心目标是锻炼“将业务问题转化为AI技术问题”的能力,具体包含两大能力:
- 业务透视眼:从“识别新增用户”的业务需求倒推特征设计逻辑
- 数据诊断术:通过可视化等手段挖掘特征中的有效信息
二、赛题核心认知:二分类任务的本质
1. 任务定义
“用户新增预测挑战赛”是由科大讯飞主办的二分类任务,需基于用户行为数据预测用户是否为新增用户(目标字段is_new_did
,1表示新增,0表示非新增),评价指标为F1分数(分数越高模型性能越好)。
2. 业务与技术价值
类型 | 具体价值 |
---|---|
行业价值 | 精准预测用户增长趋势、优化产品迭代方向;降低用户获取成本;为AI落地提供量化依据 |
技术价值 | 解决实际用户增长预测问题;验证AI在用户行为分析中的有效性;建立可复用方法论 |
3. 数据基础
- 输入数据:包含15个原始字段的用户行为事件记录,核心字段包括:
did
:用户唯一标识(关键)common_ts
:事件发生时间戳(时间特征来源)udmap
:事件自定义属性(JSON格式,含助手/插件ID)- 其他字段:设备品牌、网络类型、地域信息等基础属性
- 输出要求:CSV文件,仅含
is_new_did
列(值为0或1)
4. 数据关键特征(探索发现)
- 测试集中93%的用户(
did
)出现在训练集中(可直接复用已知标签) - 训练集中88%的用户标签为0(正负样本不平衡)
- 事件级数据需转化为用户级特征(需按
did
聚合)
三、解题核心:要点、难点与思路
1. 核心要点与难点
类别 | 具体内容 |
---|---|
核心要点 | 从事件级数据提取用户级特征;处理高维稀疏特征;平衡正负样本;捕捉时间敏感特征 |
难点 | 用户行为聚合(事件→用户);高维稀疏特征处理;样本不平衡;时间模式捕捉 |
2. 基础解题思路
- 模型选择:优先树模型(如LightGBM),原因是训练速度快、对高维稀疏特征处理友好
- 特征方向:时间特征(时段、行为间隔等)、用户行为聚合特征(行为次数、首次/末次行为时间等)
- 样本处理:利用“测试集与训练集用户重叠”特性——已知标签直接复用,未知标签建模预测
四、Baseline方案:从设计到实现
1. 方案设计逻辑
模块 | 具体设计 | 依据/优势 |
---|---|---|
特征设计 | 提取时间特征(时段、停留时长等) | 符合用户行为分析理论,捕捉行为模式 |
模型选择 | LightGBM | 稳定性高、训练效率快、对预处理需求低 |
验证方法 | 五折交叉验证 | 避免单次验证的随机性,提升模型评估可靠性 |
阈值优化 | 基于F1-score动态调整阈值 | 平衡精确率与召回率,适配样本不平衡场景 |
2. 核心优势与待改进点
类别 | 具体内容 |
---|---|
方案优势 | - 采用五折目标编码,避免数据泄露 - 基于LightGBM的并行训练,速度比XGBoost快3-5倍 |
待改进点 | - udmap (JSON字段)未充分解析- 缺乏特征重要性筛选 - 未处理设备品牌长尾分布 |
3. 核心代码逻辑
(1)交叉验证建模
通过分层K折(Stratified K-Fold)确保各折中正负样本比例一致,结合早停机制(early stopping)防止过拟合:
n_folds = 5
kf = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=42)
for fold, (train_idx, val_idx) in enumerate(kf.split(X_train, y_train)):
X_tr, X_val = X_train.iloc[train_idx], X_train.iloc[val_idx]
y_tr, y_val = y_train.iloc[train_idx], y_train.iloc[val_idx]
# 创建数据集
train_set = lgb.Dataset(X_tr, label=y_tr)
val_set = lgb.Dataset(X_val, label=y_val)
# 模型训练(早停机制)
model = lgb.train(
params, train_set,
num_boost_round=5000,
valid_sets=[train_set, val_set],
callbacks=[lgb.early_stopping(stopping_rounds=200), lgb.log_evaluation(200)]
)
(2)阈值优化(最大化F1)
默认0.5阈值未必最优,针对正样本稀少场景(如本任务),在0.1-0.4范围搜索最优阈值:
def find_optimal_threshold(y_true, y_pred_proba):
best_threshold = 0.5
best_f1 = 0
# 聚焦正样本稀少场景的候选阈值
for threshold in [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4]:
y_pred = (y_pred_proba >= threshold).astype(int)
f1 = f1_score(y_true, y_pred)
if f1 > best_f1:
best_f1 = f1
best_threshold = threshold
return best_threshold, best_f1
五、上分思路:快速提升方向
1. 特征工程优化
- 解析
udmap
:提取JSON中的botId
、pluginId
,构建用户使用的助手/插件数量、类型等特征 - 时间特征深化:用户首次/末次行为时间、行为间隔、活跃时段分布(如是否在工作日活跃)
- 用户行为聚合:按
did
聚合事件,计算行为次数、涉及模块/事件类型数量等
2. 数据利用优化
- 复用已知标签:测试集中与训练集重叠的
did
,直接使用训练集标签(无需预测) - 处理长尾分布:对设备品牌等长尾特征进行分组(如合并低频品牌为“其他”)
3. 模型与验证优化
- 特征筛选:基于特征重要性剔除无效特征,减少噪声
- 样本平衡:采用SMOTE等方法处理正负样本不平衡(需注意避免数据泄露)
- 模型融合:结合LightGBM与XGBoost、CatBoost等模型的预测结果
六、总结与收获
本次Task通过“用户新增预测”案例,系统学习了从业务理解到技术实现的全流程:
- 明确二分类任务的核心是“平衡精确率与召回率”(F1指标的意义)
- 掌握了基于用户行为数据的特征设计逻辑(时间特征、聚合特征)
- 理解了Baseline方案的设计思路(模型选择、交叉验证、阈值优化)
- 获得了上分的具体方向(特征深化、数据复用、模型优化)
后续将基于这些思路,进一步实践进阶的特征工程与模型调优方法。