隐语隐私计算实训营「联邦学习」第 5 课:基于隐私保护的机器学习算法介绍

【隐私计算实训营】是蚂蚁集团隐语开源社区出品的线上课程,自实训营上线以来,获得行业内外广泛关注,吸引上千余名开发者报名参与。本次暑期夏令营课程中,除了最新上线的「联邦学习系列」,还包含了「隐私保护数据分析」和「隐私保护机器学习」,主题,小伙伴们可以根据需求自由选择报名期待和大家共同探索隐私计算的前沿技术!
隐私计算实训营「机器学习」:隐私计算实训营「机器学习」
隐私计算实训营「联邦学习」:隐私计算实训营「联邦学习」
隐私计算实训营「数据分析」:隐私计算实训营「数据分析」

1. 预处理和隐私求交

1.1 DataFrame 和 FedNdarray

DataFrame和FedNdarray是隐语中用于处理联邦数据的两个重要封装。

在这里插入图片描述

DataFrame

  • 用于联邦表格数据的封装
  • 由多个参与方的数据块构成
  • 支持三种数据切分方式:
    1. 水平切分(HDataFrame API)
    2. 垂直切分(VDataFrame API)
    3. 混合切分(MixDataFrame API)

FedNdarray

  • 联邦ndarray的封装
  • 同样由多个参与方的数据块构成
  • 支持水平和垂直切分
  • 使用统一的API:FedNdarray

这两种数据结构都提供了读写API,方便直接使用。

DataFrame和FedNdarray的详细说明:

  • DataFrame是一种类似于pandas DataFrame的数据结构,但专门用于联邦学习场景。它允许多方共同操作数据,而不需要直接共享原始数据。
  • 水平切分指的是不同参与方拥有相同特征但不同样本的数据。
  • 垂直切分指的是不同参与方拥有相同样本但不同特征的数据。
  • 混合切分是水平和垂直切分的组合,适用于更复杂的数据分布场景。

1.2 预处理工具

隐语提供了多种预处理工具:

  1. 可以直接使用DataFrame API处理数据
  2. 使用sf.preprocessing包内的各类预处理组件

常见的预处理操作包括:

  • 缺失值填充
  • 标准化

安全提示:某些预处理算子会计算并公开用于辅助计算的统计值。在使用前,请仔细评估这些统计值是否包含隐私信息。

1.3 隐私求交(PSI)

隐私求交(PSI)的工作原理:
PSI允许两方在不泄露各自集合中其他元素的情况下,找出共同拥有的数据项。例如,两家银行可以使用PSI来确定共同的客户,而不需要披露各自的完整客户列表。PSI通常使用加密哈希函数和混淆技术来实现。

应用场景:

  • 在垂直拆分场景中,常用于第一步的数据对齐
  • 进一步用于数据分析或机器学习建模

隐语中PSI的两种使用方式:

  1. 使用spu.psi_csv等接口
  2. 使用data.vertical.read_csv接口

注:隐语支持多种PSI算法,可根据参与方数量、带宽、算力、数据不平衡度等因素选择合适的算法。

2. 决策树模型和线性回归模型

2.1 决策树模型

隐语支持多种决策树算法,适用于回归和二分类训练。

算法API场景安全性性能
SS-XGBsecretflow.ml.boost.ss_xgb_v.Xgb垂直切分可证安全通信成本高,通常较慢
SecureBoostsecretflow.ml.boost.sgb_v.Sgb垂直切分非可证安全计算量大,通信量小,通常较快
水平XGBoostsecretflow.ml.boost.homo_boost.SFXgboost水平切分非可证安全-

2.2 线性回归模型

隐语提供了多种线性回归模型,适用于不同场景:

算法API场景安全性算法类型性能特点
SS-SGDsecretflow.ml.linear.SSRegression垂直切分可证安全线性回归、逻辑回归通信量大,大带宽下速度快
HESS-SGDsecretflow.ml.linear.HESSLogisticRegression垂直切分可证安全逻辑回归计算量大,网络受限情况下速度快
SS-GLMsecretflow.ml.linear.SSGLM垂直切分可证安全广义线性回归-
混合联邦LRsecretflow.ml.linear.FlLogisticRegressionMix混合切分(2+n)非可证安全逻辑回归-

3. 神经网络算法

隐语提供了两种主要的神经网络算法,适用于不同的场景:

  1. 水平联邦学习:secretflow.ml.nn.FLModel
  2. 垂直拆分学习:secretflow.ml.nn.SLModel

安全提示:这两种算法都属于非可证安全算法,其安全性需要根据具体场景分析。可以通过安全聚合、差分隐私、稀疏化等安全加固组件来增强安全性。

