5.4 横向联邦模型训练
数据准备好之后,下一步可以利用FATE来构建横向联邦模型进行训练。在FATE中构建横向联邦模型,通常情况下会涉及下面三项工作。
• 数据输入:将文件(如csv、txt等文本文件)转换为FATE支持的DTable格式。DTable是一个分布式数据集合,是FATE的基础数据结构,FATE的所有运算都基于DTable格式进行。
• 模型训练:数据转换为DTable格式后,FATE可以为模型训练构建流水线(pipeline)。
• 模型评估:横向联邦的模型评估与集中式的模型评估一样,将训练好的模型作用于测试数据集来评估模型性能。
FATE为横向联邦训练提供了丰富的接口,如4.3节所述,开发人员只需要通过提供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。
图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”。
• 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-6 留出法
图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-8 有向无环图
左边是没有添加评估数据组件的流水线;右边是添加了评估数据组件的流水线
图5-9 查看评估集上的结果
图5-10 各种评估指标变化曲线
图5-11 各评估指标