考虑应用程序:
- 我们有一组用户和项目。
- 用户可以对不同的项目执行不同的操作类型(例如浏览、点击、点赞等)。
- 用户和项目为每种操作类型累积一个“配置文件”。
- 对于用户而言,此类配置文件是他们执行给定操作类型的项目列表
- 对于项目,此类配置文件是对其执行给定操作类型的用户列表
- 我们假设累积的配置文件定义了未来的行动。
- 我们希望使用监督学习(概率估计分类)来预测用户将采取的行动
考虑以下问题:
- 这些配置文件可能非常稀疏(数百万个项目和 1 亿个用户),直接将它们用作特征是不可行的
- 我们想计算维度 < 300 的“压缩”配置文件(特征配置文件?:)),然后可以有效地存储并提供给不同的分类算法
- 在您说“对历史数据使用截断的 SVD/折叠吉布斯采样/随机投影”之前,请先对我说一下。
- 进入概念漂移。
- 新项目和用户一直被引入系统。
- 老用户流失。
- 旧物品流失。
- 在某些时候,有些商品的大多数用户在历史数据中从未见过,而用户只有新鲜商品。
- 在你说“定期重新训练”之前,请记住,我们在管道中有一个分类器,它被教导过“历史”分解,新的分解可以为输出向量的单元分配完全不同的“含义”(abs(decompose_v1(sample)[ 0] - decompose_v2(sample)[0]) >> epsilon) 使该分类器无法使用。
一些要求:
- 预测服务必须 24/7 全天候可用。
- 预测时间不能超过 15 毫秒,并且应该使用最多 4 个 cpu 核心(最好只有一个)
到目前为止我的一些想法:
我们可以在新的分解上重新训练分类器,但这意味着我们必须在整个训练数据集(以及我们想要预测的事件发生时的配置文件快照)和整个数据库(所有当前配置文件)加上存储它。
为了完成这项工作,我们必须有第二个数据库来存储分解的配置文件,一旦新的重新训练模型准备好并且所有配置文件都已分解,该数据库将被热交换。
这种方法在计算资源和存储资源上都非常低效(这是昂贵的存储,因为检索必须超快)
- 我们可以像解决方案 1 中那样重新训练分类器。但是做分解 ad_hoc。
- 这对分解的速度施加了很多限制(单个样本的计算时间必须为亚毫秒)。
- 除非我们添加额外的缓存层,否则这会进行大量冗余计算(尤其是对于项目配置文件)。
- 这避免了以额外的预测延迟和额外的缓存层复杂性为代价的流失用户/项目的冗余存储和冗余计算。
<---- 请帮帮我
- 我们可以使用在线学习算法之一,如 VFT 或蒙德里安森林作为分类器——因此不再需要重新训练 + 很好地处理概念漂移。
- 我们需要一个满足严格要求的在线分解算法:a)至少一部分输出向量在增量(批次)之间应该是稳定的。b) 它可以引入新特征来解释数据中的新变化,但应该以可控的速率这样做 c) 如果遇到新用户/项目,则不应中断
问题/行动要点:
- 请评估我提出的解决方案并提出替代方案
- 请提供适用于在线学习和在线分解(如果存在)的算法,如备选方案 3 中所述。最好使用具有足够抽象层的高效 python/scala/java 实现,以便在 Web 服务中使用它们(python 脚本接受文本文件作为数据集的价值将远低于 scikit 模块)
- 请提供处理类似问题的相关文献的链接/描述可能适用的算法
- 请分享您在处理类似问题时学到的经验/注意事项/提示
一些您可能会发现有用的背景阅读:
免责声明:我们的应用不是严格的广告转化预测,一些问题如稀有性不适用。我们要预测的事件有 8 个类别,并且发生在用户浏览项目的时间的 0.3%-3% 左右。