※ 引述《wudistan (wudistan)》之铭言:
: 大家好,由于大学就读统计系,在网络上看了许多big data的资料与一些会用到的程式如java、Hadoop、mapreduce、NoSQL与R,由于在当替代役中,虽然想去上资策会课程又无法去,想说利用有空档时间学习相关知识,其中对R有基础认识,想从这里开始从头开始学,但由于大学所学的与big data所需貌似不是很有相关…
: 小弟愚笨爬了很多文但还是想请问版大们R在学习上该如何与何时进入big data这块? 谢谢版大们~
想要玩大资料的人,目前的主流是资工出身的同学。统计出身的人相比之下,优势在于以
机率统计描述资料时,可以更深刻地理解模型背后代表的意义,进而在挖掘资料时找到更
深的资讯。
缺点则是对工具(电脑)的理解不够深入,所以在工具的运用能力上要花心思,或是避开
交给专家(和资工的人合作)。
R 可以处理较大的资料,但是你要比处理小资料多知道很多R 工作的原理,尤其是内存
相关的议题。如果不幸,你得直接处理真正很大很大的资料(TB+),请去学Java(Hadoop)
或Scala(Spark)把资料整理(弄小)之后再交给R 做。
我个人认为大资料中,分析部分的挑战和过去没什么差异,但是在工具和效能上的要求更
严苛。现在看起来,硬件的突破比资料量的成长慢。
要分析大资料,使用工具的能力就是第一个门槛。很遗憾,我目前不知道学校方面有没有
提供相关的训练。所以我建议你如果在学的话,请务必把学校教的,一般的资料的分析学
好,这部分是你可以胜过其他竞争者的地方。
之后如果你一定要亲手做,那请务必自行补充资料结构和算法的相关知识,否则会连工
具的说明都看不懂。在资料大的时候,O(N)和O(log N)是差异很大的。
# 怎么读资料
1. 会用工具捞资料
2. 知道工具指令对应的复杂度
如果只是读中型大小的资料,可能到1.就够了。但是当资料大到某个规模,2.的重要性就
出来了。
抽样在这里应该很有帮助,但是也要理解抽样的计算复杂度。
## 学习上的建议
如果是R 的话,就要知道捞资料的时候内存的运作机制,要学习Streaming或pipeline的
方式捞资料。
ps. 这里给你一些key word囉
这些和你的资料源有关,所以建议等到实际遇到再学吧。每种遇到的case可能不一样,所
以没必要先学。遇到的时候再请教前辈或是网络上找资源吧。
# 了解效能的频颈
1. 知道内存和硬件的差异。知道怎么评估内存的消耗量。
2. 了解怎么评估算法复杂度,并且选择正确的资料结构。
统计所的学生,如果照着课本的方法来读取大资料,最常见的就是塞爆内存而不自知。
照着课本:`read.table("xxx.csv")` 然后内存就爆炸了,学生也不知道为什么电脑死
在那边。
资料结构选得好不好,结果就是要等一天还是数分钟。拥有找到频颈的能力,才能了解自
己卡在拿里,或者是和工程师沟通。
## 学习上的建议
找时间请自修算法或资料结构,如果没时间的话也至少理解何谓时间复杂度和空间复杂
度。至少要能理解:http://en.wikipedia.org/wiki/Array_data_structure 中下面的
Efficiency comparison with other data structure。你不用会写,但是看工具说明书
的时候会用到这个知识。这我觉得是在学校可以先学的。
之后我建议直接找实际的资料来做练习,遇到瓶颈可以多和其他有兴趣处理大资料的人
交流,也很欢迎来我们社群。社群中许多在公司处理大资料的朋友。(如趋势科技)
# 个人经验谈
以上是我目前处理30GB/日的资料的心得。目前的任务就是要从这些资料中做出一个好的
Logistic Regression Model。目前我是用R / C++ 作为主要的工具。
在Model Encoding上还满辛苦的,因为R 没有能用的工具,我要自己做。用R 做的好处是
对答案相对轻松,因为小资料上已经有现成工具可以做比较!
实做上,效能往往最后都卡在Optimization上,这里我超级推台大资工林老师的libsvm和
Liblinear,他们的optimization的kernel 超猛,会C / C++ 的话可以自己抽出来用。
ps. 可以参考我之前写的AWS + pbdMPI的文章,里面有抽Liblinear的核心出来用。
最后Model 的调教和解释,则和以前统计所教的差不多,就是要努力让其他同仁可以理解
Variable Encoding 的意义,如何处理Missing Data,也常常会发现其他同仁不小心误
解模型的意义。
统计出身的,这才是优势,放掉的话不如念资工囉。