3.1 水平联邦学习 (FLModel)

FLModel是一个通用范式,而非具体的模型或算法。主要特点:

  • 支持TensorFlow和PyTorch两种后端
  • 可以使用tf或torch原生方式编写模型代码
  • 支持使用封装好的模型库,如torchvision和tf.keras.applications

FLModel提供了丰富的选项:

  1. 自定义数据加载器(支持DataFrame、文件、图片等)
  2. 选择内置或自定义的安全聚合算法
  3. 选择内置或自定义的联邦学习策略(优化训练效率、处理non-iid问题等)
  4. 选择训练后端(TensorFlow或PyTorch)

水平联邦学习中的安全聚合:
安全聚合是一种保护参与方模型更新隐私的技术。在每轮训练后,各参与方的模型更新会被加密,然后聚合。只有聚合后的结果才会被解密和应用,这样可以防止中央服务器或其他参与方推断出单个参与方的模型更新。

3.2 垂直拆分学习 (SLModel)

SLModel同样是一个通用范式,主要特点:

  • 支持TensorFlow和PyTorch两种后端
  • 模型被拆分成2份、3份或更多,分布在不同参与方
  • 需要针对拆分学习架构重新设计模型结构
  • 隐语提供了预先拆分好的模型库:sf.ml.nn.applications

SLModel提供的选项:

  1. 自定义数据加载器(支持DataFrame、文件、图片等)
  2. 选择内置或自定义的通信优化算法(如稀疏化和量化压缩算法)
  3. 选择内置或自定义的垂直拆分策略(如加速训练的策略算法)
  4. 选择训练后端(TensorFlow或PyTorch)

垂直拆分学习中的通信优化:
在垂直拆分学习中,不同参与方负责模型的不同部分。这需要在前向和后向传播过程中频繁通信。通信优化技术,如梯度压缩和量化,可以显著减少通信开销。例如,可以只传输大于某个阈值的梯度值(稀疏化),或将浮点数梯度转换为较少位数的整数(量化)。

4. DataFrame实践

4.1 DataFrame

前置准备

初始化secretflow,创建alice、bob和carol三个参与方。

import secretflow as sf# In case you have a running secretflow runtime already.
sf.shutdown()sf.init(['alice', 'bob', 'carol'], address='local')
alice, bob, carol = sf.PYU('alice'), sf.PYU('bob'), sf.PYU('carol')

数据准备

我们使用 iris 作为示例数据集。

import pandas as pd
from sklearn.datasets import load_irisiris = load_iris(as_frame=True)
data = pd.concat([iris.data, iris.target], axis=1)
data

在这里插入图片描述
我们按照水平(特征相同)和垂直(样本相同)两种方式对数据进行切分.

# Horizontal partitioning.
h_alice, h_bob, h_carol = data.iloc[:40, :], data.iloc[40:100, :], data.iloc[100:, :]# Save to temporary files.
import tempfile
import ostemp_dir = tempfile.mkdtemp()h_alice_path = os.path.join(temp_dir, 'h_alice.csv')
h_bob_path = os.path.join(temp_dir, 'h_bob.csv')
h_carol_path = os.path.join(temp_dir, 'h_carol.csv')
h_alice.to_csv(h_alice_path, index=False)
h_bob.to_csv(h_bob_path, index=False)
h_carol.to_csv(h_carol_path, index=False)h_alice.head(), h_bob.head(), h_carol.head()

在这里插入图片描述

# Vertical partitioning.
v_alice, v_bob, v_carol = data.iloc[:, :2], data.iloc[:, 2:4], data.iloc[:, 4:]# Save to temporary files.
v_alice_path = os.path.join(temp_dir, 'v_alice.csv')
v_bob_path = os.path.join(temp_dir, 'v_bob.csv')
v_carol_path = os.path.join(temp_dir, 'v_carol.csv')
v_alice.to_csv(v_alice_path, index=False)
v_bob.to_csv(v_bob_path, index=False)
v_carol.to_csv(v_carol_path, index=False)v_alice, v_bob, v_carol

在这里插入图片描述

创建水平DataFrame

创建一个由水平切分数据组成的DataFrame。

💡原始数据仍然保持在数据拥有方本地,并不会出域。

作为演示,我们选择了安全聚合和spu安全比较。您可以参考 安全聚合 了解更多安全聚合方案,并选择适合您的安全策略。

