![联邦学习实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/730/38209730/b_38209730.jpg)
5.4 横向联邦模型训练
数据准备好之后,下一步可以利用FATE来构建横向联邦模型进行训练。在FATE中构建横向联邦模型,通常情况下会涉及下面三项工作。
• 数据输入:将文件(如csv、txt等文本文件)转换为FATE支持的DTable格式。DTable是一个分布式数据集合,是FATE的基础数据结构,FATE的所有运算都基于DTable格式进行。
• 模型训练:数据转换为DTable格式后,FATE可以为模型训练构建流水线(pipeline)。
• 模型评估:横向联邦的模型评估与集中式的模型评估一样,将训练好的模型作用于测试数据集来评估模型性能。
FATE为横向联邦训练提供了丰富的接口,如4.3节所述,开发人员只需要通过提供dsl和conf配置文件,就能完成上面的所有操作。为了后面的叙述统一,我们假设读者安装的FATE单机版本目录如下,后面的讲解都以该目录作为基目录。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_81_1.jpg?sign=1738970610-LQh8NgIuyUrsMlhyF2ZTzSLmUUA6pnwl-0-d59f8679a9f25b482fc21f5938f7c05c)
5.4.1 数据输入
FATE提供了将本地文件转化为DTable格式的工具,首先将本地的训练数据和测试数据上传到$fate_dir/examples/data目录,该操作可以使用rz命令完成。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_81_2.jpg?sign=1738970610-HeytCygtcUBNHpZUmto1Uj5kvdgs2e0d-0-56b93ccb861d6275a4f198459fd30ce3)
我们定义上传数据配置文件,将其命名为upload_data.json,其内容如下所示。需要修改其中的三个字段,即file,table_name和namespace,其余字段使用默认值。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_81_3.jpg?sign=1738970610-QWIIZvCpWj8iO5RK43ghExFl14ildmVm-0-14e91410507954e35816385a0b259216)
这三个字段对应的含义如下。
• file:对应的本地文件位置,也就是刚刚上传的目录文件夹。
• table_name:将本地文件转换为DTable格式的表名,可根据需要自行设置。
• namespace:DTable格式的表名对应的命名空间,可根据需要自行设置。
以上传文件breast_1_train.csv为例,修改后的upload_data.json文件如下所示。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_82_1.jpg?sign=1738970610-A3L0vC0NVRJyoZskQyMGdJO8tFyGZBIU-0-5deb0acc210e69903b64c537e4c4d0fd)
修改完成后,在命令行中执行下面的命令(upload),FATE会自动将原始的本地文件breast_1_train.csv转换为DTable格式。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_82_2.jpg?sign=1738970610-Irxew7ZsqfyQt7HsUL0SmEVp0D5S68MQ-0-ee15989a95418846687881fb89f73ff4)
如果成功执行,那么系统将返回下面的信息,可以将board_url字段中提供的网址输入浏览器中查看执行结果。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_82_3.jpg?sign=1738970610-zhlYQ3BZH3WoYeiKarDjJLV1kUg2zIzJ-0-c5b754234ff3445b9ae699fbf0e0d355)
同理,对于breast_2_train.csv,可以按照上面的过程执行。对于测试数据集,我们将本地测试文件上传到两个参与方,并各自转化为DTable格式。如下所示。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_82_4.jpg?sign=1738970610-7tiz07213NdUUkcjTr4eLdOuFzZrKPOm-0-ea08064b882359400dfd5b049e9ca08e)
5.4.2 模型训练
当我们在上一步将本地数据转换为DTable格式后,就可以开始构建联邦学习训练流水线了。FATE官方提供了很多模型参考例子。当前FATE支持下面几种常用的机器学习模型,如图5-5所示。
• 线性模型:包括横向和纵向的线性回归、逻辑斯蒂回归等线性模型实现。
• 树模型:基于纵向的GBDT实现。
• 神经网络:支持横向的深度神经网络模型DNN。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_83_1.jpg?sign=1738970610-3VndEols31kCoyQ5vlI9OMWAyQQ7bIjc-0-e5dd0f59ca72f2c17f1b4fb2619b14ab)
图5-5 FATE支持的几种常用机器学习模型
本章使用的是逻辑回归模型。进入 $fate_dir/examples/dsl/v1/homo_logistic_regression目录,在该目录下已经有很多预设的dsl和conf文件。在本节的模型训练中,我们挑选其中两个来修改,即使用test_homolr_train_job_dsl.json和test_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”。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_84_1.jpg?sign=1738970610-8hwrq4DUrbF2TpvLwsjw6YbrcatTt4CM-0-08196a388217a0552fc2a7487daae8f4)
• algorithm_parameters字段:algorithm_parameters字段用来设置模型训练的超参数信息,包括优化函数、学习率、迭代次数等,可以根据实际需要自行修改。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_84_2.jpg?sign=1738970610-MWqebcq0YeTpPcVsguSfOdrV5iQrlwZz-0-95829ad7555eeac709ebc53bd9576b1a)
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_85_1.jpg?sign=1738970610-PYu6YIIxulLRuxvtOPBZosT8i5yuE8lN-0-b8ceb88e50897dfa261c8df0d2ec0590)
文件配置修改完后,在命令行中输入下面的命令(submit_job)执行模型训练,该命令只需要提供dsl和conf配置文件即可。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_85_2.jpg?sign=1738970610-TmsejOIFKIT8zw49VWvdSsxInhxeSuar-0-2c59fe2dd0ba8e2fda2e5947ad7ae024)
如果一切运行正常,我们可以得到下面的输出信息,将board_url中的网址输入浏览器中可查看当前的任务运行情况。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_85_3.jpg?sign=1738970610-1JF0sD6igRmUCJ5cCRSzqVGmFVaxRTLZ-0-7e9a6526b3f7a4b39fe967392167f640)
5.4.3 模型评估
模型评估是机器学习算法设计中的重要一环,在联邦学习场景下也是如此,常用的模型评估方法包括留出法和交叉验证法。
• 留出法(Hold-Out):将数据按照一定的比例进行切分,预留一部分数据作为评估数据集,用于评估联邦学习的模型效果,如图5-6所示。
• 交叉验证法(Cross-Validation):将数据集D切分为k份,D1,D2,· · ·,Dk,每一次随机选用其中的k-1份数据作为训练集,剩余的一份数据作为评估数据。这样可以获得k组不同的训练数据集和评估数据集,得到k个评估的结果,取其均值作为最终模型评估结果,如图5-7所示。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_86_1.jpg?sign=1738970610-x1SwoqGrOhfGxNMA3lWjjfkz8aDC2Amg-0-668a296dde5a46457ea08ec9d84b3ba3)
图5-6 留出法
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_86_2.jpg?sign=1738970610-CsnOdUgKMBURDqAseCS7ko6Rna01Nidv-0-f772790be8a5c876337107fedf9ede02)
图5-7 交叉验证法
为了评估模型的效果,我们使用额外的数据集作为评估数据集(即采用留出法)。在5.4.1节中,我们为两个参与方都分配了一份测试数据breast_eval.csv,并将其转换为DTable格式。为了将这部分数据用于模型评估,需要修改dsl的组件配置。具体来说,在test_homolr_train_job_dsl文件中,在components组件下添加一个新的数据输入组件“dataio_1”,用来读取测试数据,如下所示。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_86_3.jpg?sign=1738970610-hgJaRzN160xt8HaQJKTagC4zBq6yMh7g-0-bd00352e7eeff2d07e928674f499d89a)
dataio_0与dataio_1的设置方式基本一致,主要需要设置module、input和output,如下所示。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_86_4.jpg?sign=1738970610-46O5XgHrDJuAUDFj4MGri9MS2rz2krW9-0-c0b6e123c7933d9cae28120f96250628)
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_87_1.jpg?sign=1738970610-OBi7rrLzbkhmWal7bLynAtTctNOs472e-0-9f0cea517f0e5427ef59d8980e7a0e26)
然后,需要修改conf文件,在role_parameters字段中为guest和host添加测试数据的DTable表名。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_87_2.jpg?sign=1738970610-6ovoxmMX9CMBZ4DuCxvRhh49OBYdIwmI-0-b7c4f6f2051ce3ea76556a5bc37cdef1)
修改完文件配置,为了和没有测试数据的版本做区分,我们将dsl文件另存为test_homolr_evaluate_job_dsl.json,将conf文件另存为test_homolr_evaluate_job_conf.json,然后执行submit_job命令。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_87_3.jpg?sign=1738970610-M6rIXuEw9Mpq01f3NEEVkee3PCLtr3wn-0-6d49d97d8396564659dd0ef5e456884c)
在输出信息中,通过提供的board_url可以查看带有模型评估算法组件模块的有向无环图,如图5-8所示。该图实际上由训练模块组件和评估模块组件两部分构成。可以点击评估模块组件中的evaluation_1,然后点击右边的view the outputs按钮查看模型在评估集上的结果,如图5-9所示。
打开可视化界面,将看到内置的各种评估指标变化曲线,如ROC、K-S、Accuracy等,如图5-10所示。
此外,我们还可以查看各评估指标,如AUC、K-S、混淆矩阵的具体数值,如图5-11所示。
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_88_1.jpg?sign=1738970610-mgSwShQkIVDSfjNzHOuw2w8NkE0Wlc2Z-0-f325d5699d56520b2ac8904873cb8ca7)
图5-8 有向无环图
左边是没有添加评估数据组件的流水线;右边是添加了评估数据组件的流水线
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_88_2.jpg?sign=1738970610-8JggPZLjwKE4KbyArmzJAgbph3q1DNOo-0-ffb765a95acb27e4e745dc456bcbbf65)
图5-9 查看评估集上的结果
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_88_3.jpg?sign=1738970610-ksAdtudMHTvhZgU1E5fvdfbgcjpnsVBb-0-9d96c12e0734ef2bb6b86d784d259f38)
图5-10 各种评估指标变化曲线
![](https://epubservercos.yuewen.com/7DD80E/20118172408701706/epubprivate/OEBPS/Images/40792_89_1.jpg?sign=1738970610-eytKrVkWtVSnJq7dxNAVEHcQsEPDguxM-0-e7df2177338a9189bf0a8a381d0186a2)
图5-11 各评估指标