sassoftware/dpmm
GitHub: sassoftware/dpmm
一个提供端到端差分隐私保障的表格数据合成生成库,实现PrivBayes、MST、AIM等前沿边缘模型。
Stars: 12 | Forks: 2
# _dpmm_: 差分隐私边缘模型,一个用于合成表格数据生成的库


[](https://arxiv.org/abs/2506.00322)
## 概述
_dpmm_ 是一个 Python 库,实现了最先进的差分隐私边缘模型,用于生成合成表格数据。
边缘模型已被一致证明能够捕获原始数据的关键统计特性(如边缘分布),并在合成数据中重现这些特性,而差分隐私 (DP) 则确保了个人隐私得到严格保护。
主要功能摘要:
* 端到端的 DP 管道,包括数据预处理、生成模型和机制:
* DP 数据预处理 —— 1) 数据域作为输入提供或通过 DP 提取[论文](https://www.research-collection.ethz.ch/handle/20.500.11850/508570),以及 2) 连续数据通过 DP 进行离散化(Uniform 和 PrivTree[论文](https://arxiv.org/abs/1601.03229))
* 基于 select-measure-generate 范式[论文1](https://arxiv.org/abs/2108.04978),[论文2](https://differentialprivacy.org/synth-data-1/) 和 Private-PGM[论文](https://arxiv.org/abs/1901.09136) 的最先进 DP 生成模型 —— PrivBayes[论文](https://dl.acm.org/doi/10.1145/3134428)、MST[论文](https://arxiv.org/abs/2108.04978) 和 AIM[论文](https://arxiv.org/abs/2201.12677)
* DP 机制的浮点精度[论文](https://arxiv.org/abs/2207.10635)
* 卓越的实用性和性能
* 跨所有模型/管道的丰富功能
* 对底层机制和模型/管道的 DP 审计[论文1](https://arxiv.org/abs/2405.10994),[论文2](https://dl.acm.org/doi/10.1145/3576915.3616607)
__注意:预期用途 —— _dpmm_ 专为隐私保护合成数据生成(特别是在简单场景中,例如在具有最多 32 个特征[论文1](https://arxiv.org/abs/2112.09238),[论文2](https://arxiv.org/abs/2305.10994) 的数据集中保留高质量的 1/2 路边缘)中的研究和探索性用途而设计,并非旨在用于复杂现实应用中的生产环境。__
## 安装
### 前置条件
- Python 3.10 或 3.11
### PyPi 安装
你也可以通过运行以下命令从 PyPi 安装:
```
pip install dpmm
```
### 本地安装
要从本地 github 仓库安装,请运行以下命令:
```
git clone git@github.com:sassoftware/dpmm.git
cd dpmm
poetry install
```
### 测试
要运行单元测试,请转到仓库的根目录(如果是本地安装),并使用以下命令:
```
pytest tests/
```
## 功能
我们提供了大量示例,展示了 __dpmm__ 在数据预处理以及生成模型训练和生成方面的功能。
这些示例涵盖所有模型和模型设置,并可从仓库访问(如果是本地安装)。
__注意:此包的总体意图是通过管道层使用,以确保不会发生隐私泄露,直接使用模型是可能的,但在这种情况下,必须提供域以确保隐私保证。__
### 预处理
提供的生成管道将自动 DP 离散化预处理与生成模型结合在一起,并允许以下功能:
| 功能 | 描述 | 示例 |
| --- | --- | --- |
| __dtype 支持__ | 原生支持以下 pandas 数据类型:`datetime`、`timedelta`、`float`、`int`、`category`、`bool`。 | [Dtypes 示例](https://github.com/sassoftware/dpmm/tree/main/examples/example_dtypes.ipynb) |
|__空值支持__ | 支持缺失值,如果真实数据的任何列中存在缺失值,它们将被相应地重现。 | |
|__自动离散化__ | 虽然 _dpmm_ 使用的默认离散化策略是 `priv-tree`,但也提供了更典型的 `uniform` 策略,它们都可以与 `'auto'` 模式结合使用,该模式将尝试为每个数值列确定最佳的箱数。 | |
### 模型功能
| 功能 | 描述 | 示例 |
| --- | --- | --- |
| __域压缩__ | 可以将 `compress` 标志设置为 `True`,以确保离散化的域被压缩,从而改善隐私预算/数据质量的权衡。 | |
|__模型大小控制__ | 一个 `max_model_size` 参数,确保所选边缘的内存占用保持在指定的上限阈值之下。 | [最大内存示例](https://github.com/sassoftware/dpmm/tree/main/examples/example_memory.ipynb) |
|__模型序列化__ | 管道可以通过提供有效的文件夹来存储模型,从而序列化到磁盘或从磁盘反序列化。 | [序列化示例](https://github.com/sassoftware/dpmm/tree/main/examples/example_serialisation.ipynb) |
### 生成功能
| 功能 | 描述 | 示例 |
| --- | --- | --- |
| __条件生成__ | 在生成时,也可以提供一个仅包含部分列的部分 dataframe,在这种情况下,生成管道将条件生成剩余的列。 | [条件生成示例](https://github.com/sassoftware/dpmm/tree/main/examples/example_conditional.ipynb) |
| __确定性生成__ | 当在生成时提供 `random_state` 值时,假设提供了相同的输入参数,生成过程将变为确定性的。 | [随机状态示例](https://github.com/sassoftware/dpmm/tree/main/examples/example_seed.ipynb) |
### 模型
实现的模型包括:
| 方法 | 描述 | 参考 | 示例 |
|--- | --- | --- | --- |
|**PrivBayes+PGM**| 差分隐私贝叶斯网络。 | [PrivBayes: Private Data Release via Bayesian Networks](https://dl.acm.org/doi/10.1145/3134428)| [PrivBayes 示例](https://github.com/sassoftware/dpmm/tree/main/examples/example_privbayes.ipynb) |
|**MST**| 最大生成树。 | [Winning the NIST Contest: A scalable and general approach to differentially private synthetic data](https://arxiv.org/abs/2108.04978)| [MST 示例](https://github.com/sassoftware/dpmm/tree/main/examples/example_mst.ipynb) |
|**AIM**| 自适应迭代机制。 | [AIM: An Adaptive and Iterative Mechanism for Differentially Private Synthetic Data](https://arxiv.org/abs/2201.12677)| [AIM 示例](https://github.com/sassoftware/dpmm/tree/main/examples/example_aim.ipynb) |
__注意:所有模型都依赖于 select-measure-generate 范式[论文1](https://arxiv.org/abs/2108.04978),[论文2](https://differentialprivacy.org/synth-data-1/) 和 Private-PGM[论文](https://arxiv.org/abs/1901.09136)。__
## 快速开始
要开始使用 _dpmm_,请按照以下步骤操作:
1. 导入必要的模块并加载你的数据:
import pandas as pd
import json
from dpmm.pipelines import MSTPipeline
wine_dir = Path().parent / "wine"
df = pd.read_pickle(wine_dir / "wine.pkl.gz")
with (wine_dir / "wine_bounds.json").open("r") as f:
domain = json.load(f)
2. 初始化并拟合模型:
model = MSTPipeline(
# Generator Parameters
epsilon=1.0,
delta=1e-5,
# Discretiser Parametrs
proc_epsilon=0.1,
)
model.fit(df, domain)
3. 生成合成数据:
synth_df = model.generate(n_records=100)
print(synth_df)
"""
type fixed acidity volatile acidity citric acid residual sugar chlorides free sulfur dioxide total sulfur dioxide density pH sulphates alcohol quality
0 white 5.288142 0.190330 0.212473 1.402665 0.032305 37.097305 60.585301 0.990234 2.998241 0.658841 12.467682 1
1 white 5.956364 0.225099 0.210124 15.968057 0.043620 70.073909 202.689578 0.995807 3.198247 0.318414 10.290390 0
2 white 5.315535 0.341091 0.247268 0.628240 0.024938 52.468176 104.892353 0.990975 3.161218 0.971699 11.181373 1
3 white 7.879125 0.234170 0.275704 3.711610 0.039565 68.977194 163.380550 1.005989 3.068622 0.798520 8.075999 0
4 white 6.981342 0.358461 0.337705 3.600390 0.050450 51.567452 134.896467 0.996149 3.272745 0.599021 10.200400 0
"""
### 故障排除
如果你遇到任何问题,请检查以下内容:
- 确保已安装所有必需的包。
- 验证你的数据不包含缺失值或非整数列(如果使用某些模型)。
- 检查模型参数并确保它们设置正确。
## 许可证
该项目根据 [Apache 2.0 许可证](https://github.com/sassoftware/dpmm/tree/main/LICENSE) 授权。
该项目还使用了以下项目的代码片段:
- [private-pgm](https://github.com/ryan112358/private-pgm): Apache 2.0
- [opendp](https://github.com/opendp/smartnoise-sdk): MIT License
- [ektelo](https://github.com/ektelo/ektelo): Apache 2.0
## 其他资源
* [SAS Global Forum 论文](https://www.sas.com/en_us/events/sas-global-forum.html)
* [SAS 社区](https://communities.sas.com/)
## 引用
如果你使用此代码,请引用相关论文:
```
@inproceedings{mahiou2025dpmm,
title={{dpmm: Differentially Private Marginal Models, a Library for Synthetic Tabular Data Generation}},
author={Mahiou, Sofiane and Dizche, Amir and Nazari, Reza and Wu, Xinmin and Abbey, Ralph and Silva, Jorge and Ganev, Georgi},
booktitle={TPDP},
year={2025}
}
```
标签:AIM, Apex, MST, Private-PGM, PrivBayes, 人工智能安全, 合成数据生成, 合规性, 安全规则引擎, 差分隐私, 数据脱敏, 数据隐私保护, 数据预处理, 机器学习, 统计建模, 联邦学习前置处理, 表格数据, 边缘模型, 逆向工具, 隐私审计, 隐私计算