我正在处理记录链接问题并应用无监督算法,因为我没有外部标签。
我已经应用了ECM alogorithm。使用的代码是:
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)
现在它返回一个多索引。我的问题是我可以从中得出什么推论?如何获得匹配/不匹配信息?
答案 0 :(得分:0)
我也找不到该方法的信息,但是据我所知,ecm_learn
返回一个MultiIndex,它与pairs
返回的indexer.index()
的数据类型相同方法。
所以,这就是我的用法(我可能完全错了,顺便说一句!)
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..
#...
如果其他人有更多信息,我将非常感谢您的反馈。
谢谢!
答案 1 :(得分:0)
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')]
这些是dfA
和dfB
数据框中的索引名称。我们可以查询它们以发现它们实际上是匹配的:
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
答案 2 :(得分:0)
为了使ECM分类器在“比较向量” 上起作用,或者“功能” 仅在具有唯一> 1的列上拟合模型。>
这是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)