from secretflow.data.horizontal import read_csv as h_read_csv
from secretflow.security.aggregation import SecureAggregator
from secretflow.security.compare import SPUComparator# The aggregator and comparator are respectively used to aggregate
# or compare data in subsequent data analysis operations.
aggr = SecureAggregator(device=alice, participants=[alice, bob, carol])spu = sf.SPU(sf.utils.testing.cluster_def(parties=['alice', 'bob', 'carol']))
comp = SPUComparator(spu)
hdf = h_read_csv({alice: h_alice_path, bob: h_bob_path, carol: h_carol_path},aggregator=aggr,comparator=comp,
)

创建垂直DataFrame

from secretflow.data.vertical import read_csv as v_read_csvvdf = v_read_csv({alice: v_alice_path, bob: v_bob_path, carol: v_carol_path})

数据分析

为了保护数据隐私,DataFrame不允许对原始数据进行查看。DataFrame提供了类似pandas的接口来方便用户分析数据。这些接口对水平和垂直切分数据都通用。

在以下操作中,原始数据仍然保持在数据拥有方本地,并不会传输出域。

hdf.columns

在这里插入图片描述

vdf.columns

在这里插入图片描述
获取最小值,可以看到和原始数据一致。

print('Horizontal df:\n', hdf.min())
print('\nVertical df:\n', vdf.min())
print('\nPandas:\n', data.min())

在这里插入图片描述
查看比如最大值、平均值、数量等信息。

hdf.max()

在这里插入图片描述

vdf.max()

在这里插入图片描述

hdf.mean(numeric_only=True)

在这里插入图片描述

vdf.mean(numeric_only=True)

在这里插入图片描述

hdf.count()

在这里插入图片描述

vdf.count()

在这里插入图片描述

选取数据

hdf_part = hdf[['sepal length (cm)', 'target']]
hdf_part.mean(numeric_only=True)

在这里插入图片描述

vdf_part = hdf[['sepal width (cm)', 'target']]
vdf_part.mean(numeric_only=True)

在这里插入图片描述

修改数据

hdf_copy = hdf.copy()
print('Min of target: ', hdf_copy['target'].min()[0])
print('Max of target: ', hdf_copy['target'].max()[0])# Set target to 1。
hdf_copy['target'] = 1# You can see that the value of target has become 1.
print('Min of target: ', hdf_copy['target'].min()[0])
print('Max of target: ', hdf_copy['target'].max()[0])

在这里插入图片描述

vdf_copy = vdf.copy()
print('Min of sepal width (cm): ', vdf_copy['sepal width (cm)'].min()[0])
print('Max of sepal width (cm): ', vdf_copy['sepal width (cm)'].max()[0])# Set sepal width (cm) to 20。
vdf_copy['sepal width (cm)'] = 20# You can see that the value of sepal width (cm) has become 20.
print('Min of sepal width (cm): ', vdf_copy['sepal width (cm)'].min()[0])
print('Max of sepal width (cm): ', vdf_copy['sepal width (cm)'].max()[0])

在这里插入图片描述

5. 预处理实践

前置准备

初始化隐语,创建alice和bob两个参与方。

import secretflow as sf# Check the version of your SecretFlow
print('The version of SecretFlow: {}'.format(sf.__version__))# In case you have a running secretflow runtime already.
sf.shutdown()sf.init(['alice', 'bob'], address='local')
alice = sf.PYU('alice')
bob = sf.PYU('bob')

数据准备

我们使用 iris 作为示例数据集。

import pandas as pd
from sklearn.datasets import load_irisiris = load_iris(as_frame=True)
data = pd.concat([iris.data, iris.target], axis=1)# In order to facilitate the subsequent display,
# here we first set some data to None.
data.iloc[1, 1] = None
data.iloc[100, 1] = None# Restore target to its original name.
data['target'] = data['target'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})
data

在这里插入图片描述
创建垂直DataFrame。

import tempfile
from secretflow.data.vertical import read_csv as v_read_csv# Vertical partitioning.
v_alice, v_bob = data.iloc[:, :2], data.iloc[:, 2:]# Save to temprary files.
_, alice_path = tempfile.mkstemp()
_, bob_path = tempfile.mkstemp()
v_alice.to_csv(alice_path, index=False)
v_bob.to_csv(bob_path, index=False)df = v_read_csv({alice: alice_path, bob: bob_path})

预处理

隐语提供了缺失值填充、标准化、分类数据编码、离散化等多种预处理功能,其使用方式和sklearn的预处理一致。

缺失值填充

DataFrame提供了fillna方法,可以和pandas一样对缺失值进行填充。

