趋近智
在了解了表格数据的基本结构后,生成合成表格最直接的方法之一是逐列创建值,而不考虑其他列。这种方法称为独立列值生成。
这里的核心假设是,在同一行中,一列的值不影响另一列的值。虽然这在真实数据集中通常不成立(比如年龄与收入、城市与邮政编码之间的关系),但这个简化假设使得生成过程更容易上手。
独立列值生成是一种创建合成表格数据的方法,它在不考虑其他列的情况下,逐一生成每一列的值。例如,假设您的表有几列,如 Age、Department 和 Salary。
Age 列生成合成值。Department 列生成合成值。Salary 列生成合成值。为特定列生成值的方式通常取决于其数据类型(数值型、类别型等),并且通常涉及模仿原始数据中观察到的特征(如果可用)。
对于包含数字的列(如 Age、Height、Price),您通常可以使用上一章中介绍的统计分布。
Age 值应在 18 到 65 之间均匀分布。假设我们想生成 100 个合成的 Age 值,根据观察,真实年龄大致呈正态分布,均值为 40,标准差为 12。我们可以使用一个函数(例如 Python 中的 numpy.random.normal)从 N(40,122) 中抽取 100 个点。
import numpy as np
# 基于观察数据的参数(示例)
mean_age = 40
std_dev_age = 12
number_of_rows = 100
# 独立生成合成年龄
synthetic_ages = np.random.normal(loc=mean_age, scale=std_dev_age, size=number_of_rows)
# 确保年龄符合实际(例如,非负,可能是整数)
synthetic_ages = np.clip(synthetic_ages, 0, None) # 确保非负
synthetic_ages = synthetic_ages.astype(int) # 转换为整数年龄
# print(synthetic_ages[:10]) # 显示前 10 个生成的年龄
我们可以使用直方图将生成的年龄分布与原始分布(如果可用)进行视觉比较。
真实数据小样本与基于统计属性独立列生成合成数据的年龄分布比较。合成数据旨在模仿整体形状。
对于包含文本或类别的列(如 Department、Product Type、City),一种常见做法是复制原始数据中观察到的频率分布。
例如,如果真实数据中的 Department 列有:
您将生成合成 Department 值,使其大致有 50% 是“销售”,30% 是“工程”,20% 是“市场”。
import numpy as np
# 观察到的频率(示例)
departments = ['Sales', 'Engineering', 'Marketing']
probabilities = [0.5, 0.3, 0.2]
number_of_rows = 100
# 独立生成合成部门
synthetic_departments = np.random.choice(departments, size=number_of_rows, p=probabilities)
# print(synthetic_departments[:10]) # 显示前 10 个生成的部门
柱状图有助于比较频率。
真实数据比例与独立生成的样本之间的部门频率比较。合成频率近似于目标概率。
“主要缺点是独立性假设。数据很少有完全独立的列。”
由于它忽略了这些关系,纯粹独立生成的数据通常缺乏实用性,对于依赖特征间关联的机器学习任务。仅根据此类数据训练的模型可能无法学到现实中存在的重要模式。
独立列值生成是创建合成表格数据的一种主要方法。它涉及分别为每列生成数据,通常通过模仿原始数据中观察到的边际分布(如数字的均值/标准差,或类别的频率)。尽管简单快速,其核心局限在于未能捕捉列之间的关系,这可能降低生成数据集的真实性和有用性。这引导我们考虑那些试图保留一些列间关联的方法,我们将在接下来介绍。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造