CDA数据分析师 出品
尽管成熟的算法和开源代码库可供机器学习从业人员广泛使用,但使用足够的数据去应用这些技术仍然是一个核心挑战。现在让我们了解如何利用scikit-learn和其他工具来生成适合优化和微调模型的综合数据。--- Kevin Vu
越来越明显的是,谷歌,Facebook和微软等大型科技巨头对最新的机器学习算法和软件包非常慷慨(它们免费提供这些),因为目前算法世界的入门门槛很低。开源社区和工具(例如scikit-learn)已经走了很长一段路, 大量的开源计划正在推动数据科学,数字分析和机器学习的发展。站在2018年,我们可以肯定地说, 算法,编程框架和机器学习套件(甚至是学习这些技术的教程和课程)不是稀缺资源,而是高质量数据。
在调整和微调这些算法时,这通常成为数据科学(DS)和机器学习(ML)从业者的棘手问题。明智的是,从一开始就应该指出当前的文章,与算法研究、教学法学习和模型原型的数据稀缺有关,而不是与扩展和运行商业运作有关。这不是关于如何获取时尚旅行或时尚应用程序的数据的讨论。这种消费者,社会或行为数据收集会给自己带来问题。但是,即使是访问质量数据集以测试特定算法方法的局限性和变化性之类的简单操作,也往往不是那么简单。
为什么需要综合数据集?
如果是从头开始学习,则最合理的建议是从简单的小规模数据集入手,你可以在二维空间中绘制这些数据集,以直观地了解模式并亲自查看ML算法的工作方式。
但是,随着数据量的爆炸式增长,视觉判断必须扩展到更复杂的问题上,例如 学习样本复杂性,计算效率,类不平衡 等概念。
在这一点上,实验灵活性和数据集性质之间的取舍开始发挥作用。 总会有办法找到一个庞大的真实数据集来实践算法。但这仍然是一个固定的数据集,具有固定数量的样本,固定的基础模式以及正样本与负样本之间的类别分离程度。还必须调查
- 测试和训练数据的选定部分如何影响算法的性能和抗干扰性。
- 面对不同程度的班级失衡,指标的稳定性。
- 必须进行什么样的偏差方差折衷。
- 在训练和测试数据(即标签以及功能集中的噪声)下,算法在各种噪声签名下的性能如何。
- 如何进行实验并找出ML算法的弱点?
事实证明,如果使用单个真实数据集很难做到这些,必须愿意使用足够随机合成的数据来捕获真实数据集的所有变化,但可控的数据足以帮助我们科学地调查正在构建的特定ML算法的优缺点。
尽管我们不会在本文中讨论此问题,但对于敏感的应用程序-医疗分类或财务模型,可以轻松地评估此类合成数据集的潜在利益,而获取高质量的,带有标签的数据集通常会很昂贵且令人望而却步。
ML综合数据集的基本功能
在这一点上可以理解,合成数据集是通过程序生成的,而不是来自任何种类的社会或科学实验,业务交易数据,传感器读取或图像的手动标记。但是,此类数据集绝对不是完全随机的,并且ML的合成数据的生成和使用必须以一些总体需求为指导。特别是:
- 它可以是数字的,二进制的或分类的(有序或非有序),特征的数量和数据集的长度可以是任意的。
- 它必须具有一定程度的随机性,但同时,用户应该能够选择各种统计分布来基于此数据,即可以精确控制和调整基础随机过程。
- 如果将其用于分类算法,则类别分离的程度应该是可控制的,以使学习问题变得容易或困难。
- 可以以可控的方式插入随机噪声。
- 生成速度应该很高,以便能够针对任何特定的ML算法使用大量此类数据集进行实验,即,如果合成数据基于现实生活数据集上的数据扩充,则扩充算法必须在计算上有效。
- 对于回归问题,可以使用复杂的非线性生成过程来获取数据-实际的物理模型可能会有助于这一工作。
在下一节中,我们将展示如何使用一些最受欢迎的ML库和编程技术来生成合适的数据集。
使用scikit-learn和Numpy生成标准回归,分类和聚类数据集
Scikit-learn是用于数据科学的基于Python的软件中最受欢迎的ML库。除了优化的ML例程和构建方法外,它还拥有用于合成数据生成的实用方法的可靠集合。
scikit-learn的回归
Scikit-learn的dataset.make_regression 函数可以创建具有任意数量的输入要素 ,输出目标以及 它们之间的信息耦合程度,可控制随机回归问题 。
使用Scikit学习进行分类
与上面的回归函数类似,dataset.make_classification生成一个随机的多类分类问题,具有可 控制的类分离和增加的噪声。如果需要,还可以随机翻转任意百分比的输出符号以创建更难的分类数据集。
使用Scikit学习进行聚类
scikit-learn实用程序功能可能会产生各种聚类问题。最直接的方法是使用 datasets.make_blobs,它会生成任意数量的具有可控制距离参数的聚类。
对于测试基于亲和力的聚类算法或高斯混合模型,以特殊形状生成聚类非常有用。我们可以使用 datasets.make_circles 函数来实现。
为了使用支持向量机(SVM) 算法测试非线性核方法,使用 k-NN等最近邻方法 ,甚至测试简单的神经网络,通常建议对某些形状的数据进行实验。我们可以使用dataset.make_moon 函数用可控制的噪声生成此类数据 。
具有Scikit-learn的高斯混合模型
高斯混合模型(GMM)是令人着迷的对象,可用于文本处理/ NLP任务中的无监督学习和主题建模。这是一个简单函数的说明,以显示为这种模型生成综合数据有多么容易:
import numpy as np
import matplotlib.pyplot as plt
import random
def gen_GMM(N=1000,n_comp=3, mu=[-1,0,1],sigma=[1,1,1],mult=[1,1,1]):
"""
Generates a Gaussian mixture model data, from a given list of Gaussian components
N: Number of total samples (data points)
n_comp: Number of Gaussian components
mu: List of mean values of the Gaussian components
sigma: List of sigma (std. dev) values of the Gaussian components
mult: (Optional) list of multiplier for the Gaussian components
) """
assert n_comp == len(mu), "The length of the list of mean values does not match number of Gaussian components"
assert n_comp == len(sigma), "The length of the list of sigma values does not match number of Gaussian components"
assert n_comp == len(mult), "The length of the list of multiplier values does not match number of Gaussian components"
rand_samples = []
for i in range(N):
pivot = random.uniform(0,n_comp)
j = int(pivot)
rand_samples.append(mult[j]*random.gauss(mu[j],sigma[j]))
return np.array(rand_samples)
超越scikit-learn:来自符号输入的合成数据
尽管上面的功能可能足以解决许多问题,但生成的数据确实是随机的,并且用户对实际机械的控制较少
生成过程的滑稽动作。在许多情况下,可能需要一种可控的方法来基于定义明确的分析函数(涉及线性,非线性等条件)来生成回归或分类问题。下一篇文章显示了如何 将符号数学包SymPy和SciPy中的函数结合起来, 以根据给定的符号表达式生成综合回归和分类问题。
带有符号表达的随机回归和分类问题生成
从给定的符号表达式生成的回归数据集。
从给定的符号表达式生成的分类数据集。
使用scikit-image进行图像数据增强
深度学习系统和算法是大量的数据消费者。但是,为了测试深度学习算法的局限性和抗干扰性,通常需要向算法提供相似图像的细微变化。 Scikit-image 是一个了不起的图像处理库,它基于与scikit-learn相同的设计原理和API模式构建,提供了数百种十分酷的功能来完成此图像数据扩充任务。
我们展示了这种增强过程的一些选定示例,从单个图像开始,在同一图像上创建数十个变体,以有效地乘以数据集,并创建巨大规模的合成数据集,从而以健壮的方式训练深度学习模型。
如色相,饱和度,价值渠道:
播种
随机噪音
旋转
漩涡
带分割的随机图像合成器
NVIDIA提供了一个称为NDDS的UE4插件,以使计算机视觉研究人员能够导出带有元数据的高质量合成图像。它支持图像,分割,深度,对象姿势,边界框,关键点和自定义模具。除导出程序外,该插件还包括各种组件,这些组件能够生成随机图像以进行数据增强和对象检测算法训练。随机化实用程序包括照明,对象,相机位置,姿势,纹理和干扰项。这些组件一起使深度学习工程师可以轻松创建随机场景以训练其CNN。
使用pydbgen生成分类数据
Pydbgen是一个轻量级的纯Python库,用于生成随机有用的数据(例如名称,地址,信用卡号,日期,时间,公司名称,职务,车牌号等)并将其保存在Pandas的dataframe对象中,或作为数据库文件或MS Excel文件中的SQLite表。
这是一些说明性的例子,
综合时间序列数据集
有相当多的论文和代码存储库用于使用在现实多元时间序列中观察到的特殊功能和模式来生成合成时间序列数据。以下Github链接给出了一个简单的示例:
综合时间序列
合成音频信号数据集
音频/语音处理是深度学习从业人员和ML爱好者特别感兴趣的领域。 Google的NSynth数据集 是由各种乐器合成的(简短的音频文件的)声音合成库(使用神经自动编码器以及人类和启发式标签的组合)。这是数据集的详细说明。
强化学习的综合环境
OpenAI体育馆
OpenAI Gym是用于强化ML的综合学习环境的最大存储库 。它由大量预编程环境组成,用户可以在其上实施强化学习算法,以对性能进行基准测试或对隐藏的弱点进行故障排除。
随机网格世界
对于强化学习的初学者而言,它通常有助于在简单的网格世界中进行练习和实验,在这种网格世界中,代理人必须穿越迷宫才能到达最终状态,并获得每个步骤和最终状态的奖励/惩罚。
只需几行简单的代码,就可以合成具有任意大小和复杂度的网格世界环境(具有用户指定的终端状态和奖励向量分布)。
看看这个Github仓库,可以了解想法和代码示例。
总结
在本文中,我们介绍了一些用于机器学习的合成数据生成示例。大家应该清楚,它们绝不是数据生成技术的详尽清单。实际上,除了scikit-learn之外,许多商业应用程序都提供相同的服务,因为使用各种数据训练ML模型的需求正在快速增长。但是,如果作为数据科学家或ML工程师,你创建了合成数据生成的编程方法,那么它既可以节省组织的金钱和资源来投资第三方应用程序,又可以把ML开发的既有整体性又时尚。
获取更多优质内容,可前往:疫情当下,宅家也能好好提升自己,为未来蓄能——蓄势待发!
来源:oschina
链接:https://my.oschina.net/u/4278828/blog/3209316