# Before filling, the sepal width (cm) is missing in two positions.
df.count()['sepal width (cm)']# Fill sepal width (cm) with 10.
df.fillna(value={'sepal width (cm)': 10}).count()['sepal width (cm)']

在这里插入图片描述

标准化

将特征缩放到某个范围。
隐语提供了 MinMaxScaler 用于把特征缩放到最大和最小值之间。MinMaxScaler的输入和输出形式均为DataFrame。

下面是将 sepal length (cm) 缩放到[0, 1]范围的示例。

from secretflow.preprocessing import MinMaxScalerscaler = MinMaxScaler()scaled_sepal_len = scaler.fit_transform(df['sepal length (cm)'])print('Min: ', scaled_sepal_len.min())
print('Max: ', scaled_sepal_len.max())

在这里插入图片描述

方差缩放

隐语提供了 StandardScaler 进行方差缩放。StandardScaler的输入和输出行为均为DataFrame。

下面是一个将 sepal length (cm) 进行方差缩放的例子。

from secretflow.preprocessing import StandardScalerscaler = StandardScaler()scaled_sepal_len = scaler.fit_transform(df['sepal length (cm)'])print('Min: ', scaled_sepal_len.min())
print('Max: ', scaled_sepal_len.max())

在这里插入图片描述

独热编码

隐语提供了 OneHotEncoder 用作独热编码。 OneHotEncoder的输入和输出行为均为DataFrame。

下面是一个对target列进行独热编码的例子。

from secretflow.preprocessing import OneHotEncoderonehot_encoder = OneHotEncoder()
onehot_target = onehot_encoder.fit_transform(df['target'])print('Columns: ', onehot_target.columns)
print('Min: \n', onehot_target.min())
print('Max: \n', onehot_target.max())

在这里插入图片描述

标签编码

隐语提供了 LabelEncoder 用作将标签列编码至[0, 类别数 - 1]。LabelEncoder的输入输出形式均为DataFrame。

下面是一个对target列进行标签编码的例子。

from secretflow.preprocessing import LabelEncoderlabel_encoder = LabelEncoder()
encoded_label = label_encoder.fit_transform(df['target'])print('Columns: ', encoded_label.columns)
print('Min: \n', encoded_label.min())
print('Max: \n', encoded_label.max())

在这里插入图片描述

离散化

隐语提供了 KBinsDiscretizer 用作将连续数据切分成离散值。KBinsDiscretizer的输入输出形式均为DataFrame。

下面是一个将 petal length (cm) 切分成5个分桶的例子。

from secretflow.preprocessing import KBinsDiscretizerestimator = KBinsDiscretizer(n_bins=5)
binned_petal_len = estimator.fit_transform(df['petal length (cm)'])print('Min: \n', binned_petal_len.min())
print('Max: \n', binned_petal_len.max())

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java项目实战springboot校园失物招领系统

✌网站介绍:✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围:Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容:免费功能设计、免费提供开题答辩P…

3D建模软件--犀牛Rhino for Mac

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试安装完成!!! 效果 一、下载软件 下载软件…

初学Mybatis之配置解析

MyBatis 中文网配置教程 mybatis-config.xml 环境配置(environments) 尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境 可以有多个 enviroment,但是 enviroments default(默认)只…

动态规划题目:单词拆分/三角形最小路径和 - leetcode

动态规划思想 / 步骤 : 先将 当前要求 总结成一个 精炼的 小问题 , 然后 将 求解题目 转换为 求解N个 小问题 , 每个小问题的 求解过程相同 ,但是 过程涉及 的 数据 是不同的 , 例如第三个 小问…

c++网络编程实战——开发基于ftp协议的文件传输模块(二) 配置ftp服务与手动执行ftp命令

配置FTP服务 一.前言 博主的环境是阿里云服务器,操作系统版本为 ubuntu20.04,一下所有操作都基于以上环境下进行的操作,同时为了简化操作我将开放同一个云服务器的不同端口,让它同时充当服务端和客户端,大家如果想测试效果更好且…

