全文共3488字,预计学习时长7分钟
数据就是新的石油。
现在进入算法世界的门槛相当低,开源已经从被Steve Ballmer这样的人奉为恶魔,发展到成为微软不可分割的一部分。许多开源项目正在推动数据科学、数字分析和机器学习的发展。
到2018年,算法、编程框架和机器学习包(甚至如何学习这些技术的教程和课程)不是稀缺资源,高质量的数据才是。
这对于数据科学和机器学习的初学者来说常常会产生复杂的问题。这篇文章只针对缺乏用于学习目的的数据这个问题,而不涉及用于运行商业操作的数据。
自驱动数据科学的关键
数据科学既热门又畅销。而且,人们正在转向数据科学——他们正在改变职业,为训练营和线上MOOC支付费用,在LinkedIn建立社交网络。但是,许多新入学者一旦通过了正规的课程,进入不确定的领域,就很难保持学习新“工艺”的势头。
要解决什么问题?关注哪个MOOC?参加什么Kaggle比赛?要学习什么新的机器学习包?要在Github上展示什么样的项目?要掌握多少数学技能?
如何建立一个好的数据科学选集?根据一篇非常流行的文章,答案是通过做公共工作,例如贡献开源,用数据建模、争论、可视化或机器学习算法展示创新思维和原创贡献。但不幸的是,人们往往没有热心的指导或导师,往往必须自我推进。
能够成功穿越这个灰色地带的人,据说已经在自驱动数据科学领域找到了他/她的法宝,走得很远。不过,为了使这次旅行富有成效,他/她必须访问高质量的数据集以进行实践和学习。
一个丰富的学习经历需要什么样的数据?
假设你正在修正像支持向量机或深层神经网络这样的机器学习算法。你应该在什么类型的数据集上实践它们?如果你从头开始学习,建议从简单的小规模数据集开始,你可以在二维中绘制这些数据集,以便直观地理解模式,并亲眼看到机器学习算法以直观的方式工作。
这是一个好的开始。但这还不是全部。
当然,你可以提升一个级别,并给自己找一个可以在上面实践算法的现实中的大型数据集。
但是,这仍然是一个固定的数据集,具有固定数量的样本、固定模式,以及正样本和负样本之间的固定级别的分离(如果我们假设它是一个分类问题)。
你是否从以下方面学习了算法的所有复杂性:
· 样本复杂度
· 计算效率
· 处理级别不平衡的能力
· 面对不同程度的类分离、度量的健壮性
· 作为数据复杂度的函数的偏倚-方差权衡
可能没有。没有一个数据集能够为给定的机器学习算法提供所有这些深刻的见解。但是,这些是你能够成为一个真正的机器学习专家实践者需要掌握的非常重要的见解。
所以,你将会需要一个非常丰富并足够大的数据集,这个数据集对于所有的这些实验来说都是足够的。
你能做什么?
在这种情形下你能够做什么?在互联网上搜索更多的数据集,希望其中一些能够带来与特定算法相关的限制和挑战,并帮助你学习?
是的,这是一种可能的方法,但是就时间和努力而言,可能不是最切实可行或最佳的方法。好的数据集可能不干净或不容易获得。与努力理解机器学习算法相比,你可能要花费更多的时间寻找、提取和争用合适的数据集。搜索真实生活数据集、提取数据集、运行探索性数据分析、甚至与其辩驳使其为基于机器学习的建模作适当准备等等这些经验是宝贵的。我正在写一本关于这个话题的课程/书。
但是那可以分开教学和练习。然而,在许多情况下,您可能只想访问灵活数据集(或者其中的几个数据集)就能感受到机器学习算法种种暴力细节。
令人惊讶的是,在很多情况下,这样的教学可以用合成数据集完成。
什么是合成数据集?
顾名思义,合成数据集是以编程方式生成的数据仓库。所以它并不是由真实生活中的调查或实验收集起来的。因此,它的主要目的是足够灵活和丰富,以帮助机器学习实践者进行各种分类、回归和聚类算法的实验。它期望的属性是:
· 它可以是数字、二进制或分类(序数或非序数)。
· 数据集的特征数量和长度应该是任意的。
· 它最好是随机的,并且用户应该能够选择各种各样的统计分布来依附这些数据,例如精确地控制和调整基础随机过程。
· 如果用于分类算法,那么类分离的程度应该可以调节学习问题的容易或困难程度。
· 随机噪声可以以可控的方式插入。
· 对于回归问题,可以使用复杂的、非线性的生成过程来获取数据。
尽管在本文中,为了实现更好的ML算法,我们将讨论局限于合成数据。但是它在帮助处理真实数据集的安全性和隐私问题时(这些问题不能基于学习目的被使用或获取)可能具有深远的意义。
用scikit-learning方法生成数据
Scikit-learning是一个很棒的Python库,用于经典的机器学习任务(例如,如果你不特别关心深度学习)。然而,虽然它的机器学习算法被广泛使用,但是它提供的优秀的合成数据生成功能却鲜为人知。
这里有一个简短的摘要:
回归问题生成:Scikit-learning的数据集。make_regression函数可以创建任意数量的具有输入特征、输出目标和它们之间可控的信息耦合程度的随机回归问题。它还可以混合高斯噪声。
分类问题生成:与上面的回归函数相似,dataset.make_classification生成一个随机多类分类问题(数据集),它具有可控的分类以及附加噪声。如果需要,还可以随机翻转任何百分比的输出符号以创建更难的分类数据集。
聚类问题生成:有很多函数可用于生成有趣的集群。最直接的方法是使用dataset.make_blobs,它可以生成任意数量的具有可控距离参数的集群。
各向异性团簇生成:通过使用矩阵乘法的简单转换,可以生成沿着特定轴对齐或各向异性分布的集群。
同心环簇数据生成:对于测试基于密切关系的聚类算法或高斯混合模型,将聚类生成为特殊形状是很有用的。我们可以使用dataset.make_circles函数来实现这一点。
当然,我们也可以向数据中加入一些噪声来检验聚类算法的鲁棒性。
月形集群数据生成:我们也可以用datasets.make_moons函数生成带有可控噪声的月型集群数据来测试算法。
用任意符号表达式生成数据
虽然前面提到的函数非常好上手,但是用户无法轻松控制数据生成的底层机制,并且回归输出不是输入的确定函数——确实是随机输出。虽然这对于许多问题可能就足够了,但是通常需要可控方法来生成这些基于定义良好的函数(涉及线性、非线性、有理、甚至超越项)的问题。
例如,我们想要评估各种核化SVM分类器在配备有日驱复杂的分离器(线性到非线性)的数据集上的有效性,或者想证明线性模型对于由有理函数或超越函数生成的回归数据集的局限性。利用scikit-learning的这些功能很难做到这一点。
此外,用户可能只想输入符号表达式作为生成函数(或分类任务的逻辑分隔符)。仅使用scikit-learning的实用程序是不太容易做到这一点的,并且必须为实验的每个新实例编写自己的函数。
为了解决符号表达式输入问题,可以容易地利用Python包SymPy,它允许理解、渲染和评估符号数学表达式,达到了相当复杂的程度。
例如,我们可以将符号表达式作为平方项(x2)和正弦项(如sin(x))的乘积,并由此创建随机回归数据集。
或者,可以生成用于测试神经网络算法的基于非线性椭圆分类边界的数据集。注意,在下面的图中,展示了用户是如何输入符号表达式m='x1**2-x2**2'并生成这个数据集的。
使用“pydbgen”库生成分类数据
虽然许多高质量的基于现实生活的数据集在网上就有,可被用来尝试很酷的机器学习技术,但从个人经验来看,学习SQL时情况并非如此。
对于数据科学专家来说,基本熟悉SQL几乎与知道如何用Python或R编写代码一样重要。但是使用真实分类数据(如姓名、年龄、信用卡、社保号码、地址、生日等)访问足够大的数据库并不像访问Kaggle上的玩具数据集那样常见,Kaggle是专门为机器学习任务而设计策划的。
除了数据科学的初学者之外,即使是经验丰富的软件测试人员也可能发现一个简单的工具是很有用的,只需几行代码,他们就可以生成一个具有随机(假的)但又有意义的任意大条目的数据集。
输入PydGEN。
它是一个轻量级的纯python库,用于生成随机的有用条目(例如,姓名、地址、信用卡号、日期、时间、公司名称、职称、车牌号等),并将它们保存在Pandas数据框架对象中,或者作为数据库文件中的SQLit表或MS Excel文件中。
这里将仅展示几个带有屏幕截图的简单数据生成示例:
生成几个国际电话号码:
用名称、地址、SSN等随机条目生成完整的数据帧:
总结和结论
本文讨论了访问高质量数据集对于进入令人激动的数据科学和机器学习世界的重要性。通常缺乏足够灵活和丰富度的数据集会限制一个人深入机器学习或统计建模技术的内部工作的能力,并留下肤浅的理解。
合成数据集在这方面能提供很大的帮助,并且有一些现成的函数可用于尝试此路线。然而,有时需要能够基于复杂的非线性符号输入来生成合成数据,我们讨论了这种方法。
此外,本文还讨论了一个令人兴奋的Python库,它可以为数据库技能实践和分析任务生成随机的实际数据集。
本文的目的是要表明,年轻的数据科学家不必因为无法获得合适的数据集而陷入困境。相反,他们应该寻找和设计自己的编程解决方案,以创建用于他们学习目的的合成数据。在此过程中,他们可能会学到许多新的技能,并打开新的机会之门。
留言 点赞 发个朋友圈
我们一起分享AI学习与发展的干货
编译组:高亚晶、韦振琛
领取专属 10元无门槛券
私享最新 技术干货