用于事件预测分类的在线/增量无监督降维

数据挖掘 分类 表现 降维 在线学习
2022-01-31 17:36:12

考虑应用程序:

  • 我们有一组用户和项目。
  • 用户可以对不同的项目执行不同的操作类型(例如浏览、点击、点赞等)。
  • 用户和项目为每种操作类型累积一个“配置文件”。
  • 对于用户而言,此类配置文件是他们执行给定操作类型的项目列表
  • 对于项目,此类配置文件是对其执行给定操作类型的用户列表
  • 我们假设累积的配置文件定义了未来的行动。
  • 我们希望使用监督学习(概率估计分类)来预测用户将采取的行动

考虑以下问题:

  • 这些配置文件可能非常稀疏(数百万个项目和 1 亿个用户),直接将它们用作特征是不可行的
  • 我们想计算维度 < 300 的“压缩”配置文件(特征配置文件?:)),然后可以有效地存储并提供给不同的分类算法
  • 在您说“对历史数据使用截断的 SVD/折叠吉布斯采样/随机投影”之前,请先对我说一下。
  • 进入概念漂移。
  • 新项目和用户一直被引入系统。
  • 老用户流失。
  • 旧物品流失。
  • 在某些时候,有些商品的大多数用户在历史数据中从未见过,而用户只有新鲜商品。
  • 在你说“定期重新训练”之前,请记住,我们在管道中有一个分类器,它被教导过“历史”分解,新的分解可以为输出向量的单元分配完全不同的“含义”(abs(decompose_v1(sample)[ 0] - decompose_v2(sample)[0]) >> epsilon) 使该分类器无法使用。

一些要求:

  • 预测服务必须 24/7 全天候可用。
  • 预测时间不能超过 15 毫秒,并且应该使用最多 4 个 cpu 核心(最好只有一个)

到目前为止我的一些想法:

    • 我们可以在新的分解上重新训练分类器,但这意味着我们必须在整个训练数据集(以及我们想要预测的事件发生时的配置文件快照)和整个数据库(所有当前配置文件)加上存储它。

    • 为了完成这项工作,我们必须有第二个数据库来存储分解的配置文件,一旦新的重新训练模型准备好并且所有配置文件都已分解,该数据库将被热交换。

    • 这种方法在计算资源和存储资源上都非常低效(这是昂贵的存储,因为检索必须超快)

    • 我们可以像解决方案 1 中那样重新训练分类器。但是做分解 ad_hoc。
    • 这对分解的速度施加了很多限制(单个样本的计算时间必须为亚毫秒)。
    • 除非我们添加额外的缓存层,否则这会进行大量冗余计算(尤其是对于项目配置文件)。
    • 这避免了以额外的预测延迟和额外的缓存层复杂性为代价的流失用户/项目的冗余存储和冗余计算。
  1. <---- 请帮帮我

    • 我们可以使用在线学习算法之一,如 VFT 或蒙德里安森林作为分类器——因此不再需要重新训练 + 很好地处理概念漂移。
    • 我们需要一个满足严格要求的在线分解算法:a)至少一部分输出向量在增量(批次)之间应该是稳定的。b) 它可以引入新特征来解释数据中的新变化,但应该以可控的速率这样做 c) 如果遇到新用户/项目,则不应中断

问题/行动要点:

  • 请评估我提出的解决方案并提出替代方案
  • 请提供适用于在线学习和在线分解(如果存在)的算法,如备选方案 3 中所述。最好使用具有足够抽象层的高效 python/scala/java 实现,以便在 Web 服务中使用它们(python 脚本接受文本文件作为数据集的价值将远低于 scikit 模块)
  • 请提供处理类似问题的相关文献的链接/描述可能适用的算法
  • 请分享您在处理类似问题时学到的经验/注意事项/提示

一些您可能会发现有用的背景阅读:

免责声明:我们的应用不是严格的广告转化预测,一些问题如稀有性不适用。我们要预测的事件有 8 个类别,并且发生在用户浏览项目的时间的 0.3%-3% 左右。

1个回答

我的看法:

  • 我同意 1. 中提出的问题,所以这里没有太多要补充的——再培训和存储确实效率低下
  • Vowpal Wabbit http://hunch.net/~vw/将是我的首选
  • 增量之间的输出稳定性实际上更多的是数据而不是算法功能 - 如果输入有很多变化,那么输出的稳定性就不会那么高(至少默认情况下不是)
  • 散列可以处理变化 - 您可以通过三个参数的组合来控制:散列表的大小和 l1/l2 正则化
  • 新功能/用户相同(我认为- 我使用的大多数应用程序都有一个 ercord 代表用户点击与否,因此新用户/广告被视为“相同”)
  • 通常我从命令行使用 VW,但是这里给出了一个从 Python 控制的示例方法(不太优雅):http: //fastml.com/how-to-run-external-programs-from-python-and-捕获他们的输出/
  • 如果您更喜欢纯 Python,那么可以在此处找到具有 Criteo 精神的在线学习者的版本(未分解):https ://www.kaggle.com/c/tradeshift-text-classification/forums/t/10537 /beat-the-benchmark-with-less-than-400mb-of-memory
  • 我不确定如何处理概念漂移 - 除了滚动统计数据之外,还没有太多关注它:对于感兴趣的相关变量,跟踪最近 N 个时期的平均值/计数。这是一种粗略的方法,但似乎确实完成了捕捉缺乏“平稳性”的工作
  • 有用的技巧 1:在首次运行之前单次传递数据以创建每个特征字典并将某些值标记为稀有(将它们合并为单个值)
  • 有用的技巧 2:集成来自多个模型的预测(改变交互顺序、学习率)