第五章:用FATE从零实现横向逻辑回归


本节我们使用由威斯康星州临床科学中心开源的乳腺癌肿瘤数据集(链接5-2)来测试横向联邦模型,数据集已经内置在sklearn库中,可以直接加载查看。

from sklearn.datasets import load_breast_cancer
import pandas as pd 


breast_dataset = load_breast_cancer()

breast = pd.DataFrame(breast_dataset.data, columns=breast_dataset.feature_names)

breast['y'] = breast_dataset.target

breast.head()

执行代码后显示前5行的数据如图5-1所示。可以看到,数据一共由569个样本构成,每一个样本数据一共有31列,其中第1~30列表示30维的特征数据,第31列表示标签数据(用1表示良性肿瘤,0表示恶性肿瘤)。进一步分析,我们会发现数据中只包含了10个属性,但是每一个属性值分别以均值(mean)、标准差(standard error)、最差值(worst)出现了三次,所以总共有30个特征。在这569个样本中,恶性肿瘤样本有212个,良性肿瘤样本有357个。
在这里插入图片描述

5.2 逻辑回归

根据上一节对数据集的描述,可知本章的实验是一个二分类的模型训练,即对乳腺癌数据集中恶性肿瘤M(1)和良性肿瘤B(0)的分类。逻辑回归(Logistic Regression)是当前最常用的二分类模型,属于广义线性模型(Generalized Linear Model)家族,因其模型简单且效果较好被广泛使用。本章采用逻辑回归作为实验模型。

我们先简要回顾线性回归的定义。线性回归模型是通过对特征值 x = ( x 1 , x 2 , ⋅ ⋅ ⋅ , x n ) x=(x_1,x_2,· · ·,x_n) x=x1x2⋅⋅⋅xn进行线性组合来预测标签值y,即满足:
在这里插入图片描述
通常使用向量的形式简化表示为

在这里插入图片描述
其中 W = ( w 1 ; w 2 ; ⋅ ⋅ ⋅ ; w n ), X = ( x 1 , x 2 , ⋅ ⋅ ⋅ , x n ) W=(w_1;w_2;· · ·;w_n),X=(x_1,x_2,· · ·,x_n) W=w1w2⋅⋅⋅wn),X=x1x2⋅⋅⋅xn

利用式(5.2)得到的y值是一个连续值,而二元分类的输出是一个只包含0和1的离散值,为此,我们可以在式(5.2)连续值输出的基础上,再进行非线性的映射,即寻找一个可微的非线性函数f将离散标签值y与线性回归的预测连续值联系起来:
在这里插入图片描述

在逻辑回归中,我们使用逻辑斯蒂函数来充当这个非线性映射的角色,逻辑斯蒂函数的表示形式为
在这里插入图片描述
其函数图像如图5-2所示。
在这里插入图片描述
可以看出,利用逻辑回归进行分类预测时,当线性回归预测值WT+b≥0时,则判断为正例,输出为1;否则,判断为负例,输出0。

5.3 横向数据集切分

为了模拟横向联邦建模的场景,首先在本地将乳腺癌数据集切分为特征相同的横向联邦形式,假设当前有两方参与横向联邦训练,如图5-3所示。
在这里插入图片描述

取乳腺癌数据集的前469条样本作为训练样本数据,后100条数据作为测试数据,数据切分的策略如下。

  • 训练数据切分:将469条数据按行切分为两份数据,选取其中前200条作为公司A的本地数据,保存为breast_1_train.csv,将剩余的269条数据作为公司B的本地数据,保存为breast_2_train.csv。

  • 测试数据集:测试数据集不需要切分,两个参与方使用相同的一份测试数据即可,文件命名为breast_eval.csv。数据分布如图5-4所示。

  • 在这里插入图片描述

5.4 横向联邦模型训练

