《Python大规模机器学习》—2 Scikit-learn中的可扩展学习

举报
华章计算机 发表于 2019/06/12 21:24:53 2019/06/12
【摘要】 本节书摘来自华章计算机《Python大规模机器学习》一书中的第2章,第2.1.1节,作者是[荷]巴斯蒂安·贾丁(Bastiaan Sjardin)[意]卢卡·马萨罗(Luca Massaron)[意]阿尔贝托·博斯凯蒂(Alberto Boschetti)王贵财刘春明译。

第2章

Scikit-learn中的可扩展学习

 

假如拥有这个时代强大而又实惠的电脑,那么,将数据集加载到内存中、准备好数据矩阵、训练机器学习算法以及使用样本外观察法来测试其泛化能力通常并不是非常困难。然而,随着要处理的数据规模越来越大,不可能将其加载到计算机核心内存中,即使能加载,在处理数据管理和机器学习两方面,其结果依旧会很棘手。

一种避开核心内存的可行策略是:将数据分割为样本,使用并行性,最后从小批量或单个实例中学习。本章重点介绍Scikit-learn软件包提供的开箱即用解决方案:从数据存储器中以“流”的方式读入小批量实例并基于它们进行增量学习。这种解决方案称为“非核心学习”。

通过处理可管理的数据块和增量学习来处理数据是个好方法。然而,当试图实现时,由于现有学习算法的局限性,它也具有挑战性。并且,流动中的数据流也对数据管理和特征提取提出新要求。除了通过Scikit-learn提供非核心学习功能外,我们还提供Python解决方案,以解决只有一小部分数据时可能面临的问题。

本章讨论以下主题:

  •  在Scikit-learn中实现非核心学习算法

  •  使用散列技巧有效管理数据流

  •  随机学习的基本原理

  •  通过在线学习实现数据科学

  •  数据流的无监督转换

2.1    非核心学习

非核心学习是指一组处理数据的算法,这些数据不能放入单台计算机内存,但很容易放入某些数据存储介质,例如本地硬盘或网络存储库。单台机器的核心内存(即可用RAM)的大小通常可能只有几千兆字节(有时是2GB,但4GB更常见,这里假设最多2GB),在有些大型服务器上会高达256GB。大型服务器与用来提供像Amazon弹性计算云(EC2)这样的云计算服务的机器类似,在使用这样的服务时,只需用一个外部驱动器,你的存储能力就能轻易超过千兆字节(最有可能是1TB,有时高达4TB)。

由于机器学习立足于全局降低成本函数,因此许多算法最初都被认为将处理所有可用数据,并能在优化过程的每次迭代中访问这些数据。这样的情况特别适用于基于统计学习的所有矩阵演算算法(例如逆矩阵),而且基于贪婪搜索的算法需要在执行下一步前评估尽可能多的数据。因此,最常见的开箱即用的回归式算法(加权线性特征组合)会更新其系数,以尽量减少合并整个数据集的错误。类似地,由于对数据集中的噪声非常敏感,决策树必须根据所有可用数据决定最佳分割,以便找到最优解决方案。

如果这种情况下数据无法放入计算机核心内存,那么就不存在解决方案。只有增加可用内存(这受限于主板,否则只能采用书中后几章介绍的分布式系统,比如Hadoop和Spark这样的解决方案),或简单减少数据集以适应内存。

如果是稀疏数据,也就是说,数据集中有许多零值,则可将稠密矩阵转换为稀疏矩阵。这就是典型的具有许多列的文本数据,因为每列就是一个文字,但表示字频数的值很小,因为单个文本文件通常只显示有限文字。有时利用稀疏矩阵能解决这个问题,它允许你同时加载和处理其他相当大的数据集,但这不是灵丹妙药(也就是说,没有适合解决所有问题的解决方案),因为某些数据矩阵虽然稀疏,但其大小常常令人吃惊。

这种情况下,总是可以尝试减少实例数量或限制特征数量来减少数据集,从而达到减少数据集矩阵维数和内存中占用区域的目的。只选择一部分观察数据来减少数据集大小称为子采样(或简单抽样)解决方案。子采样虽好,但也有严重缺陷,在决定分析前务必注意这一点。

2.1.1选择子采样

使用子采样时,实际上会失去一部分信息,并且无法确定是否只丢弃了冗余信息,而不是有用的观察数据。实际上,只有考虑到所有数据,才能找到有价值的信息。尽管子采样在计算方面很有吸引力(因为子采样只需一个随机生成器来告诉你是否应该选择某个实例),但这样确实可能限制算法以完整方式学习数据中的规则和关联的能力。在对偏差与方差的权衡中,由于数据中的随机噪声或离线观测,致使估计变得更不确定,从而导致子采样预测方差膨胀。

在大数据世界里,能处理更多高质量数据的算法会获胜,因为它能学习更多方法,从而将预测与预测器关联,而那些用更少、更嘈杂数据学习的模型与此相反。因此,尽管子采样可以作为一种解决方案,但由于预测不准确和估计方差较大,子采样可能影响机器学习结果。

在数据的多个子样本上学习多个模型,然后将所有解决方案或所有模型结果堆叠,从而创建用于进一步训练的简化数据矩阵,以达到克服子采样限制的目的。这个过程称为bagging,它实际上是以这种方式压缩某些特征,从而减少内存数据空间。后面章节会介绍集成和堆叠,并说明如何减少被子采样所膨胀的数据估计方差。

另一种选择是裁剪特征,而不是裁剪实例,但是这同样也会遇到问题:这需要从数据中构建模型以测试选择哪些特征,因此,仍然不得不用无法放入内存的数据来构建模型。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。