在本文中,我将介绍一些使用 Python 从头创建模拟数据、玩具数据集和“虚拟”值的方法和技术。一些解决方案使用 Python 库中的方法,而其他解决方案则是使用内置 Python 函数的技术。
下文中展示的所有方法在研究任务、学术论文、模型训练或测试中都对我有用。
使用 NumPy
处理线性代数和数值计算的最有名的 Python 库也有助于数据生成。
线性数据生成
在本例中,我将演示如何创建一个数据集,其中的噪声与目标值呈线性关系。这对于测试线性回归模型非常有用。
# importing modules
from matplotlib import pyplot as plt
import numpy as np
def create_data(N, w):
"""
Creates a dataset with noise having a linear relationship with the target values.
N: number of samples
w: target values
"""
# Feature matrix with random data
X = np.random.rand(N, 1) * 10
# target values with noise normally distributed
y = w[0] * X + w[1] + np.random.randn(N, 1)
return X, y
# Visualize the data
X, y = create_data(200, [2, 1])
plt.figure(figsize=(10, 6))
plt.title('Simulated Linear Data')
plt.xlabel('X')
plt.ylabel('y')
plt.scatter(X, y)
plt.show()
时间序列数据
在本例中,我将使用 NumPy 生成具有线性趋势和季节性成分的合成时间序列数据。该示例适用于金融建模和股市预测。
def create_time_series(N, w):
"""
Creates a time series data with a linear trend and a seasonal component.
N: number of samples
w: target values
"""
# time values
time = np.arange(0,N)
# linear trend
trend = time * w[0]
# seasonal component
seasonal = np.sin(time * w[1])
# noise
noise = np.random.randn(N)
# target values
y = trend + seasonal + noise
return time, y
# Visualize the data
time, y = create_time_series(100, [0.25, 0.2])
plt.figure(figsize=(10, 6))
plt.title('Simulated Time Series Data')
plt.xlabel('Time')
plt.ylabel('y')
plt.plot(time, y)
plt.show()
自定义数据
有时需要具有特定特征的数据。例如,你可能需要一个只有几个信息维度的高维数据集来完成降维任务。在这种情况下,下面的示例展示了生成此类数据集的适当方法。
# create simulated data for analysis
np.random.seed(42)
# Generate a low-dimensional signal
low_dim_data = np.random.randn(100, 3)
# Create a random projection matrix to project into higher dimensions
projection_matrix = np.random.randn(3, 6)
# Project the low-dimensional data to higher dimensions
high_dim_data = np.dot(low_dim_data, projection_matrix)
# Add some noise to the high-dimensional data
noise = np.random.normal(loc=0, scale=0.5, size=(100, 6))
data_with_noise = high_dim_data + noise
X = data_with_noise
上面的代码片段基于一个只有 3 维的低维数组,创建了一个包含 100 个观测值和 6 个特征的数据集。
使用 Scikit-learn
除机器学习模型外,Scikit-learn 还提供数据生成器,可用于构建大小和复杂度可控的人工数据集。
制作分类
make_classification 方法可用于创建随机的 n 类数据集。该方法允许创建具有选定数量的观测值、特征和类的数据集。
该方法可用于测试和调试分类模型,如支持向量机、决策树和 Naive Bayes。
X, y = make_classification(n_samples=1000, n_features=5, n_classes=2)
#Visualize the first rows of the synthetic dataset
import pandas as pd
df = pd.DataFrame(X, columns=['feature1', 'feature2', 'feature3', 'feature4', 'feature5'])
df['target'] = y
df.head()
制作回归
同样,make_regression 方法也适用于创建用于回归分析的数据集。它允许设置观测值的数量、特征的数量、偏差以及生成数据集的噪声。
from sklearn.datasets import make_regression
X,y, coef = make_regression(n_samples=100, # number of observations
n_features=1, # number of features
bias=10, # bias term
noise=50, # noise level
n_targets=1, # number of target values
random_state=0, # random seed
coef=True # return coefficients
)
创建 Blobs
使用 make_blobs 方法可以创建人工 "blobs "数据,用于聚类任务。该方法可以设置数据集的总点数、簇数和簇内标准偏差。
from sklearn.datasets import make_blobs
X,y = make_blobs(n_samples=300, # number of observations
n_features=2, # number of features
centers=3, # number of clusters
cluster_std=0.5, # standard deviation of the clusters
random_state=0)
使用 SciPy
SciPy(Scientific Python 的缩写)库与 NumPy 库一样,是处理数值计算、优化、统计分析和许多其他数学任务的最佳库之一。SciPy 的 stats 模型可以从正态分布、二项分布和指数分布等多种统计分布中创建模拟数据。
from scipy.stats import norm, binom, expon
# Normal Distribution
norm_data = norm.rvs(size=1000)
# Binomial distribution
binom_data = binom.rvs(n=50, p=0.8, size=1000)
# Exponential distribution
exp_data = expon.rvs(scale=.2, size=10000)
使用 Faker
非数字数据怎么办?通常,我们需要在姓名、地址和电子邮件等非数字或用户数据上训练模型。使用 Faker Python 库是创建与用户信息类似的真实数据的一种解决方案。
Faker 库可以生成令人信服的数据,用于测试应用程序和机器学习分类器。在下面的示例中,我展示了如何创建一个包含姓名、地址、电话号码和电子邮件信息的虚假数据集。
from faker import Faker
def create_fake_data(N):
"""
Creates a dataset with fake data.
N: number of samples
"""
fake = Faker()
names = [fake.name() for _ in range(N)]
addresses = [fake.address() for _ in range(N)]
emails = [fake.email() for _ in range(N)]
phone_numbers = [fake.phone_number() for _ in range(N)]
fake_df = pd.DataFrame({'Name': names, 'Address': addresses, 'Email': emails, 'Phone Number': phone_numbers})
return fake_df
fake_users = create_fake_data(100)
fake_users.head()
使用合成数据库(SDV)
如果你的数据集没有足够的观测数据,或者你需要更多与现有数据集类似的数据来补充机器学习模型的训练步骤,该怎么办?Synthetic Data Vault (SDV) 是一个 Python 库,它允许使用统计模型创建合成数据集。
在下面的示例中,我们将使用 SDV 来扩展一个演示数据集:
from sdv.datasets.demo import download_demo
# Load the 'adult' dataset
adult_data, metadata = download_demo(dataset_name='adult', modality='single_table')
adult_data.head()
from sdv.single_table import GaussianCopulaSynthesizer
# Use GaussianCopulaSynthesizer to train on the data
model = GaussianCopulaSynthesizer(metadata)
model.fit(adult_data)
# Generate Synthetic data
simulated_data = model.sample(100)
simulated_data.head()
观察数据如何与原始数据集非常相似,但这是合成数据。
结论
本文介绍了创建模拟和合成数据集的 5 种方法,可用于机器学习项目、统计建模和其他涉及数据的任务。所示示例简单易学,因此我建议大家探索代码、阅读可用文档,并开发更适合各种需求的其他数据生成方法。