BayesWipe: A Scalable Probabilistic Framework 论文笔记及其错误

来源:互联网 发布:ping网络测试 编辑:程序博客网 时间:2024/06/05 17:35
这是论文BayesWipe的阅读笔记(大家可以直接Google搜索一下),这是一个数据清洗系统,论文发表在JDIQ,这个期刊比较新,使用了概率图模型中的BBN来做,算是一个比较新的将机器学习融入数据清洗的系统,但是我认为其似然也就是P(T|T*)的计算是有问题的,读者可以仔细推敲一下:
P(T|T*)P(T*)=P(T*|T)P(T) (1)
这个公式是成立的,一个前提条件是T和T*互相在C集合中,那么作者在清洗T的时候用到了的P(T|T*),在清洗T*的时候用到了P(T*|T),那么我们姑且认为这两个值是相等的,而且都是由Error Model计算得到的,那么就得到了以下悖论:
1. 如果P(T|T*)和P(T*|T)都可以用Error Model计算得到,而且正确估计,那么我们根本不需要用Posterior=P(T|T*)P(T*)来清洗T,毕竟我们可以直接计算P(T*|T)。
2. 如果P(T|T*)和P(T*|T)不可以用Error Model计算得到,那么这篇论文是一篇伪贝叶斯,实际上,我们只是定义了一个度量M=ErrorModel,然后计算M*P(T*),在C集合中对这个结果进行排序,找到Tbest进行替换,BBN在其中的工作仅仅是计算属性的Joint Probability也就是P(T)而已。

和师兄师姐讨论后,我们认为这篇论文是不够严谨的,其本质和之前的清洗系统没有本质的区别,不过笔记是先前写的,可以帮助大家理解。

PART1 Introduction
  1. 介绍
    1. 大多数的工作主要专注于量、速度、多样化,然而一个很重要的点是veracity(真实性)
      1. 企业数据有1-5%的错误率(30%的错误率的话,已经被检测到了)
      2. 手工数据清洗让人望而却步,耗时耗力,而且不太可信
      3. ...一些其他问题
    2. 现有技术一般基于规则

      1. 比如上表中,如果用户对Civic感兴趣,传统的数据检索系统会返回t1和t4,因为它们是唯一一个是查询项的匹配项。这样一来,它完全没考虑到t4其实是一个脏元组。另外,元组t3和t5不会做为结果返回,因为它们有错别字/缺失值,尽管它们代表了需要的结果。而我们的工作的目标就是给用户提供一个正确的结果集合(t1, t3, t5)
    3. 传统的方法
      1. 异常检测
      2. 噪声移除
      3. 实体解析??
      4. imputation-填补
    4. 尽管这些技术在各自的场景下是有效的,但是它们对清洗的主数据的依赖是一个显著的缺点。
  2. 特别的,最先进的技术尝试分析得到数据中的模式,比如条件函数依赖。一个不错的例子是,本田汽车将“JPN”作为制造商的起源的事实将成为这样的一个模式。然而,在清洗脏数据前,这种方法依赖于一个干净数据集和外部引用表。
    1. 比如ConQuer就依赖于一个干净的数据集。
    2. 这种方法在企业环境下还可以,但对于web data和big data来说很难实现。
    3. 一种可能的方式是从脏数据里学习到高质量的规则。
    4. 然而不幸的是,我们的实验结果显示了即使是很小的数据集,也会严重影响学习到有用的约束的能力
  3. 为了避免对干净的主数据的依赖,我们提出了一个新颖的系统——BayesWipe,它假定统计过程是生成干净数据(我们称之为数据源模型)以及数据损坏的基础(我们称之为 数据错误模型)。
    1. 噪声数据本身是用来学习这些生成和错误模型的参数,以此来消除对干净主数据的依赖。然后,通过将干净值看作是一个潜在的随机变量,BayesWipe影响了这两个学习得到的模型,并且通过Bayes估计自动地从推导出其值。
  4. 我们将BayesWipe设计成为可以用来两种不同的模式
    1. 传统的离线清洗模式
      1. 整个数据库,一次清洗✅
      2. 在这种模式下,可以有效地清除数据仓库场景,例如从网络爬行的数据,或者从各种嘈杂的源汇集的数据。 清理的数据可以存储在确定性数据库中,也可以存储在概率数据库中。
      3. 概率数据库,因为非常适合Bayes模型,可以得到整个模型的分布
      4. 对于清理的元组的概率输出模式的选择对于那些在清除的元组上进一步处理数据非常重要的情况下,这是非常有用的。
      5. 一个很重要的特征是,它可以产生概率数据库
        1. BayesWipe虽然是为确定型数据库构建的,但可以输出概率模型
        2. 概率数据库是复杂和不直观的,因为每个单个输入元组被映射到分布在最终的干净的替代品上。 我们将展示如何从PDB中检索top-k结果,同时显示用户可以理解的干净数据。
    2. 新颖的在线查询过程模式
      1. 在检索结果集时清洗结果集
  5. 总结
    1. 提出了可以用选择性的、概率的方法做数据清洗
    2. 开发了一个新颖的算法,基于贝叶斯网络作为生成模型,以及最大熵作为错误模型
    3. 开发了新颖的重写技术——在线模型
      1. 查询重写系统
    4. 开发了一个并行版本(版本呢??)
    5. 在真实和人工数据集上经验地估计了我们的算法的性能

