《Python大规模机器学习》 —1 迈向可扩展性的第一步
第1章迈向可扩展性的第一步
欢迎阅读本书!你将学习关于使用Python实现机器学习可扩展性的知识。
本章将讨论如何用Python从大数据中进行有效学习,以及如何使用单机或其他机器集群进行这样的学习,比如可从Amazon Web(AWS)或Goolge云平台访问这样的集群。
在本书中,我们将使用由Python实现的可扩展的机器学习算法。这意味着它们能处理大量数据并且不会因为内存限制而崩溃。当然,运行它们也需要一段合理的时间,这对于数据科学原理来说是可管理的,并且也可在生产中部署。本章围绕解决方案(如流数据)、算法(如神经网络或集成树)和框架(如Hadoop或Spark)展开。我们还将提供一些关于机器学习算法的基本提示,以解释如何使这些算法具有可扩展性,并可适用于具有海量数据集的问题。
考虑到这些问题,你需要学习基础知识以便弄清本书的写作背景,同时设置好所有基本工具以便立即开始阅读本章。
本章讨论以下主题:
可扩展性实际上意味着什么
处理数据时应注意哪些瓶颈
本书将帮助你解决什么问题
如何使用Python有效地分析数据集
如何快速设置用户机器来运行本书中给出的示例
1.1详细解释可扩展性
现在大数据被大肆宣传,但大数据集早在其术语本身被创造出来之前就已经存在了。大量的DNA序列文本和来自射电望远镜的大量数据总是对科学家和数据分析人员构成挑战。由于大多数机器学习算法具有O(n2)甚至O(n3)的计算复杂度(其中n为训练样本数),致使此前数据科学家一直被大数据集所困扰,为此数据分析人员只能采用更有效的数据算法。当机器学习算法经适当的设置后能处理大数据并可工作时,它就被认为具有可扩展性。因为有大量实例或变量,或因为二者兼有,数据集会变大,但可扩展性算法能够按其运行时间几乎与问题规模呈线性关系的方式来处理它。因此,这只是一个用更多数据按1∶1交换时间(或更多计算能力)的问题。相反,如果机器学习算法面对大量数据时无法扩展,只是停止工作或以非线性方式(如指数规律)增加运行时间的话,那么学习就会变得不可行。
廉价数据存储器、大容量RAM和多核处理器CPU的引进极大地改变了这一切,甚至提高了单台笔记本电脑分析大量数据的能力。过去几年里,另一个重大的游戏变革者出现了,它把注意力从单台强大的机器转移到商用计算机集群(更便宜、更容易访问)。这一重大变化是MapReduce和开源框架Apache Hadoop及其Hadoop分布式文件系统(HDFS)的引入,总之,是计算机网络上并行计算的引入。
为了弄清楚这两个变化如何对解决大规模问题的能力产生深刻和积极的影响,我们首先应该讨论是什么在实际阻止对大型数据集的分析。
不管问题是什么,最终你会发现是因为以下问题使你不能分析数据:
计算会影响执行分析所花费的时间
I/O会影响单位时间内从存储器读取到内存的数据量
内存会影响一次处理的大数据量
你的计算机有局限性,这些限制将决定你是否能从数据中学习,以及在碰壁之前需要多长时间。许多密集计算中出现的I/O问题将限制你对数据的快速访问,最后,内存限制会使你只能处理一部分数据,这样就限制了你可能访问的矩阵计算类型,甚至影响结果的精度和准确性。
以上每一项硬件限制都会有影响,其严重程度取决于所分析的数据:
高数据,特点是具有大量案例
宽数据,特点是具有大量特征
高宽的数据,包含大量案例和特征
稀疏数据,特点具有大量零元素或能转换成零的元素(也就是说,数据矩阵可能很高且/或宽,但有信息价值,但不是所有的矩阵条目都具有信息价值)。
最后,来看要用来从数据中进行学习的算法。每一种算法都有其自身的特点,即能够通过不同偏差或方差的解决方案来映射数据。因此,就你已经通过机器学习解决的问题而言,基于经验或经过实践考验过的某些算法会比其他算法更好。尤其是大规模问题,选用算法时必须考虑其他因素:
算法复杂性,即数据中的行数和列数是否以线性或非线性方式影响计算次数。大多数机器学习解决方案都是二次或三次复杂度算法,这样会严重地限制它们对大数据的适用性。
模型参数个数,这不仅仅是方差估计(过拟合)问题,而且涉及计算它们所需的时间。
并行优化,即是否能轻松地将计算拆分为节点或CPU核心,还是只能进行单个连续优化?
是从全部数据中学习,还是从单个示例或小批量数据中学习?
如果用数据特征和该类算法来交叉评估硬件限制,就会得到一系列会阻止你从大规模分析中得到结果的可能存在的问题组合。从实际角度来看,所有的问题组合都可通过以下三种方法解决:
向上扩展,即通过修改软件或硬件(更大内存、更快CPU、更快存储磁盘和GPU)来提高单台机器的性能。
向外扩展,即利用外部资源(其他存储磁盘、CPU与GPU等)在多台机器上分散计算(和性能)。
向上和向外扩展,即综合利用向上和向外扩展方法。
1.1.1大规模实例
有激励性的示例让事情变得更清晰,更令人难忘,以两个简单示例为例:
网络广告如此广泛传播并吞噬大量传统媒体份额时,预测点击率(CTR)会帮助你赚到很多钱。
客户搜索网站提供的产品和服务时,如果能猜出他们到底想要什么,这样会大大增加销售机会。
这两种情况都会产生大数据集,因为它们是由用户在互联网上交互产生的。
取决于我们假设的业务(在这里我们想象有些大型企业),显然这两个示例中每天都要研究数以万计的数据点。广告案例中,数据无疑是一个连续信息流,最新的数据更能代表市场和消费者,并且能取代旧数据。搜索引擎案例中,数据具有广泛性,因为向客户提供结果时所应用的功能更加丰富,例如,如果你在旅行,需要提供相当多的酒店、地点和服务等功能。
显然,对于这些情况可扩展性是一个问题:
必须每天从日益增长的数据中学习,而且还必须学得更快,因为在学习过程中,新的数据不断出现。必须处理由于维数太高或太大而不适合放入内存的数据。
经常更新机器学习模型以适应新数据。这时需要一个能及时处理信息的算法。由于数据量原因无法处理O(n2)或O(n3)复杂度;需要一些具有较低复杂度的算法(如O(n)),或将数据划分,让n变得更小。
必须能够快速预测,因为预测必须只提供给新客户。同样,算法的复杂性也很重要。
可以通过以下方法解决可扩展性问题:
通过减少问题的维数进行扩展;例如,在搜索引擎示例中,可以有效选择要使用的相关特征。
使用正确算法进行扩展;例如,广告数据示例中采用适合数据流的学习算法。
利用多台机器缩短学习过程。
通过在单台服务器上有效使用多处理和矢量化来扩展部署过程。
本书将告诉你哪些实际问题适合采用哪种解决方案或算法。之后,你就能自动地根据时间和运行方面的特定约束(CPU、内存或I/O),找到我们提议的最合适的解决方案。
- 点赞
- 收藏
- 关注作者
评论(0)