Image title

用于机器学习的合成数据集生成

使用 Scikit-Learn 和更多功能生成合成数据集

越来越明显的是,谷歌、Facebook和微软等大型科技巨头对最新的机器学习算法和软件包非常慷慨(它们免费赠送这些算法和软件包),因为进入世界的障碍是算法是非常低的。

开源社区和工具(如 scikit-earn)已经走过了漫长的道路,大量的开源计划正在推动数据科学、数字分析和机器学习。站在 2019 年,我们可以有把握地说,算法、编程框架和机器学习包(甚至教程和课程如何学习这些技术)不是稀缺资源,而是高质量的数据。

当涉及到调整和微调这些算法时,这经常成为数据科学(DS) 和机器学习 (ML) 实践者的棘手问题。从一开始,指出当前文章涉及算法调查、教学学习和模型原型设计数据稀缺的问题也是明智的。它不是用于扩展和运行商业操作。

它不是讨论如何获得您正在处理的酷旅行或时尚应用的高质量数据。这种消费者、社会或行为数据收集本身就带来了问题。然而,即使是像访问质量数据集来测试特定算法方法的局限性和变幻莫测等简单方法,也往往不是那么简单。

您可能还喜欢:
Scikit-学习:随机森林

为什么需要合成数据集?

如果您从头开始学习,最合理的建议是从简单、小规模的数据集开始,这些数据集可以绘制两个维度,以直观地理解模式,并直观地查看 ML 算法的工作方式。

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

此时,实验灵活性和数据集性质之间的权衡将发挥作用。您始终可以找到一个实际的大型数据集来练习算法。但是,这仍然是一个固定的数据集,具有固定数量的样本、固定的基础模式以及正样本和负样本之间的固定类分离程度。您还必须调查:

  • 所选测试和训练数据的分数如何影响算法的性能和鲁棒性
  • 面对不同程度的阶级失衡,指标的稳健性
  • 必须做出什么样的偏差权衡
  • 算法在训练以及测试数据(即标签和功能集中的噪声)中在各种噪声签名下的表现
  • 您如何尝试和梳理 ML 算法的弱点?

事实证明,这些对于单个实际数据集相当困难;因此,您必须愿意使用随机的合成数据,这些数据可以捕获真实数据集的所有变幻莫测,但足以控制这些数据,以帮助您科学地调查正在构建的特定 ML 管道的优缺点

ML 合成数据集的基本特征

据了解,此时合成数据集以编程方式生成,而不是来自任何类型的社会或科学实验、业务事务数据、传感器读取或图像手动标记。但是,此类数据集绝对不是完全随机的,ML 合成数据的生成和使用必须遵循一些总体需求。特别是,

  • 它可以是数字、二进制或分类(或非序列号),并且要素的数量和数据集的长度可以是任意的
  • 它必须有一定程度的随机性,但与此同时,用户应该能够选择各种各样的统计分布,以基于这些数据,即底层随机过程可以精确控制和调整
  • 如果用于分类算法,则类分离的程度应可控,使学习问题变得容易或难以解决。
  • 随机噪声可以以可控的方式插入
  • 生成速度应该相当高,以便对任何特定的 ML 算法进行大量此类数据集的实验,即如果合成数据基于真实数据集上的数据扩充,则扩增算法必须计算效率高
  • 对于回归问题,可以使用复杂的非线性生成过程来获取数据 – 真正的物理模型可能有助于这一努力

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

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

Scikit-Learn 是基于 Python 的数据科学软件堆栈中最流行的 ML 库。除了经过精心优化的 ML 例程和管道构建方法外,它还拥有用于合成数据生成的基本效用集合。

与 Scikit 学习的回归

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

three regression graphs, displayed horizontally, with greater regression to the right.

使用 Scikit-Learn 进行分类

与上述回归函数类似, dataset.make_classification 生成可控制类分离和添加噪声的随机多类分类问题。如果需要,还可以随机翻转输出符号的任何百分比,以创建更硬的分类数据集。

Three classification graphs, displayed horizontally in a line.

使用 Scikit-Learn 进行群集

学工具函数可以产生各种聚类问题。最直接的是使用 datasets.make_blobs ,它生成任意数量的具有可控距离参数的聚类。

three clustering graphs, displaying horizontally, and generated by Scikit-learn utility functions

