合成数据生成——数据科学家必备技能

2019-05-08 16:46:14 浏览数 (1)

本文为 AI 研习社编译的技术博客,原标题 : Synthetic data generation — a must-have skill for new data scientists 作者 | Tirthajyoti Sarkar 翻译 | 约瑟翰 · 今麦郎、CONFIDANT、炸弹猫、泰丝•路易斯、Dylan的琴 校对 | 酱番梨 审核 | 约翰逊·李加薪 整理 | 立鱼王 原文链接: https://towardsdatascience.com/synthetic-data-generation-a-must-have-skill-for-new-data-scientists-915896c0c1ae

介绍

数据就像是新的石油,而事实上只有少数几个大玩家才有强大能力去这控制这种新的货币。谷歌和脸书非常慷慨地免费提供自家最新型的机器学习算法和软件包,因为现在进入算法世界的门槛已经是相当低了。自从被史蒂夫• 鲍尔默冠以恶名到成为微软公司不可或缺的部分,开源已经走过了一段漫长的路程。大量的开源项目正在推动数据科学、数字分析和机器学习的发展。

2018年,我们可以很有把握地说,算法、编程框架和机器学习包(甚至是机器学习入门课程)都不是稀缺资源,而是高质量的资源。

这常常给数据科学和机器学习的初学者带来一个复杂的问题。多年以前,当我踏上这条道路的时候,我自己面对过这样的问题。

我需要明确一点,在本文中我只讨论用于学习目的的数据的匮乏,而不是出于任何商业运作。这里不是在讨论如何才能找到一些能用在你的app上的高质量数据。消费者数据、社会数据或是行为数据的收集也有其自身的问题。即使只使用高质量数据用于开始学习数据科学/机器学习,这一过程也开始变得简单。

自我学习在数据科学中的重要性

数据科学目前火热流行,越来越多的人开始进入数据科学领域。这些人正在转行。他们花钱参与培训,加入线上课程,在领英上参与相关领域的社交。但是,一旦这些新人学习完成固定的课程并开始涉足未知的领域,他们就很难保持当初学习新行业技术的势头。

需要解决什么样的问题?哪些线上课程需要关注?参加哪些Kaggle比赛?学习哪些机器学习包?有哪些Github开源项目?要学习多少数学知识?

总的来说,要如何建立一种绝佳的数据科学技能组合呢?——正如一篇极受欢迎的文章所提到,那就是参与公开性的项目。例如,通过数据建模,数据可视化,和别人讨论,或利用机器学习算法为开源项目做贡献,从而展现出自己的创新思维和贡献。

如何建立自己的数据科学技能组合?如何在数据科学领域找一份工作?你就需要了解足够多的统计学,机器学习,编程等相关知识,甚至能从towardsdatascience.com上获取更多知识。

但不幸的是,这条路上往往没有仁慈的领路人或者是导师,总是一个人自我推动前行。

据说能成功驾驭这个灰色地带的人已经在这个需要自学的数据科学领域找到了自己的技巧方法。这样的人会在该领域走得很远。但他如果希望这趟学习之旅更有成效,他还必须能够获得高质量的数据集以进行实践及学习。

需要哪些类型的数据使学习体验更丰富?

想象一下,你正在研究学习一种很酷的机器学习方法,它可能是支持向量机或者是深度神经网络。你应该将什么样的数据应用在这些算法上呢?

如果你是从零开始,那么我建议在最开始的时候使用简单且规模较小的数据集,这些数据集能绘制表示在二维空间上,以便你形象地去了解模型,同时能以直观的方式了解机器学习算法的工作原理。举个例子,这里有一篇关于各种数据集的好文章,你可以尝试里面不同层次级别的数据集。

24 Ultimate Data Science Projects To Boost Your Knowledge and Skills (& can be accessed freely)

这是个很好的开始,但这仅仅只是一个开始。

当然,你可以更上一层楼,找到一个大型真实的数据集来训练算法。

但这仍然是一个规模固定的数据集,它拥有固定的样本数量以及固定的正负样本比例(我们假设这是一个分类问题)

