我们如何在SmartMailHack 2中获胜

上周末(7月14日至15日),又在Mail.Ru集团办公室举行了SmartMailHack黑客马拉松。 我们被要求“提出一项功能,使您可以从邮件中访问数据并更有效地与它们进行交互。”


数据描述,想法和解决方案


我们有一个包含超过1500条消息的测试框,并且可以通过API对其进行完全访问。 组织者提供了有关其使用的大型详细手册(共547页)。 借助令牌和简单的JSON请求,我们可以接收有关邮件的所有必要信息:字母,发件人姓名,各种特征。


讨论过我们每个人在邮件中的邮件列表中大约有数千封未读的信件之后,我们决定解决此问题。 在我们的情况下,该信件的相关性不再由它出现在邮箱中的时间确定。 并且基于并非所有字母都会被打开的事实,那么最好仅向用户显示他可能会打开的字母。 其他所有内容都可以删除。 因此,我们决定对邮件进行排序。


应该对分类字母进行分类,并将分类放在磁贴内部(嗨,Trello)。 磁贴的上排结合了来自不同发件人的字母的含义。 可以有大约10个类别的“ Trips”,“ Registration”,“与Vasya对应”,“ Events”,“ Finance”等。 第二排是公司报价最低的瓷砖。 我们搜索了最相关的促销代码,最优惠的促销,最有价值的报价,并在此处按公司分组显示了它们。 然后是寄件公司分发的所有其他信件,这些寄件人又被分为几类(“食品”,“化妆品”,“电子产品”等)。 此外,类别也按字母的相关性进行排名,并且内部仅显示超过特定阈值的字母。 用“找到需要的东西并摆脱多余的东西”的字眼强化了这个想法之后,我们进入了ML。


机器学习


我们决定构建三个模型:


  • 我们已将所有用户指定为30多个类别的分类器;
  • 根据用户喜好聚类并突出显示新类别;
  • 从最相关到​​最不相关对类别中的字母进行排名。


迹象


似乎应该针对每个任务单独描述该项目。 但是,我们生成了一个通用要素数据集,并在其上训练了所有模型。 没有时间进行仔细选择。


使用API​​卸载了一堆二进制符号。 但是,它们大多数是在文本上生成的:


  • tf-idf收集文件;
  • 通过Word2Vec收到的嵌入;
  • 行为症状,例如:
    -在最后一个窗口(1、2、5周前)中读取的消息数;
    -来自此的消息数。

分类任务


我们用手划出了1000个字母进行培训。 事实证明,这项工作并不像乍看起来那样缓慢而乏味。 如果使用地址和标题,则可以大大加快工作速度。 例如,拉莫达几乎总是将信件发送到“服装”类别。


接下来,我们对整个符号集进行LightGBM训练,并获得0.913精度和0.892 f1量度的质量,我们认为这是在基线水平上非常好的结果。 这表明字母可以很好地分类。


排名任务


作为目标变量,我们使用了二进制标志0/1-用户是否读取了消息。 根据模型预测的概率对他们进行进一步排名,因为这恰恰反映了模型对人是否会阅读消息的信心。


在这里,我们还对LightGBM的全部功能进行了培训,并获得了约0.816 auc-roc的质量。


聚类并突出显示新类别


除了主要类别外,我们还有“其他”类别。 从中可以突出显示新主题。


我们用来自该小组的信件训练了标准的DBSCAN,然后选择了其中包含大量消息的集群(阈值可以优化,但是偶然固定)。 例如,可以在群集文档的集合上设置主题建模,获取给定群集最相关的主题,然后在单独的组中进行选择。 没有足够的时间来验证该算法。


因此,如果传入的字母属于“其他”类别,它们将通过分类器传递-它们被聚集在一起,新的主题正试图脱颖而出,然后进行排名。 发送一个后端请求,该请求汇总所有内容,并呈现前端。





剩余的想法


  • 改善机器学习模型;
  • 从更多用户那里收集数据以更好地预测每个用户的行为;
  • 彻底验证新出现的类别;
  • 使用图片作为标志,例如来自预训练神经网络的嵌入分配。

Source: https://habr.com/ru/post/zh-CN417531/


All Articles