科大讯飞AI大赛(机器学习方向)——Datawhale AI夏令营:用AI预测新增用户
【数据竞赛解析:新用户预测任务精要】 150字摘要: 本文深度解析新用户预测竞赛任务,核心是构建二分类模型识别新老用户。关键点包括:1)重点处理时间戳(common_ts)和JSON格式(udmap)数据;2)评估指标选用F1分数而非准确率,以平衡查准率和查全率;3)70%精力应投入特征工程,尤其要挖掘用户活跃周期和自定义属性。建议分四步:数据探索→特征处理→建立基线→模型优化,特别强调时间特征和
数据竞赛深度解析来了!
这次我们聚焦『新用户预测』任务,手把手带大家从0到1拆解赛题。
无论你是刚入门的小白还是寻求启发的老手,这篇解析都值得一看!👇
#数据科学 #机器学习 #赛事解析 #新手教学

赛事地址: 2025 iFLYTEK AI开发者大赛
🎯 Part 1: 我们的任务是什么?
简单说,就是构建一个【新老用户识别器】。这在机器学习里叫 #二分类问题 (Binary Classification)。你的模型需要根据用户行为,精准判断 is_new_did 是 1 (新用户) 还是 0 (老用户)。
💡 Part 2: 我们需要注意什么?
赛方给了用户行为、设备、地理位置等数据。有两个关键字段:
-
common_ts(时间戳): 能挖出用户活跃周期、首次/末次行为等关键信息。 -
udmap(自定义属性): JSON格式,里面藏着botId等重要信息,需要解析才能用,千万别错过!
#特征工程 #EDA
📈 Part 3: 评审规则
关键指标是 #f1_score,而不是准确率!为什么?因为新老用户数量可能极不均衡。F1分数要求你平衡好两件事:
-
查准率 (Precision): 别把老用户错判成新用户。
-
查全率 (Recall): 别漏掉任何一个真正的新用户。
找到平衡点才能拿高分!
🔑 制胜关键:特征工程是数据挖掘项目的关键!
这类比赛,70%的精力要花在 #特征工程 上。模型只是最后的临门一脚。记住,common_ts (时间) 和 udmap (JSON) 这两个字段是你的突破口,需要你花式操作,把原始信息变成模型能“吃”的数值特征。
#数据挖掘
🚀 Part 4: 行动指南 & 总结
-
数据探索 (EDA): 先别急着写模型,把数据看透!
-
特征工程: 重点处理时间和JSON字段。
-
建立基线 (Baseline): 用简单模型跑个分,作为后续优化的起点。
#机器学习入门 #实践
下面简单和大家分享一下我的思路:
核心流程图:
数据洞察 (EDA) → 特征工程 (三层构建) → 模型训练 (异构双模) → 模型融合 → 后处理
Phase 1: 数据洞察与基础规则
-
深度探索 (EDA):
-
分析训练集和测试集在各个特征(如
did,mid,device_brand,channel等)上的分布是否一致。第三名发现高度一致,这给了我们信心,说明线下验证是可靠的。 -
关键洞察复现: 重点分析用户属性
X1到X8(假设udmap解析后或其它字段是这类特征)。将这些特征组合起来,观察其与目标is_new_did的关系。
-
-
构建“用户群组”黄金特征: 这是第三名方案的精髓。相似属性的用户,其新老身份也可能相似。
# 将多个特征拼接成一个唯一的“用户群组”ID # astype(str) 确保所有列都是字符串,避免拼接错误 df['user_group'] = df[user_identity_cols].astype(str).agg('_'.join, axis=1) # 基于这个群组ID,可以衍生出强大的统计特征 # 例如:该群组的用户总数、新用户比例等 group_stats = df.groupby('user_group')['is_new_did'].agg(['count', 'mean']).rename(columns={'count':'group_size', 'mean':'group_new_user_ratio'}) df = df.merge(group_stats, on='user_group', how='left')
Phase 2: 三层特征工程
目标: 构建一个宽广且有深度的特征体系。
-
第一层:基础处理 (Baseline Features)
-
时间特征: 从
common_ts提取小时、星期几、是否周末、一天中的哪个时间段(早/中/晚)等。 -
类别特征: 对
mid,eid,device_brand等进行标签编码(Label Encoding)或独热编码(One-Hot Encoding)。
-
-
第二层:统计特征 (Systematic Features - 学习自第一名)
-
这是竞赛中的“体力活”,但极其有效。围绕核心实体(如
did,user_group,device_brand等)进行groupby,然后计算各种统计量。
# 少量代码示例: 构建用户行为统计特征 # 围绕'did'(用户ID)进行分组 user_behavior_stats = df.groupby('did').agg( # 该用户有多少次不同的操作 distinct_events=('eid', 'nunique'), # 该用户的活跃天数 active_days=('common_ts', lambda x: x.dt.day.nunique()), # 该用户的首次与末次行为间隔(小时) activity_span_hours=('common_ts', lambda x: (x.max() - x.min()).total_seconds() / 3600) ) df = df.merge(user_behavior_stats, on='did', how='left')思路扩展: 将不同的维度两两组合(如
did+mid,did+周几)再做统计,可以衍生出上千维特征。 -
-
第三层:创新特征
核心思想:一个用户的属性,可以由他“邻居”的属性来定义。
考虑时间衰减:在计算相邻标签时,给时间更近的指标特征更高的权重。-
计算相邻的“标签”信息:对于一个用户A,找到他的所有邻居,计算这些邻居中新用户(
is_new_did=1)的比例。这个比例就是一个极强的特征。 -
找到用户的“相邻”对象:可以基于
user_group或者共享同一个IP地址、设备ID等来定义。
-
Phase 3: 异构模型训练与融合
目标: 利用不同模型的优势互补,提升稳定性和最终上限。
-
模型一:梯度提升树 (如 LightGBM)
-
角色: 主力模型。对统计类数值特征、处理过的类别特征效果极佳。
-
优点: 跑得快,效果好,是表格类比赛的王者。
-
-
模型二:神经网络 (Neural Network)
-
角色: 奇兵。专门用来处理ID类高基数特征。
-
处理方式:
-
ID类特征 (如
did,mid,eid,user_group): 使用嵌入层 (Embedding Layer) 将其映射到低维向量空间,捕捉其深层语义关系。 -
数值类特征 (如统计特征): 进行归一化 (Normalization) 或标准化 (Standardization)。
-
结构: 将嵌入后的向量和处理过的数值向量拼接起来,输入到几层全连接网络(Dense Layer)中。
-
-
-
模型融合 (Ensemble):
-
将两个模型对测试集的预测概率进行加权平均。权重的选择可以通过线下验证集的表现来确定。
# 少量代码示例: 模型融合 # 我们已经得到了LGB和NN模型对测试集的预测概率 lgb_preds = model_lgb.predict_proba(test_features)[:, 1] nn_preds = model_nn.predict(test_features_for_nn).flatten() # 简单加权融合,权重可以基于线下验证效果调整 final_probabilities = 0.6 * lgb_preds + 0.4 * nn_preds
-
Phase 4: 后处理与提交
目标: 针对F1分数进行最后优化。
-
寻找最佳阈值 (Threshold): F1分数对预测的阈值非常敏感。不要直接用0.5作为分界线。你应该在线下验证集上循环测试不同的阈值(如从0.1到0.9,步长0.01),找到能让F1分数最高的那个点,然后用它来处理最终的预测概率。
目前我还在尝试最后的刷榜尝试,所以分数得等我的下一篇推文了~
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)