反标识
反标识是从数据集中删除标识信息的过程。“取消身份”一词有时是与术语匿名化和假名化同义使用。
目标
定义以下概念:
–取消识别
–重新识别
–识别信息/个人识别信息
–链接攻击
–聚合和聚合统计
–不同的攻击
•执行链接攻击
•执行差异化攻击
•解释反识别技术的局限性
•解释汇总统计的局限性
我们将保存一些识别信息以备稍后使用,届时我们将使用它作为辅助数据来执行重新识别攻击。
2.1链接攻击
根据文章举一个例子:假设想确定James的收入,但是现在只确定其名字,adress,zip code。现在可能两个数据集同时包含adress,zip code这两种数据,我们只需要进行两个表的联接。如果有唯一的这样一行就成功。Pandas.merge
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
adult = pd.read_csv("adult_with_pii.csv")
adult.head()
adult_data = adult.copy().drop(columns=['Name', 'SSN'])
print(adult_data)
adult_pii = adult[['Name', 'SSN', 'DOB', 'Zip']]
print(adult_data)
# 连接的关键所在
karries_row = adult_pii[adult_pii['Name'] == 'Karrie Trusslove']
pd.merge(karries_row, adult_data, left_on=['DOB', 'Zip'], right_on=['DOB', 'Zip'])
2.1.1查找难度
这个场景是虚构的,但在实践中,链接攻击非常容易执行。有多容易?事实证明,在许多情况下,仅一个数据点就足以精确定位一行!
衡量这类攻击有效性的一个好方法是查看某些数据段的“选择性”如何,即它们在缩小可能属于目标个体的潜在行集方面有多好。也就是说越准确越好。下面的直方图显示,绝大多数出生日期在数据集中出现1次、2次或3次,并且没有出生日期出现超过8次。这意味着出生日期是相当有选择性的——它可以有效地缩小个人可能的记录。
2.1.2特殊性
pd.merge(karries_row, adult_data, left_on=['Zip'], right_on=['Zip'])
pd.merge(karries_row, adult_data, left_on=['DOB'], right_on=['DOB'])
print(adult_pii)
# 生日图
adult_pii['DOB'].value_counts() .hist()
plt.xlabel('Number of Dates of Birth')
plt.ylabel('Number of Occurrences');
# zip code图
adult_pii['Zip'].value_counts().hist()
plt.xlabel('Number of ZIP Codes')
plt.ylabel('Number of Occurrences');
2.1.3图
2.1.4识别多少人
一些数据唯一识别,一些数据被识别成多个。
比如同名
attack = pd.merge(adult_pii, adult_data, left_on=['DOB'], right_on=['DOB'])
attack['Name'].value_counts().hist();
如果我们同时使用出生日期和邮政编码,我们可以做得更好。事实上,我们能够唯一地重新识别整个数据集。
attack = pd.merge(adult_pii, adult_data, left_on=['DOB', 'Zip'], right_on=['DOB', 'Zip'])
attack['Name'].value_counts().hist();
根据Latanya Sweeney的工作调查,87%的美国人可以通过出生日期、性别和邮政编码的组合唯一地重新识别身份。
attack['Name'].value_counts().head(1)
Barnabe Haime 2
Name: Name, dtype: int64
attack['Name'].value_counts().head(2)
Barnabe Haime 2
Antonin Chittem 2
Name: Name, dtype: int64
2.2 聚合
防止私人信息泄露的另一种方法是仅发布聚合日期。
在许多情况下,汇总统计数据被细分为更小的组。例如,我们可能想知道平均值具有特定教育水平的人的年龄。
adult['Age'].mean()
2.2.1小团体的问题
聚合被认为可以改善隐私,因为很难确定特定个人对聚合统计的贡献。但是,如果我们把一个只有一个人的群体聚集在一起呢?在这种情况下,汇总的统计数据准确地显示了一个人的年龄,根本没有隐私保护!在我们的数据集中,大多数人都有一个独特的邮政编码——因此,如果我们通过邮政编码计算平均年龄,那么大多数“平均值”实际上反映了一个人的确切年龄。
有些人口普查区人口众多,但有些人口为零!上面的情况很常见,即小团体阻止聚合以隐藏有关个人的信息。一个群体的规模有多大,“足够大”,总的统计数据可以提供帮助?很难说,这取决于数据和攻击
-因此,要建立一种信心,即汇总统计数据确实保护了隐私,这是一个挑战。然而,即使非常大
adult[['Education-Num', 'Age']].groupby('Education-Num').mean().head(3)
Education-Num Age
1 42.764706
2 46.142857
3 42.885886
adult[['Education-Num', 'Age']]
adult[['Zip', 'Age']].groupby('Zip').mean().head()
2.2.2差异化攻击
当您对同一数据发布多个聚合统计信息时,聚合问题会变得更加严重。例如,考虑以下两个针对数据集中大型组的求和查询(第一个针对整个数据集,第二个针对除一个之外的所有记录)
如果我们知道两个答案,我们就可以简单地计算出差异并完全确定Karrie的年龄!这种攻击即使聚合统计数据超过很大的组,也可以继续。
adult['Age'].sum()
1256257
adult[adult['Name'] != 'Karrie Trusslove']['Age'].sum()
1256218
adult['Age'].sum() - adult[adult['Name'] != 'Karrie Trusslove']['Age'].sum()
这是一个重复出现的主题。
• 发布有用的数据,很难确保隐私
• 无法区分恶意查询和非恶意查询
总结
链接攻击涉及将辅助数据与已取消标识的数据相结合,以重新标识个人。
• 在最简单的情况下,可以通过连接包含这些数据集的两个表来执行链接攻击。
• 简单的链接攻击非常有效:
– 仅一个数据点就足以将内容缩小到几条记录
– 缩小记录集有助于建议可能有用的其他辅助数据
– 两个数据点通常足以重新识别特定数据集中的很大一部分人口
– 三个数据点(性别、邮政编码、出生日期)唯一识别87%的美国人