数据准备好之后,下一步可以利用FATE来构建横向联邦模型进行训练。在FATE中构建横向联邦模型,通常情况下会涉及下面三项工作。

  • 数据输入:将文件(如csv、txt等文本文件)转换为FATE支持的DTable格式。DTable是一个分布式数据集合,是FATE的基础数据结构,FATE的所有运算都基于DTable格式进行。

  • 模型训练:数据转换为DTable格式后,FATE可以为模型训练构建流水线(pipeline)。

  • 模型评估:横向联邦的模型评估与集中式的模型评估一样,将训练好的模型作用于测试数据集来评估模型性能。

FATE为横向联邦训练提供了丰富的接口,只需要通过提供dsl和conf配置文件,就能完成上面的所有操作。为了后面的叙述统一,我们假设读者安装的FATE单机版本目录如下,后面的讲解都以该目录作为基目录。
在这里插入图片描述

5.4.1 数据输入

FATE提供了将本地文件转化为DTable格式的工具,首先将本地的训练数据和测试数据上传到$fate_dir/examples/data目录,该操作可以使用rz命令完成。
在这里插入图片描述

我们定义上传数据配置文件,将其命名为upload_data.json,其内容如下所示。需要修改其中的三个字段,即file,table_name和namespace,其余字段使用默认值。

在这里插入图片描述

这三个字段对应的含义如下。

  • file:对应的本地文件位置,也就是刚刚上传的目录文件夹。

  • table_name:将本地文件转换为DTable格式的表名,可根据需要自行设置。

  • namespace:DTable格式的表名对应的命名空间,可根据需要自行设置。

以上传文件breast_1_train.csv为例,修改后的upload_data.json文件如下所示。
在这里插入图片描述
修改完成后,在命令行中执行下面的命令(upload),FATE会自动将原始的本地文件breast_1_train.csv转换为DTable格式。
在这里插入图片描述

如果成功执行,那么系统将返回下面的信息,可以将board_url字段中提供的网址输入浏览器中查看执行结果。
在这里插入图片描述
同理,对于breast_2_train.csv,可以按照上面的过程执行。对于测试数据集,我们将本地测试文件上传到两个参与方,并各自转化为DTable格式。如下所示。

在这里插入图片描述

5.4.2 模型训练

当我们在上一步将本地数据转换为DTable格式后,就可以开始构建联邦学习训练流水线了。FATE官方提供了很多模型参考例子。当前FATE支持下面几种常用的机器学习模型,如图5-5所示。

  • 线性模型:包括横向和纵向的线性回归、逻辑斯蒂回归等线性模型实现。

  • 树模型:基于纵向的GBDT实现。

  • 神经网络:支持横向的深度神经网络模型DNN。

在这里插入图片描述

本章使用的是逻辑回归模型。进入 $fate_dir/examples/dsl/v1/homo_logistic_regression目录,在该目录下已经有很多预设的dsl和conf文件。在本节的模型训练中,我们挑选其中两个来修改,即使用test_homolr_train_job_dsl.jsontest_homolr_train_job_conf.json两个文件来帮助构建横向联邦模型。

  • test_homolr_train_job_dsl.json:用来描述任务模块,将任务模块以有向无环图的形式组合在一起。

  • test_homolr_train_job_conf.json:用来设置各个组件的参数,比如输入模块的数据表名、算法模块的学习率、batch大小、迭代次数等。

首先查看dsl配置文件。在命令行中输入命令,打开上述dsl文件。当前的dsl已经定义了三个组件模块,这三个组件也构成了最基本的横向联邦模型流水线,在本案例中直接使用即可。

  • dataio_0:数据I/O组件,用于将本地数据转换为DTable。

  • homo_lr_0:横向逻辑回归组件。

  • evaluation_0:模型评估组件,如果没有提供测试数据集,将自动使用训练数据集进行模型评估。

