【问题标题】:record linkage using ECM in python在 python 中使用 ECM 记录链接
【发布时间】:2018-11-03 15:29:37
【问题描述】:

我正在研究记录链接问题并应用无监督算法,因为我没有外部标签。

我已经应用了 ECM 算法。使用的代码是:

import recordlinkage

indexer = recordlinkage.BlockIndex(on=['FirstName_CD','LastName_CD'])
pairs = indexer.index(data1, data2)

compare_cl = recordlinkage.Compare()

compare_cl.string('FirstName_CD', 'FirstName_CD', method='jarowinkler', threshold=0.50,label='given_name')
compare_cl.string('LastName_CD', 'LastName_CD', method='jarowinkler', threshold=0.50, label='surname')
compare_cl.exact('Date.Of.Birth_CD', 'Date.Of.Birth_CD', label='date_of_birth')
compare_cl.exact('Gender_CD', 'Gender_CD', label='gender')
compare_cl.exact('Profession_CD', 'Profession_CD', label='profession')
compare_cl.string('Address_CD', 'Address_CD', threshold=0.85, label='address_1')

features = compare_cl.compute(pairs,data1)

ecm = recordlinkage.ECMClassifier()
result_ecm=ecm.learn(features)

现在它返回一个多索引。我的问题是我可以从中得出什么推论?如何获取匹配/不匹配信息?

【问题讨论】:

    标签: python ecm record-linkage


    【解决方案1】:

    为了让 ECM 分类器在 'compare vectors''features' 上工作,只需将模型拟合到具有 unique>1 的列上。 p>

    这里是python代码:

    cl = recordlinkage.ECMClassifier()
    
    compare_vectors=compare_vectors[[col for col in compare_vectors.columns if compare_vectors[col].nunique() >= 2]]
    
    cl.fit(compare_vectors)
    

    【讨论】:

      【解决方案2】:

      ecm.learn() 返回的 MultiIndex 基本上是一堆索引对,是分类器猜测哪些项目匹配。 (注意ecm.learn()已弃用。新函数名称为ecm.fit_predict()。)

      我不知道您的数据是什么样的,但这里有一个示例数据集的示例:

      from recordlinkage.datasets import load_febrl4
      
      dfA, dfB = load_febrl4()
      
      # Indexation step
      indexer = recordlinkage.Index()
      indexer.block('given_name')
      candidate_links = indexer.index(dfA, dfB)
      
      # Comparison step
      compare_cl = recordlinkage.Compare()
      compare_cl.string('surname', 'surname', method='jarowinkler', threshold=0.85, label='surname')
      compare_cl.exact('date_of_birth', 'date_of_birth', label='date_of_birth')
      compare_cl.exact('suburb', 'suburb', label='suburb')
      compare_cl.exact('state', 'state', label='state')
      compare_cl.string('address_1', 'address_1', threshold=0.85, label='address_1')
      
      features = compare_cl.compute(candidate_links, dfA, dfB)
      
      ecm = recordlinkage.ECMClassifier()
      matches = ecm.fit_predict(features)
      

      (请注意,此示例基于 here 文档中的示例。)

      matches 对象确实是一个 Pandas MultiIndex。我们可以将其转换为元组列表,以更好地了解其中包含哪些信息。

      # Look at the first 5 matches
      list(matches)[:5]
      
      [('rec-2371-org', 'rec-2371-dup-0'),
       ('rec-3024-org', 'rec-3024-dup-0'),
       ('rec-4652-org', 'rec-4652-dup-0'),
       ('rec-4795-org', 'rec-4795-dup-0'),
       ('rec-1016-org', 'rec-1016-dup-0')]
      

      这些是dfAdfB 数据帧中的索引名称。我们可以查看它们,看看它们实际上是匹配的:

      dfA.loc['rec-2371-org'], dfB.loc['rec-2371-dup-0']
      
       given_name           michaela
       surname              dunstone
       street_number              37
       address_1        deane street
       address_2            rosedown
       suburb              woodcroft
       postcode                 2065
       state                     vic
       date_of_birth        19121018
       soc_sec_id            3166178
       Name: rec-2371-org, dtype: object
      
       given_name           michaela
       surname              dunstone
       street_number              37
       address_1        deane street
       address_2            rosedlwn
       suburb              woodcroft
       postcode                 2065
       state                     vic
       date_of_birth        19121018
       soc_sec_id            3166178
       Name: rec-2371-dup-0, dtype: object
      

      【讨论】:

        【解决方案3】:

        我也找不到此方法的信息,但据我了解,ecm_learn 返回一个 MultiIndex,它与 indexer.index() 方法返回的 pairs 的数据类型相同。

        所以,这就是我使用它的方式(顺便说一句,我可能完全错了!)

        import recordlinkage
        
        indexer = recordlinkage.BlockIndex(on=['FirstName_CD','LastName_CD'])
        pairs = indexer.index(data1, data2)
        
        compare_cl = recordlinkage.Compare()
        
        compare_cl.string('FirstName_CD', 'FirstName_CD', method='jarowinkler', threshold=0.50,label='given_name')
        compare_cl.string('LastName_CD', 'LastName_CD', method='jarowinkler', threshold=0.50, label='surname')
        compare_cl.exact('Date.Of.Birth_CD', 'Date.Of.Birth_CD', label='date_of_birth')
        compare_cl.exact('Gender_CD', 'Gender_CD', label='gender')
        compare_cl.exact('Profession_CD', 'Profession_CD', label='profession')
        compare_cl.string('Address_CD', 'Address_CD', threshold=0.85, label='address_1')
        
        features = compare_cl.compute(pairs,data1)
        
        ecm = recordlinkage.ECMClassifier()
        result_ecm=ecm.learn(features)
        
        #reprocess the compute() call with the newly adjusted match information
        features = compare_cl.compute(result_ecm,data1)
        
        #now, do your stuff..
        #...
        

        如果其他人有更多信息,我非常感谢一些反馈。

        谢谢!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-28
          • 1970-01-01
          • 1970-01-01
          • 2015-10-25
          相关资源
          最近更新 更多