隐私计算实训营:联邦学习在垂直场景的开发实践

纵向联邦学习

纵向联邦学习的参与方拥有相同样本空间、不同特征空间的数据,通过共有样本数据进行安全联合建模,在金融、广告等领域拥有广泛的应用场景。和横向联邦学习相比,纵向联邦学习的参与方之间需要协同完成数据求交集、模型联合训练和模型联合推理。并且,参与方越多,纵向联邦学习系统的复杂度就越高。

下面以企业A和企业B两方为例来介绍纵向联邦学习的基本架构和流程。假设企业A有特征数据和标签数据,可以独立建模;企业B有特征数据,缺乏标签数据,因此无法独立建模。由于隐私法规和行业规范等原因,两个企业之间的数据无法直接互通。企业A和企业B可采用纵向联邦学习解决方案进行合作,数据不出本地,使用双方共同样本数据进行联合建模和训练。最终双方都能获得一个更强大的模型。

纵向联邦架构

纵向联邦学习系统中的模型训练一般分为如下阶段: - 样本对齐:首先对齐企业A和企业B中具有相同ID(Identification)的样本数据。在数据对齐阶段,系统会采用加密算法对数据进行保护,确保任何一方的用户数据不会暴露。 - 联合训练:在确定企业A和企业B共有用户数据后,可以使用这些共有的数据来协同训练一个业务模型。模型训练过程中,模型参数信息以加密方式进行传递。已训练好的联邦学习模型可以部署在联邦学习系统的各参与方。

14.3. 纵向联邦学习 — 机器学习系统:设计和实现 1.0.0 documentation

链接中的文章对纵向联邦学习的样本对齐和联合训练进行了进一步的解释。

实践案例:银行营销

任务

市场营销是银行业在不断变化的市场环境中,为满足客户需要、实现经营目标的整体性经营和销售的活动。在目前大数据的环境下,数据分析为银行业提供了更有效的分析手段。对客户需求分析,了解目标市场趋势以及更宏观的市场策略都可以提供依据与方向。

数据来自 kaggle 上的经典银行营销数据集,是一家葡萄牙银行机构电话直销的活动,目标变量是客户是否订阅存款产品。

数据

  1. 样本量总计11162个,其中训练集8929, 测试集2233
  2. 特征16维,标签为2分类
  3. 我们预先对数据进行了切割,alice持有其中的4维基础属性特征,bob持有12维银行交易特征,对应的label只有alice方持有

我们先来看看我们的银行市场营销数据长什么样的?

原始数据被拆分为bank_alice和bank_bob,分别存在alice和bob两方。这里的csv是仅经过拆分没有做预处理的原始数据,我们将使用secretflow preprocess进行FedData预处理。

下面在 Secretflow 环境中创建 2 个实体 [Alice, Bob],其中 ‘Alice’ 和 ‘Bob’ 是两个 PYU。

%load_ext autoreload
%autoreload 2import secretflow as sf
import matplotlib.pyplot as pltsf.init(['alice', 'bob'], address='local')
alice, bob = sf.PYU('alice'), sf.PYU('bob')
import pandas as pd
from secretflow.utils.simulation.datasets import datasetdf = pd.read_csv(dataset('bank_marketing'), sep=';')

我们假设Alice是一个新银行,他们只有用户的基本信息,和是否从其他银行购买过理财产品的label

alice_data = df[["age", "job", "marital", "education", "y"]]
alice_data

Bob端是一个老银行,他们有用户的账户余额,是否有房,是否有贷款,以及最近的营销反馈

bob_data = df[["default","balance","housing","loan","contact","day","month","duration","campaign","pdays","previous","poutcome",]
]
bob_data

创建联邦表

联邦表是一个跨多方的虚拟概念,我们定义 VDataFrame 用于垂直场景设置。

  1. 联邦表中各方的数据存储在本地,不允许出域。
  2. 除了拥有数据的一方之外,没有人可以访问数据存储。
  3. 联邦表的任何操作都会由driver调度给每个worker,执行指令会逐层传递,直到特定worker的Python Runtime。 框架确保只有当worker的 worker.device 和 Object.device 相同时,才能够操作数据。
  4. 联邦表旨在从中心角度管理和操作多方数据。
  5. Federated Table 的接口与 pandas.DataFrame 对齐,以降低多方数据操作的成本。
  6. SecretFlow 框架提供 Plain&Ciphertext (明密文)混合编程能力。垂直联邦表是使用 SPU 构建的, MPC-PSI 用于安全地获取来自各方的交集和对齐数据。