接下来,查看conf配置文件,该文件包括运行相关的所有参数信息,在一般情况下使用默认值即可,需要修改的地方包括以下几处。

  • role_parameters字段:找到role_parameters字段,该字段下包括guest和host,分别对应于两个参与方。这里需要修改三个参数。首先是train_data下面的name和namespace,代表的是训练数据的DTable表名和命名空间;此外,label_name表示的是标签列对应的属性名,比如本案例中,我们的标签列名是“y”。
    在这里插入图片描述
  • algorithm_parameters字段:algorithm_parameters字段用来设置模型训练的超参数信息,包括优化函数、学习率、迭代次数等,可以根据实际需要自行修改。
    在这里插入图片描述
    文件配置修改完后,在命令行中输入下面的命令(submit_job)执行模型训练,该命令只需要提供dsl和conf配置文件即可。
    在这里插入图片描述
    如果一切运行正常,我们可以得到下面的输出信息,将board_url中的网址输入浏览器中可查看当前的任务运行情况。
    在这里插入图片描述

5.4.3 模型评估

模型评估是机器学习算法设计中的重要一环,在联邦学习场景下也是如此,常用的模型评估方法包括留出法和交叉验证法。

  • 留出法(Hold-Out):将数据按照一定的比例进行切分,预留一部分数据作为评估数据集,用于评估联邦学习的模型效果,如图5-6所示。

  • 交叉验证法(Cross-Validation):将数据集D切分为k份,D1,D2,· · ·,Dk,每一次随机选用其中的k-1份数据作为训练集,剩余的一份数据作为评估数据。这样可以获得k组不同的训练数据集和评估数据集,得到k个评估的结果,取其均值作为最终模型评估结果,如图5-7所示。
    在这里插入图片描述

为了评估模型的效果,我们使用额外的数据集作为评估数据集(即采用留出法)。在5.4.1节中,我们为两个参与方都分配了一份测试数据breast_eval.csv,并将其转换为DTable格式。为了将这部分数据用于模型评估,需要修改dsl的组件配置。具体来说,在test_homolr_train_job_dsl文件中,在components组件下添加一个新的数据输入组件“dataio_1”,用来读取测试数据,如下所示。
在这里插入图片描述
dataio_0与dataio_1的设置方式基本一致,主要需要设置module、input和output,如下所示。
在这里插入图片描述

然后,需要修改conf文件,在role_parameters字段中为guest和host添加测试数据的DTable表名。

在这里插入图片描述

修改完文件配置,为了和没有测试数据的版本做区分,我们将dsl文件另存为test_homolr_evaluate_job_dsl.json,将conf文件另存为test_homolr_evaluate_job_conf.json,然后执行submit_job命令。
在这里插入图片描述
在输出信息中,通过提供的board_url可以查看带有模型评估算法组件模块的有向无环图,如图5-8所示。该图实际上由训练模块组件和评估模块组件两部分构成。可以点击评估模块组件中的evaluation_1,然后点击右边的view the outputs按钮查看模型在评估集上的结果,如图5-9所示。

打开可视化界面,将看到内置的各种评估指标变化曲线,如ROC、K-S、Accuracy等,如图5-10所示。

此外,我们还可以查看各评估指标,如AUC、K-S、混淆矩阵的具体数值,如图5-11所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.5 多参与方环境配置

前面介绍了在FATE中进行两个客户端参与的横向朕邦实验,对于多个客户端参与的场景,需要在配置文件conf中修改部分参数值。首先在conf文件找到role字段,在默认状态下只有两方(guest和host,各一个ID值)图5-12展示了如何配置多客户端,具体来说,只需要在role字段下的host子字段方添加新的客户端ID朗可。各客户端ID之间用逗号隔开。

img

接下来,我们在role_parameters字段中,在host子字段中,添加对应的新的客户端的本地训练数扼
的DTable表名和命名空间,下面屉示了图5-12中右侧四个客户端(参与方)情形下的配置。

img

修改完配置文件conf后,多方的横向建模流和前面的两方横向建模流程基本一致,首先为每一个参与方准备训练和评估数据集,再执行submit_job命令进彷训练,此处不再详述。

代码

https://download.csdn.net/download/unseven/88214310

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

unseven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值