Scikit-Learn&More,用于机器学习的综合数据集生成 鸣叫 分享6 尽管成熟的算法和开源代码库可供机器学习从业人员广泛使用,但使用足够的数据去应用这些技术仍然是一个核心挑战。现在让我们了解如何利用scikit-learn和其他工具来生成适合优化和微调模型的综合数据。--- Kevin Vu 越来越明显的是,谷歌,Facebook和微软等大型科技巨头对最新的机器学习算法和软件包非常慷慨(它们免费提供这些),因为目前算法世界的入门门槛很低。开源社区和工具(例如scikit-learn)已经走了很长一段路,大量的开源计划正在推动数据科学,数字分析和机器学习的发展。站在2018年,我们可以肯定地说,算法,编程框架和机器学习套件(甚至是学习这些技术的教程和课程)不是稀缺资源,而是高质量数据。 在调整和微调这些算法时,这通常成为数据科学(DS)和机器学习(ML)从业者的棘手问题。明智的是,从一开始就应该指出当前的文章,与算法研究、教学法学习和模型原型的数据稀缺有关,而不是与扩展和运行商业运作有关。这不是关于如何获取时尚旅行或时尚应用程序的数据的讨论。这种消费者,社会或行为数据收集会给自己带来问题。但是,即使是访问质量数据集以测试特定算法方法的局限性和变化性之类的简单操作,也往往不是那么简单。 1/17 为什么需要综合数据集? 如果是从头开始学习,则最合理的建议是从简单的小规模数据集入手,你可以在二维空间中绘制这些数据集,以直观地了解模式并亲自查看ML算法的工作方式。 但是,随着数据量的爆炸式增长,视觉判断必须扩展到更复杂的问题上,例如学习样本复杂性,计算效率,类不平衡等概念。 在这一点上,实验灵活性和数据集性质之间的取舍开始发挥作用。总会有办法找到一个庞大的真实数据集来实践算法。但这仍然是一个固定的数据集,具有固定数量的样本,固定的基础模式以及正样本与负样本之间的类别分离程度。还必须调查 ·测试和训练数据的选定部分如何影响算法的性能和抗干扰性。 ·面对不同程度的班级失衡,指标的稳定性。 ·必须进行什么样的偏差方差折衷。 ·在训练和测试数据(即标签以及功能集中的噪声)下,算法在各种噪声签名下的性能如何。 ·如何进行实验并找出ML算法的弱点? 2/17 事实证明,如果使用单个真实数据集很难做到这些,必须愿意使用足够随机合成的数据来捕获真实数据集的所有变化,但可控的数据足以帮助我们科学地调查正在构建的特定ML算法的优缺点。 尽管我们不会在本文中讨论此问题,但对于敏感的应用程序-医疗分类或财务模型,可以轻松地评估此类合成数据集的潜在利益,而获取高质量的,带有标签的数据集通常会很昂贵且令人望而却步。 ML综合数据集的基本功能 在这一点上可以理解,合成数据集是通过程序生成的,而不是来自任何种类的社会或科学实验,业务交易数据,传感器读取或图像的手动标记。但是,此类数据集绝对不是完全随机的,并且ML的合成数据的生成和使用必须以一些总体需求为指导。特别是: ·它可以是数字的,二进制的或分类的(有序或非有序),特征的数量和数据集的长度可以是任意的。 ·它必须具有一定程度的随机性,但同时,用户应该能够选择各种统计分布来基于此数据,即可以精确控制和调整基础随机过程。 ·如果将其用于分类算法,则类别分离的程度应该是可控制的,以使学习问题变得容易或困难。 ·可以以可控的方式插入随机噪声。 ·生成速度应该很高,以便能够针对任何特定的ML算法使用大量此类数据集进行实验,即,如果合成数据基于现实生活数据集上的数据扩充,则扩充算法必须在计算上有效。 ·对于回归问题,可以使用复杂的非线性生成过程来获取数据-实际的物理模型可能会有助于这一工作。 在下一节中,我们将展示如何使用一些最受欢迎的ML库和编程技术来生成合适的数据集。 使用scikit-learn和Numpy生成标准回归,分类和聚类数据集 3/17 Scikit-learn是用于数据科学的基于Python的软件中最受欢迎的ML库。除了优化的ML例程和构建方法外,它还拥有用于合成数据生成的实用方法的可靠集合。 scikit-learn的回归 Scikit-learn的dataset.make_regression函数可以创建具有任意数量的输入要素,输出目标以及它们之间的信息耦合程度,可控制随机回归问题。 使用Scikit学习进行分类 与上面的回归函数类似,dataset.make_classification生成一个随机的多类分类问题,具有可控制的类分离和增加的噪声。如果需要,还可以随机翻转任意百分比的输出符号以创建更难的分类数据集。 使用Scikit学习进行聚类 scikit-learn实用程序功能可能会产生各种聚类问题。最直接的方法是使用datasets.make_blobs,它会生成任意数量的具有可控制距离参数的聚类。 4/17 对于测试基于亲和力的聚类算法或高斯混合模型,以特殊形状生成聚类非常有用。我们可以使用datasets.make_circles函数来实现。 5/17