很多时候,我们希望能通过模拟的手段获取接近真实场景的数据,来完成推演和测试的任务和目的。
比如,业务系统的功能和流程性测试,数据报表的demo制作,算法模型的流程测试、性能测试、超惨与训练等等。
有这样需求的原因,莫过于暂时没有数据,或者是系统没上线还没有真实的业务发生,或者是出于数据安全、合规、隐私、安全的原因而暂时不能获取,或者研发环境与生产环境脱节等等。
以上,也是在众多的数据类型中直接遇到的问题或是项目复盘中提到的增效方法之一。
简单的通过模拟生成数据的方法,我们之前提到过。就是根据对业务场景的理解,结构化其所能产生的或需要的数据,然后模拟产生。具体,大家可以通过下面内容了解详情。
test.X 是通过沉淀真实经验,调研市场需求,抽象出来的简单易用的数据生成工具。它可以帮助你轻松模拟真实业务场景数据,帮你便捷、高效地实现产品性能测试、演示,环境搭建、BI报表设计和Demo搭建。
你是否还在为后端接口迟迟未提供真实数据而耽误前端开发进度心烦意乱呢?_Zi_Q的博客-CSDN博客https://blog.csdn.net/chengxu28/article/details/133387301?spm=1001.2014.3001.5501免费在线数据生成器,test.X-假数据,真场景,帮助你提高系统测试、产品演示、报表Demo搭建效率_在线测试数据生成-CSDN博客
https://blog.csdn.net/chengxu28/article/details/133751115?spm=1001.2014.3001.5501造点假数据进行产品测试、BI报表demo设计、更贴合客户业务的产品演示,test.X一定可以让你事半功倍_Zi_Q的博客-CSDN博客
https://blog.csdn.net/chengxu28/article/details/133762712?spm=1001.2014.3001.5501用高保真度,类似于生产的数据测试你的应用-CSDN博客
https://blog.csdn.net/chengxu28/article/details/134074285?spm=1001.2014.3001.5501但是,在有如下严苛的场景要求时,上述的数据生成方法将显得不足以满足需求:
能获取数据样本,希望基于样本数据来生成新的数据。要求字段类型,字段值与样本保持一致,字段之间的关系与样本接近。看起来和用起来都更加接近真实数据,可以用来做更多的数据分析任务,比如BI报表,算法模型训练等,甚至是发现新的数据。
下面,我们讲介绍一种能满足上述需求的方法,基于生成式AI技术来实现。
首先,大家应该了解下什么是生成式AI,合成数据及合成数据的一些方法。大家可以自行搜索或通过下面链接了解。
合成数据平台:释放生成式人工智能对结构化数据生成的力量-今日头条 (toutiao.com)https://www.toutiao.com/article/7296299697214472755/?log_from=883e9158144f1_1699335653798基于GAN的结构化合成数据生成-今日头条 (toutiao.com)
https://www.toutiao.com/article/7296662537893642790/?log_from=ea7d288102793_1699335651672今天我们主要介绍SDV实现数据生成的方法,SDV是the Synthetic Data Vault的缩写,在Python中有相应的包可以实现。

下面我们就直接上代码:
# 首先安装包,因为我是在Jupyter Notebook中运行,代码如下
!pip install sdv
# 加载自有数据
from sdv.datasets.local import load_csvs
# 将'Titanic_train.csv'文件放置在当前目录下data的文件夹中
datasets = load_csvs("/data/")
# 获取数据
real_data = datasets['Titanic_train']
# 查看数据
real_data.head()
# 识别数据的元数据(metadata)
from sdv.metadata import SingleTableMetadata
metadata = SingleTableMetadata()
metadata.detect_from_dataframe(data=real_data)
# 查看metadata
metadata
以下是该数据的元数据,包括字段信息(字段名,字段类型,字段敏感信息标识),主键信息,和文件类型信息。
{
"columns": {
"PassengerId": {
"sdtype": "id"
},
"Survived": {
"sdtype": "categorical"
},
"Pclass": {
"sdtype": "categorical"
},
"Name": {
"sdtype": "unknown",
"pii": true
},
"Sex": {
"sdtype": "categorical"
},
"Age": {
"sdtype": "numerical"
},
"SibSp": {
"sdtype": "categorical"
},
"Parch": {
"sdtype": "categorical"
},
"Ticket": {
"sdtype": "unknown",
"pii": true
},
"Fare": {
"sdtype": "numerical"
},
"Cabin": {
"sdtype": "categorical"
},
"Embarked": {
"sdtype": "categorical"
}
},
"primary_key": "PassengerId",
"METADATA_SPEC_VERSION": "SINGLE_TABLE_V1"
}
注意,其中有类型为unknown的字段,表示自动识别失败,需要手动补全其类型。
# 手动补全未识别到的字段类型
metadata.update_column(
column_name='Name',
sdtype='categorical')
metadata.update_column(
column_name='Ticket',
sdtype='categorical')
通过SDV的单表模型创建模型进行模型训练
# 创建合成器,训练模型
from sdv.lite import SingleTablePreset
synthesizer = SingleTablePreset(metadata, name='FAST_ML')
synthesizer.fit(data=real_data)
基于得到的生成器,进行数据生成
# 生成数据
synthetic_data = synthesizer.sample(num_rows=500)
# 合成数据质量检查
from sdv.evaluation.single_table import evaluate_quality
quality_report = evaluate_quality(
real_data,
synthetic_data,
metadata)
Generating report ... (1/2) Evaluating Column Shapes: : 100%|██████████| 12/12 [00:00<00:00, 357.40it/s] (2/2) Evaluating Column Pair Trends: : 100%|██████████| 66/66 [00:10<00:00, 6.28it/s] Overall Quality Score: 67.39% Properties: - Column Shapes: 75.36% - Column Pair Trends: 59.41%
以上是对生成的数据进行的质量检查,主要是跟真实数据进行对别。该模型效果还不是很好,大家可以动手训练试试是否能训练得到更好的模型。
也可以通过以下方式进行真假数据对比,来可视化模拟效果:
from sdv.evaluation.single_table import get_column_plot
fig = get_column_plot(
real_data=real_data,
synthetic_data=synthetic_data,
column_name='Sex',
metadata=metadata
)
# fig.show()
from IPython.display import HTML # 导入HTML
HTML(fig.to_html())
同样,可以得到其他特征的分布:
from sdv.evaluation.single_table import get_column_pair_plot
fig = get_column_pair_plot(
real_data=real_data,
synthetic_data=synthetic_data,
column_names=['Survived', 'Sex'],
metadata=metadata)
# fig.show()
from IPython.display import HTML # 导入HTML
HTML(fig.to_html())
同样,可以得到其他特征之间的关系分布:
如果大家对此内容感兴趣,可以关注、回复,可以直接给到大家脚本和数据,谢谢。