你是否能仅从一个固定的数据集中了解算法中所有的难点?

  • 样本复杂度
  • 运行效率
  • 不平衡类处理
  • 不同程度的分类下,指标的鲁棒性
  • 偏差和方差作为衡量数据复杂度的函数

我看未必。仅仅将一个数据集用于某个给定的算法上进行训练给你带来的映像并不能让你对以上几个难点全都有深刻的认识。但是,这些重要的理解能让有助于你在机器学习领域成为真正的专家。

因此,你需要一个内容非常丰富且足够大的数据集,这对于一些实验已经足够了。

你能做什么?

那么,在这种情况下你能做些什么呢?是在互联网上索索寻找更多的数据集,并且期待其中的一些数据通过结合特定的算法来解决相关的问题和挑战,同时自我得到学习?

当然,这是一种可行的方法,但是考虑在时间与精力的耗费,这可能不是最可行的方法。优秀的数据集可能不干净或者不容易获取。你可能需要花费比理解算法更多的时间去寻找,提取和使用合适的数据集。

搜索,提取,建设性地分析,努力地推敲数据集使其能够用机器学习方法建模,这个过程所获得的经验是非常宝贵的。我目前正在编写关于该主题的课程/书籍。

提取数据这项技能是可以单独地学习及实践的。然而在大多数情况下,你可能只想要一个灵活的数据集(或者其中的几个)来“教”你理解机器学习算法的所有细节。

令人惊讶的是,在大多数情况下,这种“数据教学”可以利用合成数据集来完成。

什么是合成数据集?

顾名思义,合成数据集是一个以编程方式生成的数据存储库。因此,它不是通过任何真实的调查或实验收集的。因此,它的主要目的是足够灵活和丰富,以帮助ML实践者使用各种分类、回归和集群算法进行引人入胜的实验。期望的属性有:

  • 它可以是数值的,二进制的,或分类的(序数的或非序数的)
  • 数据集的特征数量和长度应该是任意的
  • 它最好是随机的,用户应该能够选择各种各样的统计分布来根据这些数据,也就是说,底层的随机过程可以被精确地控制和调整,
  • 如果将其用于分类算法,那么类分离的程度应该是可控的,使学习问题容易还是困难,
  • 随机噪声可以以可控的方式插入
  • 对于回归问题,可以使用复杂的非线性生成过程来获取数据

尽管在本文中,我们的讨论仅限于用于更好的ML算法的合成数据,但是如果它能够帮助解决无法使用或获取用于学习目的的真实数据集的安全性和隐私问题,那么它的用途将非常广泛。例如,考虑医疗或军事数据。这里有一篇关于这些方法的优秀总结文章。

在接下来的几节中,我们将展示一些快速生成用于统计建模和机器学习的合成数据集的方法。

演示笔记本可以在我的Github存储库中找到。

利用scikit-learn的数据生成

scikit-learn是用于传统机器学习任务极为出色的python库(如果你不太在意深度学习)。尽管它的机器学习算法已被普遍使用,合成数据生成的功能也不容小觑。

下面是一个快速总览:

回归问题生成:scikit-learn中dataset.make_regression函数可以利用给定的输入特征,输出靶向,和两者搭配时的调控程度生成随机回归问题。它也可以混入高斯噪音。

图例:使用scikit-learn中不同噪音程度的随机回归问题生成

分类问题生成:类似于上述回归函数,dataset.make_classification会生成一个随机的多元分类问题(的数据),可以调控类别的分离度和噪音。如果你想让分类问题更难一些,你也可以任意的调整类别比例。

图例:使用scikit-learn中不同 的随机分类问题生成

聚类数据生成:库中有很多生成有趣聚类数据的函数,最直接的一个是datasets.make_blobs。配合可控的距离参数,此函数将生成指定数量的聚类。

图例:使用scikit-learn中的简易聚类数据生成

各向异性聚类生成:利用简单的矩阵相乘变换,你可以生成沿特定轴线或各向异性分布似的聚类。

图例:使用scikit-learn中的各向异性聚类生成

同心环状聚类生成:在测试基于聚类算法或高斯混合模型的亲和性时,生成特定形状的聚类数据会大有用处。这时,我们可用datasets.make_circle函数来实现。