对于测试基于亲和力的聚类算法或高斯混合模型,以特殊形状生成聚类非常有用。我们可以使用 datasets.make_circles 函数来完成cheeli.com.cn/wp-content/uploads/2019/08/ring-1.png”宽度=”513″/*circular graph to test affinity algorithms

对于使用支持向量机 (SVM)算法测试非线性内核方法,通常建议使用某些形状数据来试验最近的邻域方法(如k-NN),甚至测试简单的神经网络。我们可以使用 dataset.make_moon 具有可控噪声的功能生成此类数据。

graph to test non-linear kernel methods

高斯混合模型与Scikit-Learn

高斯混合模型 (GMM) 是文本处理/NLP 任务中用于无监督学习和主题建模的迷人对象。下面是一个简单的函数的图示,用于显示为此类模型生成合成数据是多么容易:

  1. 将 numpy 导入为 np
  2. 导入 matplotlib.pyplot 作为 plt
  3. 导入随机
  4. def gen_GMM(N=1000,n_comp_3,mu_–1,0,1_,西格玛=1,1,1],mult=1,1,1]):
  5. “””
  6. 从给定的高斯分量列表中生成高斯混合模型数据
  7. N:总样本数(数据点)
  8. n_comp:高斯分量数
  9. mu:高斯分量的平均值列表
  10. 西格玛:高斯分量的西格玛(st.dev)值列表
  11. 多量:(可选)高斯元件乘数列表
  12. ) “””
  13. 断言 n_comp = len(mu),”平均值列表的长度与高斯分量的数量不匹配”
  14. 断言 n_comp = len(西格玛),”西格玛值列表的长度与高斯分量的数量不匹配”
  15. 断言 n_comp = len(mult),”乘数值列表的长度与高斯分量的数量不匹配”
  16. 兰特[样品] |
  17. i 在范围 (N):
  18. 枢轴 = 随机均匀(0,n_comp)
  19. j = int(透视)
  20. 兰特_样本.追加(mult_j_随机.高斯(mu_j_,西格玛[j]))
  21. 返回 np.array(兰特_样本)

超越科学学:来自符号输入的合成数据

虽然上述函数可能足以解决许多问题,但生成的数据确实是随机的,并且用户对生成过程的实际机制的控制较少。在许多情况下,可能需要一种可控的方法,基于定义良好的分析函数(涉及线性、非线性、理性甚至超验术语)生成回归或分类问题。

以下文章演示如何将符号数学包 SymPy 和来自 SciPy 的函数组合起来,以便从给定的符号表达式生成综合回归和分类问题。

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

Regression dataset generated from a given symbolic expression.

从给定符号表达式生成的回归数据集
“类=”fr-fin fr-dib”高度=”236″src=”http://www.cheeli.com.cn/wp-内容/上传/2019/08/sym类.png”宽度=”591″/*

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

使用 Scikit 图像进行图像数据增强

深度学习系统和算法是数据的贪婪消费者。然而,为了测试深度学习算法的局限性和鲁棒性,人们经常需要向算法提供相似图像的细微变化。Scikit 图像是一个惊人的图像处理库,它基于与 scikit 学习相同的设计原理和 API 模式,提供数百个很酷的功能来完成此图像数据扩增任务。

我们展示了此扩增过程的一些选定示例,从单个图像开始,在同一图像上创建数十个变体,以有效地将数据集倍增为多个数据集,并创建一个超大大小的合成数据集,以在一个稳健的方式。

色调、饱和度、价值通道

four images, one showing an RGB image, and the others comparing changes applied to the image of hue, saturation, and value, respectively.

种植

Series of 6 images showing variations in cropping.

随机噪声

Series of 6 images showing 5 variations of image noise generation.

旋转

A series of 6 images showing differences in image rotation

旋流

series of four images, with variations in image swirling effects

带分割的随机图像合成器

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

除了导出器之外,该插件还包括各种组件,用于生成用于数据扩充和对象检测算法训练的随机图像。随机化实用程序包括照明、对象、摄像机位置、姿势、纹理和干扰物。这些组件共同使深度学习工程师能够轻松创建随机场景,以训练 CNN。这里是Github链接。

使用 pydbgen 的分类数据生成

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

下面是一些说明性示例:

illustrative example of random name generation

合成时间序列数据集

有许多文件和代码存储库,用于使用在现实生活中多变量时间序列中观察到的特殊函数和模式生成合成时间序列数据。在此GitHub 链接中给出了一个简单的示例。

Synthetic time series, shown over 9 images.

合成音频信号数据集

音频/语音处理是深度学习实践者和 ML 爱好者特别感兴趣的领域。Google 的 NSynth 数据集是一个综合生成的(使用神经自动编码器和人与启发式标签的组合)由各种乐器制作的简短音频文件声音库。下面是数据集的详细说明。

强化学习的综合环境

开放体育馆

强化ML的合成学习环境最大的存储库是OpenAI健身房。它由大量预编程环境组成,用户可以在其中实现自己的强化学习算法,以对性能进行基准测试或排除隐藏的弱点。

Series of 6 Images of OpenAI Gym

随机网格世界

对于强化学习的初学者来说,它通常有助于练习和试验一个简单的网格世界,其中代理必须穿过迷宫才能到达终端状态,并且每个步骤和终端状态都有给定的奖励/惩罚。

只需几行简单的代码,就可以合成任意大小和复杂性的网格世界环境(用户指定的终端状态和奖励向量分布)。

请查看此GitHub存储库,了解想法和代码示例。

用于合成数据生成的 Scikit-Learn 和更多:摘要和结论

在本文中,我们介绍了一些用于机器学习的合成数据生成示例。读者应该清楚,这些绝不代表数据生成技术的详尽列表。事实上,许多商业应用程序,而不是科幻学习提供相同的服务,因为培训您的ML模型与各种数据的需求正在快速增长。

但是,如果您以数据科学家或 ML 工程师的身份创建自己的合成数据生成编程方法,则可节省组织资金和资源,以投资于第三方应用,并允许您从整体和有机时尚。

我希望你喜欢这篇文章,并可以开始使用一些技术,这里描述的在你自己的项目很快。

进一步阅读

在 Python 中使用 Scikit-Learn 进行机器学习应用程序开发

Scikit-学习与

Comments are closed.