去标识
去标识:是指从数据集中删除标识信息的过程。
标识信息的模糊定义:凡是能够根据信息序列精确定位到某个具体事物的信息序列。比如,每个人的身份证号,每个人的(家庭住址,姓名)的信息元组等等。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
adult = pd.read_csv("./data/data_ch1.csv")
adult.head()
在上面数据中,将删除部分个人标识数据,并留下一部分个人标识数据。将保留的部分个人标识数据作为辅助数据来实施一次重标识攻击!
在下面的操作中,我们删除 ["Name", "SSN"], 而完整的个人信息标识为 ["Name", "SSN", "DOB", "Zip"]
adult_data = adult.copy().drop(columns=["Name", "SSN"])
adult_pii = adult[["Name", "SSN", "DOB", "Zip"]]
adult_data.head()
假如,我们知道Karrie Trusslove的邮政编码和生日,这两个信息。这两个信息在个人信息标识adult_pii和去标识的信息adult_data同时存在。则我们可以根据这两个信息从去标识信息中匹配到Karrie Trusslove的其他信息。通过这个方法使得Karrie Trusslove的个人隐私暴露出来。
karries_row = adult_pii[adult_pii["Name"]=="Karrie Trusslove"]
karries_data = pd.merge(karries_row, adult_data, left_on=["DOB", "Zip"], right_on=["DOB", "Zip"])
karries_data
从上面的结果中确实得到了Karrie Trusslove的隐私数据。这就是一个简单的重标识攻击的结果。
重标识攻击的难度
在很多实际的场景中,重标识攻击非常简单而且高效。因为,在很多场景中我们知道一两个数据点作为辅助信息就可以去重标识出一条隐私数据。比如,我们使用Karrie Trusslove的Zip数据就可以重新标识出Karrie Trusslove的信息。
pd.merge(karries_row, adult_data, left_on=["Zip"], right_on=["Zip"])
可以看出,Karrie Trusslove的邮政编码是非常私人的信息。假如说这类信息难以获取,那么生日信息就很容易获取到了。我们尝试使用生日进行重标识攻击看看。
pd.merge(adult_data,karries_row, left_on=["DOB"], right_on=["DOB"])
可以看出也能够重标识出一条信息。像生日数据在实际情况中可以得到很小的一个数据集,在这个数据集其实已经暴露了很懂隐私。
辅助信息重标识信息的效率
我们可以通过统计辅助信息相同数量的直方图来得到辅助信息重标识信息的效率。如果,辅助信息都相同,则重标识信息的效率就最低。如果辅助信息均唯一,则重标识信息的效率最高。下面,我们尝试对DOB信息的重标识信息的效率进行评估:
adult_pii["DOB"].value_counts().hist()
plt.xlabel("Number of DOB")
plt.ylabel("Number of occurrences")
可以看出出生日期出现一次的数量占比非常大,所以效率还算可以。所以,如果有2个辅助信息基本上大概率是可以唯一重标识出隐私信息。
为了防止重标识攻击,可以发布聚合数据,来达到目的。
聚合数据
聚合数据是指对数据按某些属性进行分组聚合。比如对不同学位的人群计算出平均年龄。发布数据时,使用平均年龄代替真实年龄。
小群组问题
在上面的例子中,学位是一种颗粒度很粗的属性。但是,很多时候聚合操作是对多个属性进行分组操作。在这种分组操作中存在分组的数据很小。从而导致隐私泄露。
当面对相同数据在不同方面的分组聚合时,隐私泄露就会变得非常棘手。比如,如下操作:
print(adult["Age"].sum())
print(adult[adult["Name"]!="Karrie Trusslove"]["Age"].sum())
然后两者相减就可以知道Karrie Trusslove的年龄。
标签:Trusslove,进阶,Karrie,信息,标识,差分,data,adult From: https://www.cnblogs.com/ALINGMAOMAO/p/17132114.html