当前位置: 首页 > news >正文

CTGAN 合成数据生成与验证脚本学习笔记

CTGAN 合成数据生成与验证脚本学习笔记

本笔记详细讲解如何使用 CTGAN 对混凝土材料数据进行合成、物理约束筛选,并进行统计与分布验证。适合数据科学、材料科学相关领域学习者参考。

1. 导入依赖与数据读取

首先导入所需库,并读取原始数据:

import pandas as pd
import numpy as np
from ctgan import CTGAN
from sklearn.preprocessing import QuantileTransformer
import warningswarnings.filterwarnings('ignore')
# 读取数据
....

2. 数据预处理

将所有数据列转换为 float,并用 QuantileTransformer 统一分布(有助于后续建模):

# 数据预处理
for column in real_data.columns:real_data.loc[:, column] = real_data[column].astype(float)# QuantileTransformer进行分布转换
transformer = QuantileTransformer(output_distribution='normal')
transformed_data = pd.DataFrame(transformer.fit_transform(real_data),columns=real_data.columns
)

3. CTGAN 模型构建与训练

设置 CTGAN 参数并训练生成模型:

# 定义离散列
discrete_columns = []# 优化CTGAN模型参数
ctgan = CTGAN(epochs=2000,  # 训练轮数batch_size=100,  # 批次大小pac=5,  # pac参数generator_dim=(512, 1024, 2048, 1024, 512),  # 网络结构discriminator_dim=(512, 1024, 2048, 1024, 512),generator_lr=1e-5,  #学习率discriminator_lr=1e-5,discriminator_steps=3,  # 判别器训练步数verbose=True
)# 训练模型
print("开始训练模型...")
ctgan.fit(transformed_data, discrete_columns)

4. 生成与反向转换数据

生成十倍于原始数据量的合成数据,并反向转换回原始分布:

# 生成数据后筛选
n_synthetic = len(real_data) * 10  # 生成数据
synthetic_transformed = ctgan.sample(n_synthetic)# 反向转换数据
synthetic_data = pd.DataFrame(transformer.inverse_transform(synthetic_transformed),columns=real_data.columns
)

5. 物理约束函数

apply_physical_constraints

为合成数据添加物理约束,确保各成分比例合理,且分布接近原始数据。

def apply_physical_constraints(data, real_data):# 确保所有值非负for col in data.columns:data.loc[:, col] = np.maximum(data[col], 0)#归一化binder_sum = data[binder_columns].sum(axis=1)for col in binder_columns:data.loc[:, col] = data[col] / binder_sum#物理约束constraints = {#范围约束}# 硬约束for col, (min_val, max_val) in constraints.items():data.loc[:, col] = data[col].clip(min_val, max_val)

6. 分布相似性筛选函数

select_best_samples_with_distribution

用 Wasserstein 距离筛选与原始分布最接近的合成样本。

def select_best_samples_with_distribution(synthetic_data, real_data, n_select):from scipy.stats import wasserstein_distance# Wasserstein距离distances = []for i in range(len(synthetic_data)):sample = synthetic_data.iloc[i:i + 1]# 特征Wasserstein距离总和dist_sum = 0for col in real_data.columns:# 权重weight = 2.0 if col in ['Cement', 'FA', 'GGBFS', 'F-D', 'F-L'] else 1.0dist = wasserstein_distance(sample[col], real_data[col]) * weightdist_sum += distdistances.append(dist_sum)# 选择距离最小n_selectbest_indices = np.argsort(distances)[:n_select]return synthetic_data.iloc[best_indices]

7. 约束与筛选后的数据保存与验证

应用物理约束与分布筛选后,保存合成数据并进行多项统计验证:

synthetic_data = apply_physical_constraints(synthetic_data, real_data)
synthetic_data = select_best_samples_with_distribution(synthetic_data, real_data, len(real_data))

8.结果(部分)

在这里插入图片描述

##本文档仅供学习参考,实际使用时请结合具体数据和业务需求调整参数与约束条件。

相关文章:

  • 从巅峰到谷底:搜狐的27年沉浮启示录
  • 清醒思考的艺术
  • 算法导论思考题
  • (二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)
  • 人机共跑,马拉松人型机器人同跑
  • 通信信号分类识别
  • ARM裸机开发——I.MX6U_汇编LED灯驱动
  • 数据分析师-Part1-职业介绍
  • java:单链表基础操作:插入、删除、移动节点
  • day1 python训练营
  • 箱线图(盒须图)QCPStatiBox
  • Redis进阶学习
  • [Windows] 星光桌面精灵 V0.5
  • *数字信号基础
  • 如何使用人工智能大模型,免费快速写工作总结?
  • 有限差分法求解线性常微分方程及python实现
  • Qt基础005(文件操作后续)
  • C++类成员函数 重写、覆盖与隐藏
  • 头歌java课程实验(函数式接口及lambda表达式)
  • 七段码 路径压缩 并查集 dfs
  • 心源性猝死正“猎杀”年轻人,这几招保命法则要学会
  • 深一度|奥运一年后丢冠不稀奇,但究竟谁来扛起男乒的大旗
  • “你是做什么的?”——人们能否对工作说不?
  • 钧正平发声:擅自更改地图标注,谷歌想当南海搅局者?!
  • 陈尚君:唐文治的环球旅行
  • 陕西省委深入贯彻中央八项规定精神学习教育工作专班召开会议