当然,我们也可以掺杂一些噪音让数据可以测试聚类算法的鲁棒性。

月状聚类数据生成:我们也可以用datasets.make_moons配合可控噪音,来生成月状聚类数据用以测试算法。

使用任意符号表达式生成数据

虽然上述功能很好,但用户无法轻松控制数据生成的基础机制,回归输出也不是输入的确定函数 - 它们是真正随机的。 虽然这对于许多问题可能已经足够,但是人们可能经常需要一种可控制的方法来基于明确定义的函数(涉及线性,非线性,理性等一众术语)来产生这些问题。

例如,我们想要评估各种核化SVM分类器对具有越来越复杂的分离器(线性到非线性)的数据集的功效,或者想要证明由有理或超越函数生成的回归数据集的线性模型的限制。 使用scikit-learn的这些功能很难做到这一点。

此外,用户可能想要仅输入符号表达式作为生成函数(或用于分类任务的逻辑分隔符)。 没有简单的方法只使用scikit-learn的实用程序,并且必须为每个新的实验实例编写他/她自己的函数。

为了解决符号表达式输入问题,人们可以轻松利用 amazing Python package SymPy ,它允许对符号数学表达式进行理解,渲染和评估,达到相当高的复杂程度。

在我之前的文章中,我详细介绍了如何构建SymPy库并创建类似于scikit-learn中可用的函数,但可以生成具有高度复杂性的符号表达式的回归和分类数据集。 查看这篇文章和我的Github存储库中的实际代码:https://github.com/tirthajyoti/PythonMachineLearning/tree/master/Random Function Generator

例如,我们可以将符号表达式作为平方项(x²)和sin(x)之类的正弦项的乘积,并创建一个随机化的回归数据集。

图:带符号表达式的随机回归数据集:x².sin(x)

或者,可以生成用于测试神经网络算法的基于非线性椭圆分类边界的数据集。 请注意,在下图中,用户如何输入符号表达式m ='x1 ** 2-x2 ** 2'并生成此数据集。

使用“pydbgen”库生成分类数据

虽然网上有许多高质量的真实数据集可用于尝试很酷的机器学习技术,但根据我的个人经验,我发现在学习SQL时并非如此。

对于数据科学专业知识,对SQL的基本熟悉程度几乎与知道如何用Python或R编写代码一样重要。但是使用真实的分类数据(例如姓名,年龄,信用卡,SSN,地址,生日等)并不像在Kaggle上访问小玩意类型的数据集那样常见,尤其是为机器学习任务设计或策划的(数据)。

除了数据科学的初学者之外,即使是经验丰富的软件测试人员也有可能发现使用一个简单的工具很有用,只需几行代码就可以生成具有随机(假)但有意义的条目的任意大数据集。

进入 pydbgen,阅读文档。

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

介绍pydbgen:一个随机数据帧/数据库表生成器

一个轻量级的Python包,用于生成随机数据库/数据帧,用于数据科学,学习SQL,机器学习...

你可以通过点击原文阅读上面的文章了解更多详情。在这里,我将展示几个带截图的简单数据生成示例,

图:使用pydbgen库生成随机名称

生成一些国际电话号码:

图:使用pydbgen库生成随机电话号码

图:使用pydbgen库生成包含随机条目的完整数据框

总结和结论

我们讨论了获取高质量数据集的关键性,以便进入数据科学和机器学习的激动人心的世界。通常大量缺乏灵活的数据集限制了人们深入研究机器学习或统计建模技术的内部工作的能力,并使理解变得肤浅。

合成数据集在这方面可以提供极大的帮助,并且有一些现成的功能可用于尝试这种方法。然而,有时希望能够基于复杂的非线性符号输入生成合成数据,并且我们讨论了一种这样的方法。

本文的目的是表明年轻数据科学家不必因无法使用合适的数据集而陷入困境。相反,他们应该搜索并设计自己的程序化解决方案,以便为他们的学习目的创建合成数据。

在此过程中,他们可以学习许多新技能并为机会打开新的大门。

0 人点赞