低频少样本长验证周期场景下的算法设计( 二 )


▌特征工程
低频少样本长验证周期场景下的算法设计文章插图
在特征工程中 , 特征类型主要有以下三类 , 信息来源类 ( 渠道/线索来源、多设备、多账号 , 刷量识别 ) , 用户 App 行为类 ( 核心页面点击行为 , 转换行为 , 留存行为 ) , 用户粘性类 ( 前 n 日活跃频次 , 活跃时长 , 最近一次活跃时间 , 访问深度、广度 ) 。 其中信息渠道来源是指用户是来自百度、Feed 还是广点通等平台 , 多设备、多账号等主要是用于衡量用户是否发生过作弊行为 。 另外用户 App 行为类特征是占比最大的一类特征 , 主要是指用户在留电话号码前 , 在 App 上点击 , 浏览、搜索等行为 。 用户粘性类特征是一些抽象统计特征 , 其中访问深度是指 App 页面用户访问最长的路径 , 广度是指 App 中用户使用的功能的数量 。
在 Deep Learning 的场景中 , 一般来说用 Embedding 就 ok 了 , 不需要较多的特征处理 , 但在当前场景下特征处理相对来说比较重要 。 常见的数值处理有 IV ( 离散化 )、页面比率 ( 页面转化 ) 。 什么是页面转化?用户搜索 query 词后 App 显示楼盘信息 , 如果用户搜索五次后发生一次点击行为,那么对于这个用户来说 , 该用户的搜索点击的转化率就20% 。 特征组合主要有主成分分析 ( PCA ) , 树模型决策路径 , 以及完整的功能点击路径 。 另外还进行了特征有效性分析 , 重要包括方差 , 覆盖率分析 , 互信息 , 独立性分析 , 离群值分析等 。 离群值分析在当前场景中影响较大 , 因为在样本量较少的情况 , 离群点容易误导模型 。 下图是数据集中覆盖率前10的特征 , 包括渠道表示 ( op_type ) , 城市 ( city ) , 用户设备数量 ( user_id_cnt ) , 来源 ( source ) , 渠道数量 ( channel_cnt ) , 最近一次渠道来源 ( last_channel ) , 上一次留电话距离现在的天数 ( leave_phone_days ) , App 中 banner 点击的数量 ( banner_click_cnt ) , App 启动次数 ( app_start_cnt ) 等 。
▌模型调优
低频少样本长验证周期场景下的算法设计文章插图
模型主要采用的传统模型 LR , RF , XGBoost , LightGBM , 也尝试了使用 Deep Learning 等 , 但实际效果不足传统模型好 。 另外在当前场景下样本数量少 , 而且版本更新迭代较快的时候 , 常遇到数据分布不一致的问题 。 产品迭代了新的版本 , 但离线模型训练用的还是老的数据 , 而线上用的新版数据 , 这种信息不一致将拉低模型效果 。 当前采用的方案是时间窗口滚动的方式来训练模型 , 并尽量剔除一些可能因为版本导致数据不一致的特征 , 努力将影响降至最低 。 在无论是深度学习还是传统机器学习 , 参数调优的方法大同小异 , 主要是网格搜索 ( Grid Search )、人工参数调优以及分城市阈值调优 。 网格搜索调优虽然不能一定找到最优解 , 但是花费时间较短 。 另外也尝试了一些贝叶斯优化的方法 , 它和 grid search 有的区别就是它会根据你上一轮做算法的参数结果去帮你去选择最有可能产生最优算法参数方向去优化这个参数 , 换句话说做了几轮参数实验并获取对应结果 , 利用贝叶斯优化自动帮忙寻找参数优化方向 。 贝叶斯寻优容易陷入局部最优 , 需要多进行几轮贝叶斯优化 , 手工选出里面的极大值 。 分城市阈值调优是遇到的另一个更严重的一个场景 , 由于居理新房在全国十多个一二线的城市有业务 , 而且每个城市有自己不同的特点 , 用户的行为都不一样 , 在模型分类时 , 每个城市应采取不同的阈值 。 在本身整体数据量就不多情况 , 每个城市的数据量更少 , 这种情况下要么将城市信息加入特征或者每个城市都分别训练一个模型 。
在做算法时 , 评估的值不一定是一些常用通用指标如 AUC , Top N 的点击率等 , 而是与业务比较契合的指标 。 采用通用指标来衡量算法刚开始可能还可以 , 但是一段时间后发现对业务帮助不大 , 指标虽然显示比较高 , 但最后并没有增加用户的收入 , 也没有提升用户的留存 。 只是说单独的就是算法本身还不错 , 所以很多时候更多需要的是找到真正跟业务结合的优化目标 。 经过多次思考和试验后 , 最后选了两类线索的带看召回率 ( Recall@30%、Recall@70% ) 的评估指标 。 模型输出概率需要选取阈值来判断线索是好的还是坏的 。 可以通过阈值选取 , 将不同比例的线索标成为好线索 。 比如说有一百个线索 , 从里面拿出来30个线索就30% , 最后这30个线索被带看或成交的比例能达到60% 。 就相当于30%里面有60%的比例是被召回出来了 , 这阈值选取的还是不错的 。 因为在现有算法中不可能保证每一个线索都是好的 , 通过某个阈值大于70%的线索是好线索 。 那么在这70%的线索里边 , 应该至少能召回90%的带看或者认购的线索 , 才能说明这个算法才是有意义的 。