VDataFrame 提供类似于 pandas 的 read_csv 接口,不同之处在于secretflow.read_csv 接收一个定义双方数据路径的字典。我们可以使用 secretflow.vertical.read_csv 来构建 VDataFrame 。

from secretflow.data.split import train_test_split
from secretflow.ml.nn import SLModel
read_csv(file_dict,delimiter,ppu,keys,drop_key)filepath: Path of the participant file. The address can be a relative or absolute path to a local filespu: SPU Device for PSI; If this parameter is not specified, data must be prealignedkeys: Key for intersection.
spu = sf.SPU(sf.utils.testing.cluster_def(['alice', 'bob']))
from secretflow.utils.simulation.datasets import load_bank_marketing# Alice has the first four features,
# while bob has the left features
data = load_bank_marketing(parts={alice: (0, 4), bob: (4, 16)}, axis=1)
# Alice holds the label.
label = load_bank_marketing(parts={alice: (16, 17)}, axis=1)

data 为构建好的垂直联邦表,它从全局上只拥有所有数据的 Schema

我们进一步来看一下VDF的数据管理

通过一个实例可以看出,age这个字段是属于alice的,所以在alice方的partition可以得到对应的列,但是bob方想要去获取age的时候会报`KeyError`错误。

这里有一个Partition的概念,是我们定义的一个数据分片,每个Partition都会有自己的device归属,只有归属的device才可以操作数据。

data['age'].partitions[alice].data

输出结果:

<secretflow.device.device.pyu.PYUObject at 0x7fd7b1e8cb20>
data['age'].partitions[bob]

会引发报错:

KeyError: PYURuntime(bob)

我们接着对生成的联邦表做数据预处理。

我们这里以LabelEncoder和MinMaxScaler为例,这两个预处理函数在`sklearn`中有对应的概念,它们的使用方法和sklearn中是类似的

from secretflow.preprocessing.scaler import MinMaxScaler
from secretflow.preprocessing.encoder import LabelEncoder

encoder = LabelEncoder()
data['job'] = encoder.fit_transform(data['job'])
data['marital'] = encoder.fit_transform(data['marital'])
data['education'] = encoder.fit_transform(data['education'])
data['default'] = encoder.fit_transform(data['default'])
data['housing'] = encoder.fit_transform(data['housing'])
data['loan'] = encoder.fit_transform(data['loan'])
data['contact'] = encoder.fit_transform(data['contact'])
data['poutcome'] = encoder.fit_transform(data['poutcome'])
data['month'] = encoder.fit_transform(data['month'])
label = encoder.fit_transform(label)

print(f"label= {type(label)},\ndata = {type(data)}")

通过MinMaxScaler做数据标准化

scaler = MinMaxScaler()data = scaler.fit_transform(data)

接着我们将数据集划分成训练集(train-set)和测试集(test-set)

from secretflow.data.split import train_test_splitrandom_state = 1234
train_data, test_data = train_test_split(data, train_size=0.8, random_state=random_state
)
train_label, test_label = train_test_split(label, train_size=0.8, random_state=random_state
)

小结 :到这里为止,我们就完成了联邦表的定义,数据的预处理,以及训练集和测试集的划分。 SecretFlow框架定义了跨越多方的 联邦表 概念,同时定义了一套构建在联邦表上的操作(它在逻辑上对等 pandas.DataFrame) ,同时定义了对于联邦表的预处理操作(它在逻辑上对等 sklearn)。

模型构建

单方模型:

对于该任务一个基本的DNN就可以完成,输入16维特征,经过一个DNN网络,输出对于正负样本的概率。

多方模型:

  • Alice:
    • base_net:输入4维特征,经过一个dnn网络得到hidden.
    • fuse_net:接收_alice,以及bob计算得到的hidden特征,输入这些特征到fuse_net,进行特征融合,送入之后的网络完成整个前向传播过程和反向传播过程。
  • Bob:
    • base_net:输入12维特征,经过一个dnn网络得到hidden,然后将hidden发送给alice方,完成接下来的运算。
