大家好!我是猫大,大家还记得我的好友咪咪(那位想要知道自己养的猫,会不会抓老鼠的那位爱猫人士)吗?在过去文章什么 ? SVM会赚钱 !中猫大介绍了SVM的概念,以及如何通过LIBSVM,帮助使用者解决分类问题。
前几天咪咪致电猫大求助---在使用LIBSVM的时候出现了记忆体不足(out of memory)的错误讯息。猫大以往也碰过此错误讯息,塬因在于"当要用作建立模型的资料过于庞大时,电脑中的记忆体会无法一次容纳"导致于无法顺利建模。
为了解决这个问题,猫大在前几週介绍过虚拟矩阵的概念,也就是「虚拟化地将所需要的资料以矩阵的方式切割」,当我们程式需要这些资料时,再每次从资料库取一部分的资料供程式分析使用。
由于LIBSVM并没有实作虚拟矩阵,以致于没办法解决资料过于庞大时,会遇到记忆体不够的问题,而将LIBSVM的程式改写,成为可以使用虚拟矩阵的作法又会过于困难。于是猫大发现了一个好用的工具,那就是Spark中的MLlib。
Spark是近年来非常流行的一种分散式运算的系统,MLlib是它提供的套件之一。MLlib是机器学习的函式库,其中提供了许多演算法,如SVM、决策树、罗吉斯回归等。其使用起来非常简单,只需要短短几行指令,就可以完成建模的工作,最棒的是它可以容纳非常庞大的资料!这些优点归功于Spark中的RDD(Resilient Distributed Dataset)。
RDD(Resilient Distributed Dataset),可将它视为一种虚拟矩阵的实作。RDD基本上存放于记忆体当中,使得整个运算速度快上许多,只有在记忆体放不下的时候,才会存放在硬碟上,不过整体上运算速度并不会影响太大。
当资料有缺失时,以往的容错机制,是採取多复製几份副本,以免当错误发生时,找不到遗失的资料。然而RDD的容错机制是採取名为”lineage”的方式,它不需要多频宽去传输副本,以及额外的空间去储存副本,”lineage”只要透过RDD的资讯,便可以去推导出遗失的资料了,相较于前者更为有效率。
我们都知道许多机器学习的演算法,像是SVM求解的方式都必须透过迭代法(也就是指下一次的运算,必须依赖上一次的运算结果),必须用到许多之前的计算结果。而RDD是存放在记忆体当中,可以减少I/O的存取时间,自然而然可以加快建模的速度,另外拥有良好的容错机制,使得Spark非常适合巨量资料分析。有兴趣的读者不妨可以浏览Spark官网,更进一步瞭解Spark,想要更深入了解RDD的读者们也可以参考 ResilientDistributed Datasets: A Fault-Tolerant Abstraction forIn-Memory Cluster Computing论文。
在分析大数据的时候,LIBSVM无法顺利建立模型,而Spark的RDD解决了此问题,并且提供了MLlib,可在分散式的系统下快速建模。