全文共3577字,预计学习时长7分钟python
谷歌、Facebook和微软这样的大型科技巨头正在绝不吝啬的将最新的机器学习算法和软件包免费提供给用户,其缘由在于现在算法领域的入门门槛至关低。git
开源社区和工具(如scikit-learn)已走过了漫长的道路,大量的开源项目推进了数据科学/数字分析和机器学习的发展。能够确定的是,身处2019年,稀缺的资源并非算法、编程框架和机器学习包(甚至也不是学习这些技术的教程),而是高质量的数据。github
对数据科学和机器学习领域的从业者而言,在对算法进行调整或微调时,数据稀缺每每是一个棘手的问题。本文谈论的数据稀缺是在算法研究、教学学习和创建模型方面,而不是扩展和商业运营方面。算法
本文不讨论如何获取用于开发旅行或时尚类应用程序的高质量数据。有专门的议题讨论如何收集这类消费者、社交或行为数据。然而,即便是像为检测特定算法的局限性和不肯定性获取高质量数据这样看似简单的事情,也经常并不是易事。数据库
为何须要合成数据集?编程
建议新手从简单的小规模数据集开始。能够在二维空间中绘图,直观地了解其规律,并查看ML算法的运行状况。bash
然而,随着数据维度爆炸,视觉判断必须扩展到更复杂的问题——学习和样本复杂性、计算效率、类不平衡等概念。微信
此时,须要将实验灵活性与数据集性质之间的平衡归入考量范围。总能找到一个真实的大型数据集来练习算法。但这仍然是一个样本数量固定,潜在规律固定,而且正负样本之间类别分离程度固定的数据集。还必须研究如下问题:网络
• 所选测试和训练数据比例如何影响算法的性能和健壮性app
• 面对不一样程度的类别不平衡,衡量指标有多么健壮
• 如何权衡误差和方差
• 各类噪声信号干扰下,算法在训练和测试数据中的表现(即标签及特征集中的噪声)
• 如何测试和找出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是加强机器学习合成学习环境的最大存储库,由大量预编程环境组成,用户能够在其上实现本身的强化学习算法,以进行性能基准测试或排除潜在漏洞。
随机网格世界
对于强化学习的初学者来讲,使用简单的网格世界练习和试验一般是有帮助的。在这个网格世界中,对象必须穿过迷宫到达最终状态,每一个步骤和最终状态具备给定的奖励/惩罚。
经过几行简单的代码,能够合成具备任意规模和复杂度的网格世界环境(具备用户指定的终端状态和奖励向量的分布)。
小结
本文讨论了一些用于机器学习的合成数据生成示例。读者应该清楚,这只是部分数据生成技术的示例。事实上,随着使用大量数据训练机器学习模型的需求快速增加,除scikit-learn以外,许多商业应用程序也开始提供相同的服务。
做为数据科学家或ML工程师,建立本身的合成数据生成程序化方法,它能够节省组织资金和资源,投资第三方应用程序,还可让总体计划开发ML Pipeline。
留言 点赞 关注
咱们一块儿分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”
(添加小编微信:dxsxbb,加入读者圈,一块儿讨论最新鲜的人工智能科技哦~)