快速检查大数据上的集合成员资格

数据挖掘 分类
2022-02-28 09:13:19

假设我是 Gmail 之类的电子邮件提供商。假设我有两类电子邮件地址:垃圾邮件发送者和非垃圾邮件发送者。当我的服务器收到邮件时,我需要快速检查该电子邮件 ID 是否在垃圾邮件发送者集中,如果是,我会采取一些措施。

问题是每个电子邮件 ID 可能是几个字节(例如每个 10 个字节),我可能有 10 亿个垃圾邮件发送者,所以我需要 10GB 的 RAM 来将电子邮件存储在主内存中。

假设我只想使用 1 GB RAM。为此,我现在准备接受一个大概的答案特别是我可以接受被错误标记为属于垃圾邮件集的非垃圾邮件,但反之亦然。我将如何做?

2个回答

有人已经用“bloom-filter”标记了这个。我同意他们的观点。

布隆过滤器是一种基于散列的技术,它永远不会导致误报,但会牺牲误报的概率来节省空间。它满足您的特定性能要求 - “对于 1% 的误报概率,每个元素需要少于 10 位,与集合中元素的大小或数量无关(Bonomi 等人(2006 年))。” (来自链接的文章)

您不会为此使用 Bloom 过滤器的主要原因是删除垃圾邮件发送者的计算量很大,需要您重新构建过滤器或单独跟踪已删除垃圾邮件发送者的列表。

您的问题适用于机器学习技术。
您将问题建模为非参数模型,即参数取决于您的数据,随着数据的增长,参数也会增长。
简单的非参数模型类似于 k 最近邻。每次要预测一些新数据点时,都必须计算所有训练示例与该数据点的距离。
所以跟踪电子邮件地址不是一个好主意,如果你让机器读取内容,然后用一组固定的参数自动决定输出应该是什么?

您可以访问垃圾邮件/火腿电子邮件的大型数据集。并训练大型深度模型,然后在您的自定义数据集上对其进行微调。

至于模型的准确率,当你训练一个分类器后,模型的输出会是一个介于 0 和 1 之间的简单实数值,分别告诉你模型认为它是 ham 还是 spam 的程度,通常我们设置一个阈值0.5 给出明确的答案。但是,如果您想优化误报,则可以提高阈值。
例如,如果您将其设置为 0.8,您是在说如果不是 80% 确定,我不希望机器将其归类为火腿。