使用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美元范围内出现的几率都相等。正态分布现在,让我们模拟一些围绕平均值聚类的数据,例如客户年龄。假设平均年龄($ \mu $)是35岁,标准差($ \sigma $)是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]){"layout": {"title": "1000个合成年龄的分布", "xaxis": {"title": "年龄"}, "yaxis": {"title": "频率"}, "bargap": 0.1, "template": "plotly_white"}, "data": [{"type": "bar", "x": [2, 8, 14, 20, 26, 32, 38, 44, 50, 56, 62], "y": [1, 14, 78, 193, 276, 243, 137, 44, 10, 3, 1], "marker": {"color": "#339af0"}}]}直方图显示了使用正态分布(均值=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您现在已经创建了您的第一个基本合成数据集!您使用统计分布生成了数值数据,并使用带概率的随机选择和简单规则生成了分类数据。您还将这些数据组合成结构化格式。这些技术为生成更复杂的合成数据提供了根基。随着您不断前进,您会遇到能够更好呈现变量间关联并生成更真实数据的方法,但定义生成过程、采样和应用规则的主要思想依然重要。