小言_互联网的博客

合成数据集为何重要?如何生成它?

539人阅读  评论(0)

全文共3577字,预计学习时长7分钟

谷歌、Facebook和微软这样的大型科技巨头正在毫不吝啬的将最新的机器学习算法和软件包免费提供给用户,其原因在于如今算法领域的入门门槛相当低。

开源社区和工具(如scikit-learn)已走过了漫长的道路,大量的开源项目推动了数据科学/数字分析和机器学习的发展。可以肯定的是,身处2019年,稀缺的资源并不是算法、编程框架和机器学习包(甚至也不是学习这些技术的教程),而是高质量的数据。

对数据科学和机器学习领域的从业者而言,在对算法进行调整或微调时,数据稀缺往往是一个棘手的问题。本文谈论的数据稀缺是在算法研究、教学学习和建立模型方面,而不是扩展和商业运营方面。

本文不讨论如何获取用于开发旅行或时尚类应用程序的高质量数据。有专门的议题讨论如何收集这类消费者、社交或行为数据。然而,即使是像为检测特定算法的局限性和不确定性获取高质量数据这样看似简单的事情,也常常并非易事。

为什么需要合成数据集?

建议新手从简单的小规模数据集开始。可以在二维空间中绘图,直观地了解其规律,并查看ML算法的运行情况。

然而,随着数据维度爆炸,视觉判断必须扩展到更复杂的问题——学习和样本复杂性、计算效率、类不平衡等概念。

此时,需要将实验灵活性与数据集性质之间的平衡纳入考量范围。总能找到一个真实的大型数据集来练习算法。但这仍然是一个样本数量固定,潜在规律固定,并且正负样本之间类别分离程度固定的数据集。还必须研究以下问题:

• 所选测试和训练数据比例如何影响算法的性能和健壮性

• 面对不同程度的类别不平衡,衡量指标有多么健壮

• 如何权衡偏差和方差

• 各种噪声信号干扰下,算法在训练和测试数据中的表现(即标签及特征集中的噪声)

• 如何测试和找出ML算法的缺陷?

事实证明,仅靠一个真实的数据集很难解决上述问题。因此,必须使用足够随机的合成数据来实现真实数据集的不确定性,同时这些数据必须足够可控,才能有助于科学地研究特定ML Pipeline的优缺点。

虽然本文不会讨论这一问题,但是在医学分类或财务建模这些敏感的应用领域,合成数据集的潜在优势显著。这些领域获取高质量标记数据集,往往因为耗资巨大令人却步。

ML合成数据集的基本特征

现在应理解合成数据集是通过程序生成的,而不是源自社科实验、商业交易数据、传感器读取或图像手动标记。然而,这些数据集绝对不是完全随机的,生成和使用用于ML的合成数据必须遵循一些总体需求。尤其是:

• 数据集可以是数字、二进制或分类的(顺序或非顺序的),数据集的维度和长度可以不固定

• 数据集必须具有一定的随机性,但与此同时,用户能够按照各种各样的统计分布来生成这些数据,即可以精确控制和调整数据背后的随机过程

• 用于分类算法的数据及需要能够控制类分离程度来调节学习问题的难易程度

• 能够以可控的方式在数据集中插入随机噪声

• 数据集能够足够迅速地生成,以便能够使用大量此类数据集针对任何特定ML算法进行实验,即,如果合成数据基于实际数据集上的数据增广,则增广算法必须具有计算效率

• 对于回归问题,可以使用复杂非线性生成过程来获取数据——真实的物理模型可能会对这一问题有所帮助

下一节将介绍如何使用一些最流行的ML库和编程技术生成合适的数据集。

使用Scikit Learn和Numpy生成标准回归、分类和聚类数据集

Scikit-learn是基于Python的数据科学软件栈中最受欢迎的ML库。除了性能优良的ML例程和管道构建方法外,还拥有一系列用于合成数据生成的实用方法。

用Scikit Learn创建回归问题

Scikit-learn的dataset.make_regression函数可以创建随机回归问题,该回归问题具有任意数量的输入比,输出目标以及两者之间程度可控的信息耦合。

 

使用Scikit-Learn进行分类

与上文回归函数类似,dataset.make_classification生成一个类分离程度可控并且加入了噪声数据的随机多类分类问题。如果需要,还可以随机改变任意比例的输出指征以创建更高难度的分类数据集。

使用Scikit-Learn进行聚类

scikit-learn实用程序函数可以生成各种聚类问题。最直接的方法是使用datasets.make_blobs,它生成具有可控距离参数的任意数量聚类。

为了测试基于相似性的聚类算法或高斯混合模型,生成特殊形状的聚类十分有用。使用datasets.make_circles函数就可以达成这一目的。

 

使用支持向量机(SVM)算法测试非线性核方法时,通常建议使用k-NN之类的最近邻方法或采用简单的神经网络来测试数据。可使用dataset.make_moon函数生成含有可控噪声的此类数据。

 

使用Scikit-Learn生成高斯混合模型

高斯混合模型(GMM)是研究文本处理/ NLP任务中无监督学习和主题建模的不二之选。从下列简单的函数图示能够看出采用这一模型生成合成数据是多么容易:

1.	import numpy as np
2.	import matplotlib.pyplot as plt
3.	import random
4.	def gen_GMM(N=1000,n_comp=3, mu=[-1,0,1],sigma=[1,1,1],mult=
[1,1,1]):
5.	"""
6.	Generates a Gaussian mixture model data, from a given list of
 Gaussian components
7.	N: Number of total samples (data points)
8.	n_comp: Number of Gaussian components
9.	mu: List of mean values of the Gaussian components
10.	sigma: List of sigma (std. dev) values of the Gaussian components
11.	mult: (Optional) list of multiplier for the Gaussian components
12.	) """
13.	assert n_comp == len(mu), "The length of the list of mean values
 does not match number of Gaussian components"
14.	assert n_comp == len(sigma), "The length of the list of sigma values
 does not match number of Gaussian components"
15.	assert n_comp == len(mult), "The length of the list of multiplie
r values does not match number of Gaussian components"
16.	rand_samples = []
17.	for i in range(N):
18.	pivot = random.uniform(0,n_comp)
19.	j = int(pivot)
20.	rand_samples.append(mult[j]*random.gauss(mu[j],sigma[j]))
21.	return np.array(rand_samples)

不止Scikit-Learn:来自符号输入的合成数据

虽然上述函数足以解决许多问题,但是所生成的数据是完全随机的,且用户难以控制生成过程的实际机制。多数情况下,用户可能需要一种可控制的方法,使用定义明确的分析函数(涉及线性,非线性,理性或甚至超越方法)生成回归或分类问题。

下文展示了如何将符号数学工具包SymPy和SciPy中的函数结合起来,依据给定的符号表达式生成综合回归和分类问题。

用符号表达式生成随机回归和分类问题

从给定符号表达式生成的回归数据集。

从给定符号表达式生成的分类数据集。

使用Scikit-Image增强图像数据

深度学习系统和算法需要大量数据。然而,为了测试深度学习算法的局限性和鲁棒性,通常需要为算法提供有细微差别的相似图像。Scikit-image是一个令人惊叹的图像处理库,基于与scikit-learn相同的设计原理和API模式,为图像数据增强提供数百种好用的函数。

本文选择性地展示了增强过程的一些示例,从单个图像开始并基于该图像创建数十个变体,以有效地成倍增加数据集并创建庞大的合成数据集以便稳健地训练深度学习模型。

色调,饱和度,通道值

裁剪

随机噪音

旋转

扭曲

具备分割的随机图像合成器

NVIDIA提供了一个名为NDDS的UE4插件,它使计算机视觉研究人员能够使用元数据导出高质量的合成图像。NDDS支持图像、分割、深度、对象姿势边框、关键点和自定义模板。

除了导出器之外,该插件还包含各种组件,能够生成用于数据增强和对象检测算法训练的随机图像。随机化实用程序包括照明,对象,相机位置,姿势,质地和干扰物。这些组件共同帮助深度学习工程师轻松创建随机场景,以训练CNN算法。

Github链接:https://github.com/NVIDIA/Dataset_Synthesizer

使用pydbgen生成分类数据

Pydbgen是一个轻量级的纯python库,用于随机生成有用的条目(例如姓名、地址、信用卡号、日期、时间、公司名称、职位和车牌号等),并将其保存在Pandas数据框对象中或作为SQLite表存放于数据库文件或MS Excel文件中。

以下是一些示例:

合成时间序列数据集

有相当多的论文和代码库使用现实中多变量时间序列所观察到的特殊函数和模式生成合成的时间序列数据。可访问GitHub连接查看示例:https://nbviewer.jupyter.org/github/tirthajyoti/Machine-Learning-with-Python/blob/master/Synthetic_data_generation/Synth_Time_series.ipynb

合成音频信号数据集

音频/语音处理是深度学习从业者和机器学习爱好者特别感兴趣的领域。Google的NSynth数据集就是由多种乐器制作的短音频文件生成(使用神经自动编码器及手动标记和启发式标签的组合)库。

数据集的详细说明:https://magenta.tensorflow.org/datasets/nsynth

强化学习的合成环境

OpenAI Gym

OpenAI Gym是增强机器学习合成学习环境的最大存储库,由大量预编程环境组成,用户可以在其上实现自己的强化学习算法,以进行性能基准测试或排除潜在漏洞。

随机网格世界

对于强化学习的初学者来说,使用简单的网格世界练习和试验通常是有帮助的。在这个网格世界中,对象必须穿过迷宫到达最终状态,每个步骤和最终状态具有给定的奖励/惩罚。

通过几行简单的代码,可以合成具有任意规模和复杂度的网格世界环境(具有用户指定的终端状态和奖励向量的分布)。

此GitHub库中含有概念和代码示例:https://github.com/tirthajyoti/RL_basics

小结

本文讨论了一些用于机器学习的合成数据生成示例。读者应该清楚,这只是部分数据生成技术的示例。事实上,随着使用大量数据训练机器学习模型的需求快速增长,除scikit-learn之外,许多商业应用程序也开始提供相同的服务。

作为数据科学家或ML工程师,创建自己的合成数据生成程序化方法,它可以节省组织资金和资源,投资第三方应用程序,还可以让整体计划开发ML Pipeline。

留言 点赞 关注

我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)


转载:https://blog.csdn.net/duxinshuxiaobian/article/details/102477989
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场