PART2 Related Work
  1. 基于确定性规则
    1. 许多数据清洗的工作集中于确定型依赖关系,比如FD,CFD和IND。
      1. FD:A->B
      2. CFD:存在、任意
    2. 然而,CFD的清洁数据的精确度和回收率完全取决于用于清洁的一组依赖关系的质量。为了使基于CFD的方法执行得很好,需要从数据库的清晰样本[10]中学习,该样本必须足够大才能代表数据中的所有模式。找到这样一个干净的主数据的大型语料库是一个不平凡的问题,除了最受控制的环境(比如高质量数据的公司)外,所有这些都是不可行的。
      1. CFD的准确性依赖于大量的清洁数据(无法人工提取,可以考虑从数据里提取)
  2. 一个确定性规则的最新变体:包涵属性的正负模式的修复规则。
    1. 然而有好几种方法可以做这件事情,BayesWipe用了错误模型自动监测错误,并在没有干净的主数据的情况下清洗它们。
  3. J.Wang的最近的工作是基于规则的数据清洗技术来清洗一个数据的样本,以此来清洗整个数据,但它仅适用于(聚合数值查询),而BayesWipe的在线模式支持所有类型的SQL查询,并返回干净数据。
  4. 尽管它可以通过考虑其近似版本来帮助解决CAD/AFD方法的一些难点,但AI社区不确定性的工作表明了以这种方式处理不确定性的语义陷阱。
    1. 后面看不懂,反正最后就是要关注更系统的概率方法
  5. 要注意现在的系统一般不用概率确定的方法,而是使用一种启发式的方法,找到数据库的最小成本修复的近似算法,使用人为导向的修复,或从可能修理的空间进行抽样。已经有一些工作试图保证对数据库的正确修复,但只能保证在clean data中出现过的数据的正确性。
  6. 最近,[27]已经展示了对约束的相对信任以及数据本身对清理元组的选择。 [28]使用了贝叶斯数据源模型,但范围有限,以确定数据值随时间的演变。
  7. 其他工作
    1. 如何度量:评估基本真理或用户自己学习的知识
  8. 虽然BayesWipe用众包来评估,但有其他系统用众包来直接清洗数据
    1. 在BayesWipe针对的大数据清理的上下文中,进行数据清理的众包可能是不可行的。然而,来自人群的建议可用于提供更清洁的主数据,BayesWipe可从中了解贝叶斯网络。

