大家好!我是貓大,大家還記得我的好友咪咪(那位想要知道自己養的貓,會不會抓老鼠的那位愛貓人士)嗎?在過去文章什麼 ? SVM會賺錢 !中貓大介紹了SVM的概念,以及如何通過LIBSVM,幫助使用者解決分類問題。
記憶體不足
前幾天咪咪致電貓大求助---在使用LIBSVM的時候出現了記憶體不足(out of memory)的錯誤訊息。貓大以往也碰過此錯誤訊息,原因在於"當要用作建立模型的資料過於龐大時,電腦中的記憶體會無法一次容納"導致於無法順利建模。為了解決這個問題,貓大在前幾週介紹過虛擬矩陣的概念,也就是「虛擬化地將所需要的資料以矩陣的方式切割」,當我們程式需要這些資料時,再每次從資料庫取一部分的資料供程式分析使用。
由於LIBSVM並沒有實作虛擬矩陣,以致於沒辦法解決資料過於龐大時,會遇到記憶體不夠的問題,而將LIBSVM的程式改寫,成為可以使用虛擬矩陣的作法又會過於困難。於是貓大發現了一個好用的工具,那就是Spark中的MLlib。
解決方法-MLlib
Spark是近年來非常流行的一種分散式運算的系統,MLlib是它提供的套件之一。MLlib是機器學習的函式庫,其中提供了許多演算法,如SVM、決策樹、羅吉斯回歸等。其使用起來非常簡單,只需要短短幾行指令,就可以完成建模的工作,最棒的是它可以容納非常龐大的資料!這些優點歸功於Spark中的RDD(Resilient Distributed Dataset)。什麼是RDD
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,可在分散式的系統下快速建模。
採礦貓
採礦貓過去在許多金控公司當過顧問,看到很多台灣散戶投資者被國外的投資公司坑殺,因而希望能提供散戶強大的投資工具與武器以提升獲利率、避免走上被坑殺的道路
0 意見:
張貼留言