趋近智
使用Python(一种常用的机器学习任务语言)生成简单合成数据。我们将使用NumPy库,它在Python中是进行数值运算的主要库。如果您之前没有使用过它,请不用担心。内容将保持简单明了。
在我们开始生成数据之前,您需要一个安装了NumPy库的Python环境。如果您已经安装了Python(可能通过Anaconda发行版或直接安装),您通常可以使用pip(Python的包安装工具)来安装NumPy。打开您的终端或命令提示符,然后输入:
pip install numpy
为了更好地组织和显示我们的数据,尤其是在组合不同类型数据时,Pandas库非常有用。我们也来安装它:
pip install pandas
现在,让我们在Python脚本或交互式会话(例如Jupyter notebook)中导入这些库:
import numpy as np
import pandas as pd
# 设置随机种子以保证结果可重现(可选,但推荐做法)
# 这使得随机数在演示时变得可预测。
np.random.seed(42)
设置seed可确保每次运行代码时,都会获得完全相同的“随机”数序列。这对于调试和分享示例很有用。
我们了解到,从统计分布中采样是生成数值数据的一种常见方式。让我们尝试生成两种类型:均匀分布数据和正态分布数据。
假设我们想模拟产品价格,这些价格在20美元到100美元之间任何值出现的可能性都相同。我们可以使用NumPy的random.uniform函数。
# 生成10个介于20到100之间的合成产品价格
num_samples = 10
min_price = 20.0
max_price = 100.0
uniform_prices = np.random.uniform(low=min_price, high=max_price, size=num_samples)
# 为了更真实,我们将它们四舍五入到小数点后两位
uniform_prices = np.round(uniform_prices, 2)
print("生成的均匀分布价格:")
print(uniform_prices)
这将输出一个包含10个价格的数组,例如 [ 34.9 , 89.01, 80.49, 65.34, 26.38, 43.61, 80.13, 73.8 , 84.47, 73.6 ]。每个数字在20美元到100美元范围内出现的几率都相等。
现在,让我们模拟一些围绕平均值聚类的数据,例如客户年龄。假设平均年龄()是35岁,标准差()是8岁。这表示大多数年龄将接近35岁,但也有一些会更年轻或更年长。我们使用random.normal。
# 生成10个合成客户年龄(均值=35,标准差=8)
num_samples = 10
mean_age = 35.0
std_dev_age = 8.0
normal_ages = np.random.normal(loc=mean_age, scale=std_dev_age, size=num_samples)
# 年龄通常是整数,所以我们进行四舍五入并确保它们是非负数
normal_ages = np.round(normal_ages).astype(int)
normal_ages = np.maximum(normal_ages, 0) # 确保没有负数年龄
print("\n生成的正态分布年龄:")
print(normal_ages)
这可能会输出像 [39 32 41 49 32 31 44 37 34 32] 这样的年龄。请留意,大多数值都相对接近35。
让我们使用直方图来直观显示这些年龄的更大样本的分布情况。
# 生成1000个年龄以更好地查看分布
lots_of_ages = np.random.normal(loc=mean_age, scale=std_dev_age, size=1000)
lots_of_ages = np.round(lots_of_ages).astype(int)
lots_of_ages = np.maximum(lots_of_ages, 0)
# 我们将为Plotly图表准备数据
hist_ages, bin_edges = np.histogram(lots_of_ages, bins=15)
bin_centers = 0.5 * (bin_edges[1:] + bin_edges[:-1])
直方图显示了使用正态分布(均值=35,标准差=8)生成的合成年龄的频率。留意其钟形,这是正态分布的特点,中心在35左右。
现在我们来生成一些分类数据。
假设我们想分配产品类别:'电子产品'、'服装'或'家居用品'。也许'电子产品'最常见(50%几率),'服装'较少见(30%),而'家居用品'最少见(20%)。我们可以使用random.choice。
# 定义类别及其概率
categories = ['Electronics', 'Clothing', 'Home Goods']
probabilities = [0.5, 0.3, 0.2] # 必须和为1.0
# 根据概率生成10个合成类别
num_samples = 10
random_categories = np.random.choice(categories, size=num_samples, p=probabilities)
print("\n生成的随机类别:")
print(random_categories)
这可能会输出:['Clothing' 'Home Goods' 'Electronics' 'Electronics' 'Electronics' 'Clothing' 'Electronics' 'Electronics' 'Electronics' 'Clothing']。您会预计“电子产品”大约出现5次,“服装”出现3次,“家居用品”出现2次,不过由于只有10个样本,会有随机差异。
有时,一个数据项会依赖于另一个。让我们基于之前生成的uniform_prices创建一个“高价值”标志(真/假)。假设任何价格超过75美元的产品都被认为是高价值。
# 根据生成的价格应用规则
high_value_flags = uniform_prices > 75.0
print("\n生成的高价值标志(基于价格 > 75美元):")
print(high_value_flags)
这将输出一个与uniform_prices中每个价格对应的True或False值数组,例如 [False True True False False False True False True False]。
通常,我们希望将不同的生成特征组合成一个结构化数据集,就像一张表格。Pandas库在这方面表现出色。让我们将价格、年龄、类别和高价值标志组合到一个DataFrame中。
# 确保所有数组长度相同(本例中为10个样本)
assert len(uniform_prices) == num_samples
assert len(normal_ages) == num_samples
assert len(random_categories) == num_samples
assert len(high_value_flags) == num_samples
# 创建一个字典来存放我们的合成数据
synthetic_data = {
'Price': uniform_prices,
'CustomerAge': normal_ages,
'Category': random_categories,
'HighValue': high_value_flags
}
# 创建一个Pandas DataFrame
synthetic_df = pd.DataFrame(synthetic_data)
print("\n组合合成数据集(前5行):")
print(synthetic_df.head())
这将显示一个整洁的表格:
Price CustomerAge Category HighValue
0 34.90 39 Clothing False
1 89.01 32 Home Goods True
2 80.49 41 Electronics True
3 65.34 49 Electronics False
4 26.38 32 Electronics False
您现在已经创建了您的第一个基本合成数据集!您使用统计分布生成了数值数据,并使用带概率的随机选择和简单规则生成了分类数据。您还将这些数据组合成结构化格式。
这些技术为生成更复杂的合成数据提供了根基。随着您不断前进,您会遇到能够更好呈现变量间关联并生成更真实数据的方法,但定义生成过程、采样和应用规则的主要思想依然重要。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造