def create_base_model(input_dim, output_dim, name='base_model'):# Create modeldef create_model():from tensorflow import kerasfrom tensorflow.keras import layersimport tensorflow as tfmodel = keras.Sequential([keras.Input(shape=input_dim),layers.Dense(100, activation="relu"),layers.Dense(output_dim, activation="relu"),])# Compile modelmodel.summary()model.compile(loss='binary_crossentropy',optimizer='adam',metrics=["accuracy", tf.keras.metrics.AUC()],)return modelreturn create_model

我们使用create_base_model分别为 Alice 和 Bob 创建他们的base model

# prepare model
hidden_size = 64model_base_alice = create_base_model(4, hidden_size)
model_base_bob = create_base_model(12, hidden_size)
model_base_alice()
model_base_bob()

接下来我们定义有label的一方,或者server端的模型——fuse_model。在fuse_model的定义中,我们需要正确的定义loss,optimizer,metrics。

def create_fuse_model(input_dim, output_dim, party_nums, name='fuse_model'):def create_model():from tensorflow import kerasfrom tensorflow.keras import layersimport tensorflow as tf# inputinput_layers = []for i in range(party_nums):input_layers.append(keras.Input(input_dim,))merged_layer = layers.concatenate(input_layers)fuse_layer = layers.Dense(64, activation='relu')(merged_layer)output = layers.Dense(output_dim, activation='sigmoid')(fuse_layer)model = keras.Model(inputs=input_layers, outputs=output)model.summary()model.compile(loss='binary_crossentropy',optimizer='adam',metrics=["accuracy", tf.keras.metrics.AUC()],)return modelreturn create_model
model_fuse = create_fuse_model(input_dim=hidden_size, party_nums=2, output_dim=1)
model_fuse()

我们需要三个参数来初始化SLModel

  • base_model_dict:一个字典,它需要传入参与训练的所有client以及base_model映射。
  • device_y:PYU对象,哪一方持有label
  • model_fuse:融合模型,具体的优化器以及损失函数都在这个模型中进行定义

定义 base_model_dict

base_model_dict:Dict[PYU,model_fn]
from secretflow.security.privacy import DPStrategy, LabelDP
from secretflow.security.privacy.mechanism.tensorflow import GaussianEmbeddingDP# Define DP operations
train_batch_size = 128
gaussian_embedding_dp = GaussianEmbeddingDP(noise_multiplier=0.5,l2_norm_clip=1.0,batch_size=train_batch_size,num_samples=train_data.values.partition_shape()[alice][0],is_secure_generator=False,
)
label_dp = LabelDP(eps=64.0)
dp_strategy_alice = DPStrategy(label_dp=label_dp)
dp_strategy_bob = DPStrategy(embedding_dp=gaussian_embedding_dp)
dp_strategy_dict = {alice: dp_strategy_alice, bob: dp_strategy_bob}
dp_spent_step_freq = 10
sl_model = SLModel(base_model_dict=base_model_dict,device_y=alice,model_fuse=model_fuse,dp_strategy_dict=dp_strategy_dict,
)
sf.reveal(test_data.partitions[alice].data), sf.reveal(test_label.partitions[alice].data
)
sf.reveal(train_data.partitions[alice].data), sf.reveal(train_label.partitions[alice].data
)
history = sl_model.fit(train_data,train_label,validation_data=(test_data, test_label),epochs=10,batch_size=train_batch_size,shuffle=True,verbose=1,validation_freq=1,dp_spent_step_freq=dp_spent_step_freq,
)

下面可视化训练过程

