PySyft: 在您无权查看的数据上进行数据科学分析#
获取数据是数据科学中首要且最关键的一步 - 但通常要获取足够的数据是不可能的。
理想情况下,数据科学家只需连接到存储数据的网络服务器即可开始分析工作。 但遗憾的是,现实并非如此简单! 信息的公开访问总是伴随着多重风险,必然引发关于信任(例如数据复制/使用/滥用)、隐私(例如敏感信息泄露)或法律影响(例如将数据移出其原始存储位置)的担忧。
但是,如果我们告诉你,实际上它可以变得如此简单呢?!
一种全新方式进行数据科学,您可以使用非公开信息,而无需查看或获取数据本身的副本。您只需连接到一个数据站点,并使用PySyft!
在本教程中,我们将学习使用PySyft所需的四个简单步骤,以及在您无法查看的数据上运行代码的方法。
1. 登录数据站点#
在您开始使用PySyft的旅程之初,有一个关键术语需要记住:数据站点。
Think of a Datasite as a website, but for data. While web servers allow you to download files like
.htmlor.cssto your browser, Datasites operate differently.数据站点使数据科学家能够从数据中获取研究问题的答案,而无需实际下载或查看数据本身。
让我们一起使用首个PySyft Datasite,探索它能通过托管数据回答哪些问题!
警告
我们假设您已经安装了PySyft。更多信息请参考快速安装PySyft。
首先让我们使用syft登录Datasite:
import syft as sy
# login to data_site
client = sy.login_as_guest(url="http://fake-wisc-datasite.openmined.org/")
2. 在数据站点上探索数据#
现在我们已登录(作为访客,编者注)到数据站点,让我们看看有哪些可用数据。我们可以通过访问client.datasets来实现:
client.datasets
pysyft-demo-datasite 服务器托管了一个名为"Breast Cancer Wisconsin"的数据集。我们可以使用PySyft API获取远程数据集的指针:
breast_cancer_dataset = client.datasets["Breast Cancer Wisconsin"]
由于这是我们首次接触"威斯康星州乳腺癌"数据集,让我们获取更多信息以更好地理解这些数据的含义。我们可以简单地通过访问breast_cancer_dataset远程指针中的丰富预览来实现:
breast_cancer_dataset
如您所见,数据集预览包含:
一个摘要:数据集的简要描述。
一个包含更多信息的描述,说明包含哪些数据、预期用途以及数据特征(这样我们就知道应该期待什么,编者注)。
两个资产的列表,即“BC Features”和“BC Targets”,用于存储数据。
与我们处理数据集的方式类似,我们可以获取breast_cancer_dataset中每个远程资产的指针:
features, targets = breast_cancer_dataset.assets
然而,如果我们尝试从这些资产中访问data:
features.data
这确实是PySyft的主要功能之一:作为数据站点的GUEST数据科学家,我们不被允许查看或下载数据集中的任何数据!
此时,你可能会想:
我怎么可能处理我看不到的数据?如果代码无法用数据进行测试,我该如何开始编写代码?
PySyft通过在每个资产中托管两种类型的数据来解决这个问题:真实数据(例如features.data)和模拟数据(例如features.mock)。
模拟数据代表真实数据的人工版本,已通过PySyft提供用于代码准备目的。让我们快速浏览一下:
features.mock.head(n=3)
targets.mock.sample(n=3, random_state=24)
3. 准备代码以回答我们的研究问题#
mock 数据的存在为我们的代码工作提供了具体策略,更重要的是让我们能专注于真正重要的事情:我们的研究问题。
假设我们想知道对于诊断为良性(B)或恶性(M)的乳腺癌患者,其肿瘤细胞核的半径(平均)差异是多少。
我们可以将这个问题转化为实际可运行的Python代码,使用模拟数据作为真实数据的代理:
def average_radius_of_nuclei(data, labels) -> tuple[float, float]:
"""Calculate the mean of `radius` feature, for both samples with bening and malign diagnosis"""
y = labels['Diagnosis'].values.ravel()
mean_bening = data[y == "B"]["radius3"].mean()
mean_malign = data[y == "M"]["radius3"].mean()
return mean_bening, mean_malign
让我们在模拟数据上测试我们的代码:
average_radius_of_nuclei(features.mock, targets.mock)
运行成功! ✅
我们刚刚验证了我们的代码能够在选定的资产上运行,因此它已准备好在数据站点上执行。
警告
获取真实答案 需要强调的是,使用模拟数据生成的该结果(以及任何其他结果,编者注)对我们的研究问题完全没有意义! 我们需要在Datasite上的真实(远程)数据上运行代码,才能获得我们寻找的答案。为此我们将使用PySyft!
4. 获取我们研究问题的真实答案#
既然我们已经验证了代码能在本地的模拟数据上运行,现在就可以进行最后一步了。这次,我们希望代码能远程执行(在数据站点上),并使用真实的非公开数据。我们只需将本地的Python函数转换为远程代码请求即可。
在PySyft中创建代码请求非常简单,只需使用Python装饰器包装我们的函数:syft.syft_function_single_use。使用此装饰器时,我们需要指定执行时愿意使用的资产(本例中即features和targets)。通过这种方式,我们可以明确界定实验的数据范围,因为PySyft将不允许我们在指定资产之外的资产上执行操作。
@sy.syft_function_single_use(data=features, labels=targets) # mapping parameters to corresponding assets
def average_radius_of_nuclei(data, labels) -> tuple[float, float]:
"""Calculate the mean of `radius` feature, for both samples with bening and malign diagnosis"""
y = labels['Diagnosis'].values.ravel()
mean_bening = data[y == "B"]["radius3"].mean()
mean_malign = data[y == "M"]["radius3"].mean()
return mean_bening, mean_malign
成功!🎉
现在我们的average_radius_of_nuclei函数已正式成为PySyft代码请求,我们可以立即将其提交到数据站点:
client.code.request_code_execution(average_radius_of_nuclei)
警告
等待批准 请稍等一秒钟再继续,以确保演示服务器能接收并自动批准请求。
让我们检查请求的状态:
client.code
该请求已被数据站点自动批准!这意味着我们现在获得了在真实数据上远程执行代码并下载结果的权限:
answer = client.code.average_radius_of_nuclei(data=features, labels=targets).get()
print(answer)
干得漂亮!!👏
您已成功在Datasite上远程执行了average_radius_of_nuclei函数,并从真实(非公开)数据中获取了结果!整个过程都无需查看原始数据!
这只是冰山一角 🔎#
恭喜您完成了第一个PySyft教程!在本教程中,我们学习了如何轻松开始使用PySyft,以便在您无法查看的数据上进行数据科学分析。
但这仅仅是表面!
审批流程
例如:教程中使用的演示Datasite服务器已配置为自动接受所有传入请求。实际上,这意味着对外部数据科学家通过代码提交的查询没有任何限制
当然,这只是一个过度简化的例子,仅仅是为了让本教程尽可能易于理解!但PySyft的功能还有更多值得探索的地方!!
如果你想了解更多关于PySyft的信息,并学习如何从零开始使用PySyft,请阅读这篇教程。
你也可以加入Open Mined Slack社区,并在#support频道留言,那里会有人很乐意帮助你!
感谢您的关注!