WPF串口通讯程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using HardwareCommunications; using System.IO.Ports; using System.Windows;namespace PortTest {/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainW…

软件缺陷(Bug)、禅道

目录 软件缺陷的判定标准 软件缺陷的核心内容 构成缺陷的基本要素 缺陷报告 缺陷管理 缺陷的跟踪流程 项目管理工具--禅道 软件在使用过程中存在的任何问题&#xff08;如&#xff1a;错误、异常等&#xff09;&#xff0c;都叫软件的缺陷&#xff0c;简称bug。 软件缺…

如何选择海洋船舶用总线NMEA 2000连接器

NMEA 2000连接器概述 NMEA 2000连接器是现代船舶通信系统中不可或缺的部分&#xff0c;主要用于连接船上各种电子设备&#xff0c;实现数据传输和设备控制。这些连接器遵循NMEA 2000协议标准&#xff0c;支持高速数据传输&#xff0c;并具有良好的防水、耐腐蚀性能&#xff0c…

神经网络之循环神经网络

目录 一、循环神经网络概述&#xff1a;1.传统神经网络与循环神经网络的区别&#xff1a;2.循环神经网络定义&#xff1a; 图片来自&#xff1a;深度学习———循环神经网络 一、循环神经网络概述&#xff1a; 1.传统神经网络与循环神经网络的区别&#xff1a; MLP、卷积神经…

【PostgreSQL教程】PostgreSQL 选择数据库

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

多目标遗传算法(NSGAⅢ)的原理和matlab实现

参考文献&#xff1a; [1] Deb K , Jain H .An Evolutionary Many-Objective Optimization Algorithm Using Reference-Point-Based Nondominated Sorting Approach, Part I: Solving Problems With Box Constraints[J].IEEE Transactions on Evolutionary Computation, 2014,…

【Simple PIR】单服务器开源最快匿踪查询算法解析

7月17日&#xff0c;我们在《隐私计算匿踪查询技术深入浅出》中介绍了关于隐私计算中匿踪查询的定义和常见算法&#xff0c;并引出了前沿算法Simple PIR的介绍&#xff0c;本次将对Simple PIR进行正式的算法原理介绍。 1. Simple PIR快览 1.1 性能介绍 Simple PIR是Alexandra…

docker 打包orbbec

docker pull humble容器 sudo docker run -it osrf/ros:humble-desktop docker 启动容器 sudo docker run -u root --device/dev/bus/usb:/dev/bus/usb -it -v /home/wl:/share --name wl4 osrf/ros:humble-desktop /bin/bash新开一个终端 查看本地存在的容器&#xff1a;…

高速ADC模拟输入接口设计

目录 基本输入接口考虑 输入阻抗 输入驱动 带宽和通带平坦度 噪声 失真 变压器耦合前端 有源耦合前端网络 基本输入接口考虑 采用高输入频率、高速模数转换器(ADC)的系统设计是一 项具挑战性的任务。ADC输入接口设计有6个主要条件&#xff1a; 输入阻抗、输入驱动、带宽…

开源模型应用落地-FastAPI-助力模型交互-进阶篇-中间件(四)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理&#xff0c;使应用程序能够处理各种不同的请求场景&#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面&#xff0c;高级用法提供了更精细和准确的控制&#…

IPython魔法命令的深入应用

目录 IPython魔法命令的深入应用 一、魔法命令基础 1. 魔法命令的分类 2. 基本使用 二、高级应用技巧 1. 数据交互与处理 2. 交互式编程与调试 三、魔法命令的进阶操作 1. 自定义魔法命令 2. 利用魔法命令优化工作流程 四、总结与展望 IPython魔法命令的深入应用 IP…

vulnhub——Ai-Web1靶机渗透

Ai-Web1靶机渗透 靶机下载&#xff1a; 官网地址&#xff1a;https://www.vulnhub.com/entry/ai-web-1,353/ 攻击机&#xff1a;kali2024 一、信息收集 发下目标主机的IP为&#xff1a;192.168.201.141 用nmap工具扫描一下对方主机和服务 发现他打开了80端口 发现搜不到于是…

人是一个AI Agent吗?

人是一个AI Agent吗&#xff1f; 什么是AI Agent&#xff1f;人类的感知能力人类的推理与决策人类的执行能力人类的学习能力人类作为AI Agent的局限性结论 随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;AI已经在许多领域展现出其强大的能力。AI Agent&…

详解数据结构之二叉树(堆)

详解数据结构之二叉树(堆) 树 树的概念 树是一个非线性结构的数据结构&#xff0c;它是由 n(n>0)个有限节点组成的一个具有层次关系的集合&#xff0c;它的外观形似一颗倒挂着的树&#xff0c;根朝上&#xff0c;叶朝下&#xff0c;所以称呼为树。每颗子树的根节点有且只…

QXlsx读写excel

QXlsx读写excel 安装 QXlsx使用 qmake使用 CMake 基本用法1. 写入 Excel 文件2. 读取 Excel 文件 详细用法1. 设置单元格样式2. 合并单元格3. 创建图表4. 设置列宽和行高 完整示例 QXlsx 是一个用于在 Qt 应用中读写 Excel 文件的第三方库。它提供了丰富的 API&#xff0c;可以…