PART3 BayesWipe Overview
  1. 总体架构

    1. 在Model Learning阶段从raw data中学习得到Error model和Source model
    2. 在Offline cleaning阶段提供干净的数据(这里不考虑query processing)
      1. 可以选择清洗出确定性数据库或概率数据库
  2. 概述
    1. BayesWipe将数据清洗问题看作是一个结构化文本数据的统计推理问题
      1. 让D={T1, …, Tn}作为输入数据,其中包含了一些错误
        1. Ti∈D是一个有m个属性{A1, …, Am}的元组,可能有部分属性是错误的
      2. 对D中一个可能的错误tuple T,给定一个候选替换集合C,我们可以用C中的拥有最大条件概率P(T*|T)的元组T*来替换。
      3. 根据贝叶斯规则,我们知道

        1. 替换后我们就得到了一个确定性数据库
      4. 如果我们想的到一个概率数据库,我们不用选择arg max,而是直接存储整个分布就可以。
        1. 对在线查询,我们用query Q*,并且我们找到tuple T的相关性得分

          1. 这里我们用了二值相关性,1-T*和用户的查询相关,否则为0
            1. 要注意是T*和Q*的关系,而不是T
        2. 这允许我们在BayesWipe的查询重写阶段,检索有最高分数的元组,以实现无损的使用PDB的无损效果,而无需显式变动整个数据库
    2. 架构
      1. 模型学习阶段
        1. 我们首先通过发出一些查询来获得一个样本数据库。在样本数据上,我们学习数据的生成模型——Bayes Network。
        2. 并行的,我们定义并学习了一个错误模型,这个模型吸纳了常见的错误
        3. 同时我们也创建了一个快速得到候选T*的索引
      2. 之后我们可以根据情况选择做离线处理或在线查询处理。
        1. 在离线处理的模式中,我们迭代所有的元组进行清洗的过程,one by one。
          1. 可以选择确定性数据库:最大后验概率T*
          2. 概率数据库:存储整个T*的分布
        2. 在线处理过程中,我们从用户获得一个query,然后执行查询重写,以找到一组可能检索一组高度相关的元组的查询。我们执行这些查询并重新排列结果,然后显示它们。
      3. 算法:

      4. 在算法1和2中,我们给出了BayesWipe的整体算法。 在离线模式下,我们将显示如何遍历脏数据库D中的所有元组,并将其替换为清除的元组。 在查询处理模式中,前三个操作是脱机执行的,其余的操作显示了如何从数据库中有效地检索元组,对用户进行排名和显示。

