数据竞赛深度解析来了!

这次我们聚焦『新用户预测』任务,手把手带大家从0到1拆解赛题。

无论你是刚入门的小白还是寻求启发的老手,这篇解析都值得一看!👇
#数据科学 #机器学习 #赛事解析 #新手教学

赛事地址: 2025 iFLYTEK AI开发者大赛

🎯 Part 1: 我们的任务是什么?
简单说,就是构建一个【新老用户识别器】。这在机器学习里叫 #二分类问题 (Binary Classification)。你的模型需要根据用户行为,精准判断 is_new_did 是 1 (新用户) 还是 0 (老用户)。

💡 Part 2: 我们需要注意什么?
赛方给了用户行为、设备、地理位置等数据。有两个关键字段:

  1. common_ts (时间戳): 能挖出用户活跃周期、首次/末次行为等关键信息。

  2. udmap (自定义属性): JSON格式,里面藏着 botId 等重要信息,需要解析才能用,千万别错过!
    #特征工程 #EDA

📈 Part 3: 评审规则
关键指标是 #f1_score,而不是准确率!为什么?因为新老用户数量可能极不均衡。F1分数要求你平衡好两件事:

  • 查准率 (Precision): 别把老用户错判成新用户。

  • 查全率 (Recall): 别漏掉任何一个真正的新用户。
    找到平衡点才能拿高分!

🔑 制胜关键:特征工程是数据挖掘项目的关键!
这类比赛,70%的精力要花在 #特征工程 上。模型只是最后的临门一脚。记住,common_ts (时间) 和 udmap (JSON) 这两个字段是你的突破口,需要你花式操作,把原始信息变成模型能“吃”的数值特征。
#数据挖掘

🚀 Part 4: 行动指南 & 总结

  1. 数据探索 (EDA): 先别急着写模型,把数据看透!

  2. 特征工程: 重点处理时间和JSON字段。

  3. 建立基线 (Baseline): 用简单模型跑个分,作为后续优化的起点。

#机器学习入门 #实践

下面简单和大家分享一下我的思路:

核心流程图:

数据洞察 (EDA) → 特征工程 (三层构建) → 模型训练 (异构双模) → 模型融合 → 后处理

Phase 1: 数据洞察与基础规则 

  1. 深度探索 (EDA):

    • 分析训练集和测试集在各个特征(如did, mid, device_brand, channel等)上的分布是否一致。第三名发现高度一致,这给了我们信心,说明线下验证是可靠的。

    • 关键洞察复现: 重点分析用户属性 X1X8 (假设udmap解析后或其它字段是这类特征)。将这些特征组合起来,观察其与目标 is_new_did 的关系。

  2. 构建“用户群组”黄金特征: 这是第三名方案的精髓。相似属性的用户,其新老身份也可能相似。

    ​
    # 将多个特征拼接成一个唯一的“用户群组”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: 三层特征工程

目标: 构建一个宽广且有深度的特征体系。

  1. 第一层:基础处理 (Baseline Features)

    • 时间特征:common_ts 提取小时、星期几、是否周末、一天中的哪个时间段(早/中/晚)等。

    • 类别特征:mid, eid, device_brand 等进行标签编码(Label Encoding)或独热编码(One-Hot Encoding)。

  2. 第二层:统计特征 (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+周几)再做统计,可以衍生出上千维特征。

  3. 第三层:创新特征

    核心思想:一个用户的属性,可以由他“邻居”的属性来定义。

    考虑时间衰减:在计算相邻标签时,给时间更近的指标特征更高的权重。

    • 计算相邻的“标签”信息:对于一个用户A,找到他的所有邻居,计算这些邻居中新用户(is_new_did=1)的比例。这个比例就是一个极强的特征。

    • 找到用户的“相邻”对象:可以基于user_group或者共享同一个IP地址、设备ID等来定义。

Phase 3: 异构模型训练与融合 

目标: 利用不同模型的优势互补,提升稳定性和最终上限。

  1. 模型一:梯度提升树 (如 LightGBM)

    • 角色: 主力模型。对统计类数值特征、处理过的类别特征效果极佳。

    • 优点: 跑得快,效果好,是表格类比赛的王者。

  2. 模型二:神经网络 (Neural Network)

    • 角色: 奇兵。专门用来处理ID类高基数特征。

    • 处理方式:

      • ID类特征 (如did, mid, eid, user_group): 使用嵌入层 (Embedding Layer) 将其映射到低维向量空间,捕捉其深层语义关系。

      • 数值类特征 (如统计特征): 进行归一化 (Normalization) 或标准化 (Standardization)。

      • 结构: 将嵌入后的向量和处理过的数值向量拼接起来,输入到几层全连接网络(Dense Layer)中。

  3. 模型融合 (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分数最高的那个点,然后用它来处理最终的预测概率。

目前我还在尝试最后的刷榜尝试,所以分数得等我的下一篇推文了~

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