# Plot the change of loss during training
plt.plot(history['train_loss'])
plt.plot(history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper right')
plt.show()

# Plot the change of accuracy during training
plt.plot(history['train_accuracy'])
plt.plot(history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper left')
plt.show()

# Plot the Area Under Curve(AUC) of loss during training
plt.plot(history['train_auc_1'])
plt.plot(history['val_auc_1'])
plt.title('Model Area Under Curve')
plt.ylabel('Area Under Curve')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper left')
plt.show()

调用一下评估函数,看下训练效果怎么样

global_metric = sl_model.evaluate(test_data, test_label, batch_size=128)

(运行以上代码是对于性能有一定要求,可能碰到OutOfMemoryError)

下面对比下单方模型

1.数据

数据也使用 Kaggle 的反欺诈数据集。在这里,我们只使用 Alice 的新银行数据。(特征个数为四个)

from tensorflow import keras
from tensorflow.keras import layers
import tensorflow as tf
from sklearn.model_selection import train_test_splitdef create_model():model = keras.Sequential([keras.Input(shape=4),layers.Dense(100, activation="relu"),layers.Dense(64, activation='relu'),layers.Dense(64, activation='relu'),layers.Dense(1, activation='sigmoid'),])model.compile(loss='binary_crossentropy',optimizer='adam',metrics=["accuracy", tf.keras.metrics.AUC()],)return modelsingle_model = create_model()
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import LabelEncoderencoder = LabelEncoder()
single_part_data = alice_data.copy()single_part_data['job'] = encoder.fit_transform(alice_data['job'])
single_part_data['marital'] = encoder.fit_transform(alice_data['marital'])
single_part_data['education'] = encoder.fit_transform(alice_data['education'])
single_part_data['y'] = encoder.fit_transform(alice_data['y'])
y = single_part_data['y']
alice_data = single_part_data.drop(columns=['y'], inplace=False)
scaler = MinMaxScaler()
alice_data = scaler.fit_transform(alice_data)
train_data, test_data = train_test_split(alice_data, train_size=0.8, random_state=random_state
)
train_label, test_label = train_test_split(y, train_size=0.8, random_state=random_state)
alice_data.shape

2.训练

single_model.fit(train_data,train_label,validation_data=(test_data, test_label),batch_size=128,epochs=10,shuffle=False,
)
single_model.evaluate(test_data, test_label, batch_size=128)

小结

上面两个实验模拟了一个典型的垂直场景的训练问题,Alice和Bob拥有相同的样本群体,但每一方只有样本的一部分特征数据,如果Alice只用自己的一方数据来训练模型,能够得到一个准确率为0.583,auc 分数为0.53的模型,但是如果联合Bob的数据之后,可以获得一个准确率为0.893,auc分数为0.883的模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1527497.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Openharmony 下载到rk3568实现横屏

前言&#xff1a; Openharmony 源码版本4.1 release 板子&#xff1a;rk3568 1.修改“abilities”中的“orientation”实现横竖屏 entyr->src->module.json5文件里面添加 "orientation": "landscape", 2.修改系统源码属性实现横竖屏切换 通过这…

以太网--TCP/IP协议(二)

上文中讲述了IP协议&#xff0c;本文主要来讲一下TCP协议。 TCP协议 &#xff08;1&#xff09;端到端通信 直接把源主机应用程序产生的数据传输到目的主机使用这 些数据的应用程序中&#xff0c;就是端到端通信。 &#xff08;2&#xff09;传输层端口 公认端口&#xff0…

ansible--role

简介 roles是ansible&#xff0c;playbooks的目录的组织结构&#xff0c;将代码或文件进行模块化&#xff0c;成为roles的文件目录组织结构。 易读&#xff0c;代码可冲哟美好&#xff0c;层次清晰 目录机构 mkdir roles/nginx/{files,handlers,tasks,templates,vars} -ptou…

Google Play结算防掉单方案

我们公司的产品主要是出海产品,使用的是Google Play支付,但是在上线以后,经常有客诉,说支付以后,权益没有到账,于是对整个Google支付体系做了研究了一下。 我们的整个支付流程图大概如下: 其中后端参考的文档地址为: https://developers.google.com/android-publishe…

GB35114 USC安防平台 中星微国密摄像机配置 流程

中星微国密摄像机配置介绍 如下以中星微VS-IPC8021S-Y-T4摄像机为例&#xff0c;需要先各自获取p10文件&#xff0c;并通过证书签发机构或者测试SM2证书签发获取证书。 网络配置如下: 摄像机的IP地址为192.168.1.108&#xff0c;国标ID为34020000001320000015 系统的IP地址…

C#/.NET/.NET Core推荐学习路线文档文章

前言 专门为C#/.NET/.NET Core推荐学习路线&文档&文章提供的一个Issues&#xff0c;各位小伙伴可以把自己觉得不错的学习路线、文档、文章相关地址分享出来&#x1f91e;。 https://github.com/YSGStudyHards/DotNetGuide/issues/10 &#x1f3f7;️C#/.NET/.NET Cor…

【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节

激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 FeatureExtraction 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算&#xff08;calculateSmoothness()&#xff09;2. 标记遮挡点&#xff08;markOcc…

nvm及nodejs安装相关

安装 1.清空文件夹&#xff0c;卸载nvm及nodejs 2.下载安装包 https://github.com/coreybutler/nvm-windows/releases &#xff08;也下载有&#xff09; 3.安装nvm 地址写D:/nvm和D:/nodejs 4.安装nodejs nvm ls available //查询版本 nvm install 16.20.2 //安装对应版…

【H2O2|全栈】关于HTML(1)认识HTML

HTML相关知识 目录 前言 准备工作 WEB前端是什么&#xff1f; HTML是什么&#xff1f; 如何运行HTML文件&#xff1f; 标签 概念 分类 双标签和单标签 行内标签和块标签 HTML文档结构 预告和回顾 UI设计相关 Markdown | Md文档相关 项目合作管理相关 后话 前…

idea快捷键_idea 2024 复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面 (必备)

Ctrl G 在当前文件跳转到指定行处 Ctrl J 插入自定义动态代码模板 &#xff08;必备&#xff09; Ctrl P 方法参数提示显示 &#xff08;必备&#xff09; Ctrl Q 光标所在的变量 / 类名 / 方法名等上面&#xff08;也可以在提示补充的时候按&#xff09;&#xff0c;显示文…

基于SpringBoot的校园跑腿系统+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

tabBar设置底部菜单以及选项iconfont图标

1.tabBar设置底部菜单 在官网里面可以了解到tabBar组件的一些知识和注意点&#xff1a; 需要给页面设置一个底部导航的话可以在pages.json里面设置一个tabBar标签&#xff0c;在其里面设置pagePath和text属性。 可以看的pagePath是跳转的地址&#xff0c;text是下面导航的文字…

DataLoader使用

文章目录 一、认识dataloader二、DataLoader整合数据集三、使用DataLoader展示图片方法四、去除结尾不满足batch_size设值图片的展示 一、认识dataloader DataLoader 用于封装数据集&#xff0c;并提供批量加载数据的迭代器。它支持自动打乱数据、多线程数据加载等功能。datas…

SpringDataJPA系列(7)Jackson注解在实体中应用

SpringDataJPA系列(7)Jackson注解在实体中应用 常用的Jackson注解 Springboot中默认集成的是Jackson&#xff0c;我们可以在jackson依赖包下看到Jackson有多个注解 一般常用的有下面这些&#xff1a; 一个实体的示例 测试方法如下&#xff1a; 按照上述图片中的序号做个简…

汽车网络安全的未来:将车辆视为端点

汽车行业面临着许多与其他行业的成功企业相同的网络安全风险和威胁&#xff0c;但它也在应对一些独特的风险和威胁。 Nuspire 的首席威胁分析师 Josh Smith&#xff08;一家在汽车领域有着深厚根基并保护通用汽车和斯巴鲁等客户的托管安全服务提供商&#xff09;谈到了当前的风…

多个路由器级联实现子网的方式

好久没写博客啦&#xff0c;最近搬家&#xff0c;换了网络环境&#xff0c;简单记录一下网络配置。 拓扑图就不画了&#xff0c;光猫 - > 华为TC7102路由 -> 华为AX2 Pro路由 -> 各种设备&#xff0c;简单表示就是这样。 原因是第一个路由是房东的&#xff0c;我希望自…

Lombok jar包引入和用法

大家好&#xff0c;今天分享一个在编写代码时的快捷方法。 当我们在封装实体类时&#xff0c;会使用set、get等一些方法。如下图&#xff0c;不但费事还影响代码的美观。 那么如何才能减少代码的冗余呢&#xff0c;首先lib中导入lombok的jar包并添加库。 此处我已导入&#xf…

【软件工程】软件开发模型

三、瀑布模型 四、几种软件开发模型的主要特点 题目 判断题 选择题 小结

linux中PATH变量-详细介绍(1)

配置完后可以通过echo $PATH查看配置结果。 生效方法&#xff1a;立即生效 有效期限&#xff1a;临时改变&#xff0c;只能在当前的终端窗口中有效&#xff0c;当前窗口关闭后就会恢复原有的path配置 用户局限&#xff1a;仅对当前用户 2.对用户生效 因为写入到 .bash_prof…

1014 Waiting in Line

链接&#xff1a; 1014 Waiting in Line - PAT (Advanced Level) Practice (pintia.cn) 大致题意&#xff1a; 有 n 个窗口&#xff0c;每个窗口最多能容纳 m 人同时排队。一共有 k 个顾客&#xff0c;他们每个人有一个服务时长 t[i]。顾客们从早上 8 点开始服务。如果一个顾…