sunchang0124/dp_cgans
GitHub: sunchang0124/dp_cgans
结合差分隐私与条件生成对抗网络的表格与 RDF 合成数据生成库。
Stars: 92 | Forks: 28
# 👯 DP-CGANS (差分隐私 - 条件生成对抗网络)
[](https://pypi.org/project/dp-cgans/) [](https://pypi.org/project/dp-cgans/) [](https://github.com/sunchang0124/dp_cgans/actions/workflows/test.yml) [](https://github.com/sunchang0124/dp_cgans/actions/workflows/publish.yml)
**摘要**:本仓库展示了一个结合差分隐私技术的用于表格数据(和 RDF 数据)的条件生成对抗网络。我们的预印本出版物:[Generating synthetic personal health data using conditional generative adversarial networks combining with differential privacy](https://doi.org/10.1016/j.jbi.2023.104404)。
**作者**:Chang Sun,马斯特里赫特大学数据科学研究所
**开始日期**:2021 年 11 月
**状态**:开发中
**注**:“站在巨人的肩膀上”。本仓库受到了来自 [Synthetic Data Vault (SDV)](https://github.com/sdv-dev/SDV) 的 [CTGAN](https://github.com/sdv-dev/CTGAN)、[Tensorflow Privacy](https://github.com/tensorflow/privacy) 和 [RdfPdans](https://github.com/cadmiumkitty/rdfpandas) 等出色工作的启发。非常感谢他们分享的想法和实现,公开代码以及编写良好的文档。更多相关工作可在下方的参考文献中找到。
该包扩展自 SDV (https://github.com/sdv-dev/SDV)、CTGAN (https://github.com/sdv-dev/CTGAN) 以及 GANs 中的差分隐私 (https://github.com/civisanalytics/dpwgan)。作者修改了条件矩阵和代价函数,以强调变量之间的关系。主要更改位于 ctgan/synthesizers/ctgan.py ../data_sampler.py ../data_transformer.py
## 📥️ 安装
你需要 Python >=3.8+ 且 <=3.11。sdv ==1.6.0,以及 rdt==1.9.0
```
pip install dp-cgans
```
## 🪄 用法
### ⌨️ 作为命令行界面使用
在使用 pip 安装 `dp-cgans` 后,你可以轻松地通过终端为文件生成合成数据。
为了快速运行我们的示例,你可以下载 [示例数据](https://raw.githubusercontent.com/sunchang0124/dp_cgans/main/resources/example_tabular_data_UCIAdult.csv):
```
wget https://raw.githubusercontent.com/sunchang0124/dp_cgans/main/resources/example_tabular_data_UCIAdult.csv
```
然后运行 `dp-cgans`:
```
dp-cgans gen example_tabular_data_UCIAdult.csv --epochs 100 --output out.csv --gen-size 100
```
通过以下命令获取生成合成数据的可用选项的完整概览:
```
dp-cgans gen --help
```
### 🐍 配合 Python 使用
该库也可以直接在 Python 脚本中使用
如果你的输入是表格数据(例如 csv):
```
from dp_cgans import DP_CGAN
import pandas as pd
import time
tabular_data=pd.read_csv("../resources/example_tabular_data_UCIAdult.csv")
### 添加您的预处理(如果需要)
for col in tabular_data.columns:
tabular_data[col] = pd.to_numeric(tabular_data[col], errors='ignore', downcast='integer')
for col in tabular_data.columns:
if tabular_data[col].nunique() < 10:
tabular_data[col] = tabular_data[col].astype('object')
# 配置模型超参数
model = DP_CGAN(
epochs=500, # number of training epochs
batch_size=100, # the size of each batch
log_frequency=True,
verbose=True,
generator_dim=(128, 128, 128),
discriminator_dim=(128, 128, 128),
generator_lr=2e-4,
discriminator_lr=2e-4,
discriminator_steps=10,
private=False,
)
start_time = time.time()
print("Start training the model: ")
model.fit(tabular_data)
end_time = time.time()
elapsed_time = end_time - start_time
print("Training model time ", elapsed_time)
print("Saving the trained generator...")
model.save("generator.pkl")
# print("load the trained file.")
# loaded_model=DP_CGAN.load("PATH_TO_MODEL")
# 生成 100 行合成数据
syn_data = model.sample(100)
syn_data.to_csv("syn_data_file.csv",index=None)
```