PART4 Model Learning
  1. 求解:
    1. Pr(T*) -> Source Model
    2. Pr(T|T*) -> Error Model
  2. Data Source Model
    1. 我们面对的数据对各种不同的属性具有依赖性,比如engine依赖于make。因此我们把数据源模型表示成贝叶斯网络——它通过结构学习和概率分布推理刻画了输入元组的属性间的关系。
      1. 在数据集D上建立一个Bayes网络有两个步骤
        1. 归纳出网络的图结构
          1. 它编码了D的模式中m个属性的条件依赖
        2. 对结果网络进行参数估计
      2. 结果模型允许我们在任意的输入元组T上计算概率分布
    2. 每当source数据库潜在的模式改变的时候,我们需要再次学习Bayes Network。
      1. 在我们的场景中,我们观察到尽管贝叶斯网络的结构不变,但是具有小的扰动的时候,参数也会更佳频繁地变化。
      2. 因此,我们花费了大量的时间,用一个更慢但是更准确的工具Banjo来学习网络的结构。

        1. 这是一个网络的例子
      3. 2a和2b显示了从一个从两个数据集合中自动学习到的结构。
        1. 可以直观的看到学习到的结构是正确的,因为连接的节点(比如country和race)是expected高度相关的
      4. 之后,给出一个学习到的D的物理结构G,我们可以使用了一个更快的包Infer.NET来估计条件概率表(CPTs)参数化所有G中的节点。这个推理参数的过程是线下完成的,但是比结构学习更加频繁。
      5. 一旦贝叶斯网络被建立了,我们可以对任意的tuple T推理得到联合分布,这种分布可以被解构为一些随机变量的边缘分布的乘积,这取决于它们的父节点,取决于G.
    3. Error Model
      1. 接下来从noisy data中估计错误模型Pr(T|T*),数据中可能有很多种类型的数据,我们主要关注naive user人为引起的最常见的错误类型:错别字、删除、替换一个单词。
        1. 我们也额外假设了一个属性的错误不会影响另一个属性的错误。这是个假设是合理的,因为我们允许数据本身的属性之间拥有依赖性,而仅限制错误过程在属性之间是独立的。
        2. 有了这些假设我,我们可以提出一个简单而有效的错误模型,其中用最大熵模型集合了三种类型的错误。
      2. 给定一个清洗的候选数据集C,T*∈C,我们的错误模型Pr(T|T*)essentially(本质上)衡量了T的清洁度,或者说,T和T*有多相似。
      3. 度量:
        1. 编辑距离相似度
          1. 这种相似性度量涌来监测拼写错误。
          2. 两个字符串Tai 和Tai* 之间的编辑距离被定义为从Tai转换成干净数据Tai*的最小开销。
          3. 编辑操作包括了字符级别的复制、插入、删除和替换每个操作的成本可以根据需要进行修改; 在本文中,我们使用Levenshtein距离,其使用统一的成本函数。
          4. 这会给我们一个距离,然后我们可以将它转换成概率Fed

        2. 分布相似性特征
          1. 这种相似性度量用来监测替换和遗漏的错误。
          2. 单独查看每一个属性不足以修复这些错误,我们提出了一个基于上下文的相似性度量Fds:
            1. 基于在相似的上下文中,将一个值替换为一个的概率。
            2. 形式化的,对于每个字符串Tai 和Tai*

            3. 其中C(Tai, Tai*)是某个元组属性值的上下文,即一个同时出现了Tai 和Tai*的属性集合。
            4. Pr(c|Tai*) = (#(c, Tai*) + μ)/#(Tai* )
              1. 是给定一个样本数据库中的干净的属性Tai*,某个上下文值c出现的概率。
            5. 类似的:P(Tai) = #(Tai)/#tuples
              1. 是脏属性值出现的概率。
            6. 我们可以用相同的方式计算Pr(c|Tai*)和P(Tai)
              1. 为了避免对没有出现在样本数据库中的属性值的0估计,我们对μ用了拉普拉斯平滑
        3. 统一错误模型
          1. 在实践中,我们无法预先知道哪种错误出现在了哪种特定的属性上,因此我们需要一个可以适应所有这三种错误的统一错误模型
            1. 并且,要足够灵活,在必要时适应更多可能的错误
          2. 因此,我们用了一个著名的最大熵框架来权衡相似性度量(Fds和Fed)
          3. 对每个输入元组T和T*的属性,我们有一个统一的错误模型:

            1. 其中α和β是每个特征的权重,m是属性的数量。Z是归一化因子:

      4. 找到候选集合
        1. 给定元组T的候选元组集合C(T)是系统认为可能对T修正的可能的替换元组。集合C越大,系统执行清理所需的时间越长。 如果C包含许多不洁净的元组,那么系统将浪费时间评分不清洁的元组。
        2. 一个寻找一个合理的干净C(T)的有效的方法是:
          1. 考虑样本数据库中所有的元组,我们找到和T不同的属性数量不超过 j个的元组。
          2. 为了能够找到满足这个条件的C(T),概念上,我们得要在样本数据库D中迭代所有的元组t,然后比较它和T到底有多少个属性是不一样的。
          3. 这个操作需要花费O(n)的时间,其中n是样本数据库中元组的数量。
          4. 即使 j = 3,最naive的方法还是太耗费时间了,因为它对每个元组t都需要遍历样本数据库。
        3. 为了加速这个过程,我们在j+1个属性上创建了索引,通过索引查找减少了计算C(T)时比较的次数。
          1. 任何不同的属性数小于j的候选元组T*都会在某个索引上和T相同,因为我们创建了j+1个索引,所以我们可以依次找j+1个索引上和T一样的元组。
          2. 要注意我们这样找到的是一个超集,如果T*不同的数量小于j,则一定在某一个索引上和T相同,但是如果T*不同的数量大于j,也有可能会有某个索引和T相同。
            1. 比如总属性数量是j+2,我们建立了前j+1个属性的索引,然后如果是2-j+2个索引不同,虽然不同的数量是j+1>j,但是第一个索引是相同的。
          3. 这些j + 1索引是通过具有最高基数的属性创建的,例如Make和Model(而不是像Condition和Doors这样的属性只能取几个值)。 这确保了从索引返回的元组的数量将是小的。
            1. Condition和Doors这样的属性可能重复率太高
            2. 我觉得可以优化的一点是有些基数高的属性,但是某个取值如果占据了90%,也是不好的,可以用熵来判断。
          4. 对每一个可能的数据库中的脏元组T,我们遍历所有这样的索引,找到所有与相应属性匹配的元组并得到并集。
            1. 这个并集是一个超集,但是构造这个并集的速度很快,不过这个超集偏大。
            2. 我们可以依次检查并集中的元组,仅仅留下真正的differ attributes 小于等于j+1的元组,最终得到C!
            3. (也有可能C是空集,这样的话要扩大数据集增大概率…)

PART5 Offline Cleaning
  1. 清洗成为确定性数据库
    1. 为了清洗数据,我们首先使用了前文中的技术来学习得到Data Source Model、Error Model并且创建了索引。然后我们迭代了所有数据库中的元组并且用等式(1)找到了拥有最佳分数的T*。接下去我们可以用T*替换T,以此用BayesWipe的离线模式创建了一个确定性数据库。

    2. 计算P(T*)P(T|T*)是很快的,只是简单的乘法
      1. P(T|T*)涉及简单的编辑距离和分布相似性计算,所有这些都涉及简单的算术运算和没有贝叶斯推理的查找。
    3. 回忆Section 4.2里提到的,错误模型中的参数α和β,这两个参数是需要被设置的。
      1. 有趣的是,除了控制误差模型中各种特征的相对重量之外,这些参数可用于控制系统的过度校正。
    4. 过度矫正:
      1. 任何的数据清洗系统很容易产生过度矫正的情况,也就是一个合理合法的元组被修改成了系统中的一个脏数据。
      2. 过度矫正有很多原因
        1. 传统的来说,在确定性数据库中,过矫正的出现可能是由于我们从罕见的数据中学习到了错误的规则。
          1. 例如,某些汽车都是由同一个集团所有(通用汽车拥有雪佛兰公司)。在误导企图简化库存的过程中,汽车销售员可能会以集团名义列出所有汽车。这可能提供足够的支持来学习错误的规则。
    5. 典型的,一旦一个错误的规则被学习了,没有任何的方法可以修复它,除非有领域专家监管。
    6. 然而BayesWipe提供了一个用来控制过度矫正的数量的参数:degree of change
      1. 不失一般性,我们可以重写等式5变成

      2. 由于我们只关心它们的相对权重,α和β可以通过正规化参数γ被替换成δ和1-δ。
      3. 这里的γ可以被用来调整P(T|T*)的变化程度(degree of variation)
      4. 更高的γ参数值意味着T和T*之间很小的不同程度会造成P(T|T*)之间更大的差异,于是系统会给origin元组更高的分数(相比于被修改后的元组)
    7. 给出一个例子
      1. 考虑数据库中的以下片段。 第一个元组是数据库中非常频繁的元组,第二个元组是错误的元组,第三个元组是一个不频繁的正确的元组。 第二个元组的“真实”修正是第三个元组。 所示的Pr(T*)值反映了数据源模型可能为它们预测的值,大致基于它们在源数据中发生的频率。

      2. 一个合适的数据清洗系统会把tuple 2修正为tuple3,而且不会修改任何其他的元组。然而,如果一个错误的规则被学习了(比如Z4->Honda),那么我们会把元组3替换为元组2,从而造成过度矫正。
      3. 另一方面,BayesWipe根据γ的值来处理这种情况。
        1. 对tuple 3(clean),假设候选替换元组集合也是1,2,3。情况可能如下所示:

        2. 我们可以看到,如果我们选择了一个比较小的γ最高分的候选元组是tuple 1,出现了过度矫正。然而,如果我们选了一个比较大的γ最高分的候选元组是tuple 3,这是正确的。
        3. 另一方面,如果我们的γ太大了,那么即使像tuple 2这样的脏元组也不会有变化,也会导致正确率过低。
    8. 要充分利用这种调整过度矫正的能力,我们需要能够合理地设定γ的值。 在没有训练数据集的情况下,我们只能估计最好的近似值。 我们通过找到系统修改的元组的百分比等于数据集中预期的噪声百分比的值来做到这一点。


阅读全文
0 0