朋友们 Sweave

饭桌上的闲聊

六月的最后一周,在厦门大学统计系做了一份小学期课程的分享。午餐期间,胡帆同学整理并提问了一些问题。感谢 WiseRClub 的文字整理。

以下为谈话内容

胡帆:

您是正儿八经的统计学专业出身,但是现在统计学出身的人大部分都在做机器学习,请问您认为统计学和机器学习的联系和区别是什么?

刘思喆:

  其实没有什么大的区别,简单的说:计算机系和统计系各自重新把数据科学发明了一遍。计算机的人做很多东西,跟统计系做的很多东西其实都是一样的,只是在概念上不一样。经常地,统计系的学生和计算机系的学生在聊天的时候发现,我们说的是一个东西吗?后来发现,就是一个东西!   举个例子:统计系的学生在讲到回归的一些变种的时候会讲到Lasso,而计算机系的学生是从来不会讲Lasso这个概念的,他们叫L1正则;而计算机系学生所说的L2正则,就是统计学中的Ridge regression(岭回归)。其实他们的本质都是在解决数据科学中的一些问题,计算机的人走自己的一条路,而统计的人走的是另一个方向,但实际上我们所解决的问题都是一样的,这个现象最近几年愈演愈烈。大量统计压箱底的好物件,被计算机背景的人不停的翻出。事实上每个系或者每个专业背景的人其实都有自己的优势,我觉得最终会殊途同归。   所以,我们经常说一句话:“一个好的程序员必须是半个好的分析师,一个好的分析师必须半个好的程序员”。这句话虽然粗糙,但我觉得比较好的描述这样一个观点:统计系的学生或者有统计专业背景的人,应该擅长自己统计那块,但是编程这块也要至少能及格;而计算机那边的人呢,如果只做软件工程,那是不够的,他要能够掌握基本的统计思想。

胡帆:

  您翻译过很多R的著作,也写了《153分钟学会R》这种脍炙人口的书,您本身也是一名R极客。但是现在Python也在数据科学领域大放异彩,像Google、Instagram 都用的是Python,很多人现在都在押宝,R和Python,究竟哪个将来会在数据科学领域拔得头筹,对此,您有什么看法?

刘思喆:

  说个小插曲:几年前我在外面给大家讲课的时候,主办方特别希望让我和一位教SPSS的老师一个讲上午一个人讲下午,两人同台PK一下;而这次就变成:问我能不能上午讲R,然后肖凯老师下午讲Python,两人同台PK一下(注:采访过程中,肖凯老师也在现场,对肖凯老师也感兴趣的同学们可以关注我们后续将推出的另一篇关于肖凯老师的采访哦!)。   R的演化大概是在十年前吧,当时R的主要对标是软件SAS,它是更接近统计分析,或离线分析这样的一种软件。在统计之都论坛上大家经常拿R和SPSS和SAS进行PK。后来,大概在07、08年的时候,我们突然发现SAS和SPSS已经无法跟R抗衡了,已经不是一个量级的了。当然传统的一些行业,如制药、金融、风控等还是有在用SAS的,但是(此处省略342字)

胡帆:

  感觉它们现在已经有点跟不上时代了

刘思喆:

  对。我们再返回Python和R的问题,Python和R其实有点像,他们都不是纯底层语言,都能跟其他语言做交互,比如我们常把Python称之为胶水语言。在数据科学工具的使用度上,大家可以去看一些相关的排行榜:2005年前后是SPSS和SAS占主要地位。然后是R,R大概雄霸了5、6年的样子,今年的话,明确的看到Python已经上来了,而且Python比R还略占优势。   但并不是说,R和Python这两个工具是纯竞争或替代关系,它们之间其实还有互补的地方。比如说:R在做EDA(探索性数据分析)比较有优势,EDA有一个理念:每个分析的中间的结果,是可以作为下一个分析的前置条件的。R是典型的copy-on-modify机制,赋值一个新的变量R会拷贝一份内存,而Python则在内存中做指向。R慢主要是因为这个,但在数据分析这块,这种机制能保证它不会出错。从这种意义来讲,R保证了数据分析的严谨性,但是它牺牲了性能。所以这两个工具其实是应用场景不太一样。

胡帆:

  那么,在企业中做大数量级运算的时候,R是不是就处于劣势了?

刘思喆:

这个话题有点大,从几个方面讲吧:R(S)从发明之初就不是为了纯编程,它近乎完美地平衡了数据分析和编程开发之间的关系。只要有数据分析和编程开发同时出现的情况(Programming with Data)就有R应用的必要。另外,我们常常被一个误区所迷惑,认为所有企业的数据量都非常大,其实不是的。99.9%企业里以上的数据问题,单机版的R就能搞定,盲目跟风上集群投入产出比太低。 最后拿我的团队来说,我不会特意去要求组员非要用R或非要用Python,这是没有意义的,因为工具就是工具,具体用什么其实无所谓。为什么现在Python在工业界里面用的更多,主要原因是,很多计算机的人,在用Python或在类似工具在做一些线上的工程,这块的话Python比较方便,非常顺利地成为大家首选的工具。而R本身就是在统计的圈子,包括数据科学,统计系的学生用的偏多一点,所以看起来在工程这块,就没有那么多R的使用了。

胡帆:

  请问您觉得要成为一个数据科学家,需要掌握哪些必备的技能?包括各种软技能、硬技能。

刘思喆:

  先说硬技能吧:所有的算法都要自己实现,不需要用最底层的语言实现,你可以用Python、用R去写,但是你要把它给实现出来,你必须要知道一些细节,这是纯的硬技能。以及你分析技能的方法论,其实它是有套路的,就是你怎么去做这个东西,比如:你是自上往下做分解,还是从一个切面去分析相关和因果,这个是有一些套路的。 软技能的话,因为我们做数据科学不是一个简单地单兵作战的一项工作,而是你要和很多人协作的一个过程,这就会涉及到你怎么跟其他人合作以及怎么去影响你真正去落地的关键人物,你怎么样去兜售自己的idea,这都是比较重要的。

胡帆:

  因此,这些软技能也就是指团队合作能力,沟通能力,和表达能力,是吗?

刘思喆:

  对。

胡帆:

  我们可以把数据挖掘、机器学习的理论方法,看做“道”,把R、Python、Spark、Hadoop等工具看成“术”,现在这些工具特别多,有很多人会陷入痴迷工具的误区,过度追求工具的使用。您在求学时,是如何在忙碌的学习生活之余,把“道”和“术”融会贯通的?

刘思喆:

  大概七八年前,我也同样特别痴迷所有的算法,直到见到了一位敬仰的人大师兄。我在饭桌上感慨道:“每天都会去看大量的算法,感觉很神奇很有趣,特开心!”然后他反问了我一句话:“思喆,你即便是把这些东西都穷尽了,你又能做什么?”当时我被问得无话可说,愣了半分钟。生命是有限的,如果只是学但并没有产出,是没有意义的。所以当时学长醍醐灌顶,一语惊醒梦中人。看那些算法确实会觉得很爽,会感叹算法的神奇,你会觉得自己在用上帝视角看整个世界,这样是很快乐,但你会发现如果没有目的性,不用这些算法具体做些什么,其实是然并卵的。所以玩归玩,做事情还是要认真思考落地性的。 (帆帆总结:需要有业务知识来驱动)

胡帆:

  但是业务知识在我们平时的学习生活中是碰不到的,我们该怎么获取相关的知识呢?

刘思喆:

  多认识人,多去看、多去想。多认识人就不必多说重要性了。举个多思考的例子:我是哔哩哔哩的重度用户,在逛B站的过程中就会去想,这个系统的设计,模块的关系,以及对应算法怎么去做的;还有网易云音乐,它每个环节的设计,比如用户的评论环节,它能收集到什么样的数据,它的算法能怎么做,数据收集的机制有没有可能做一些改变?

胡帆:

  但这些有时候不是一下能想通的

刘思喆:

  我认为这是心智的一种锻炼,一开始可能会比较吃力,但你要持续去锻炼这个能力,你要不停去抽象。碰到的问题能不能把它抽象成一个数据问题、数学模型和建模问题。这个能力需要经常去锻炼。早年我觉得哪些数据可能有点用,就会写爬虫去网上爬,爬下来之后就开始折腾自己的一些想法,这个爱好对我后面的工作帮助很大。总结下:你要知道怎样去收集数据,收集数据之后,怎么用这个数据做出一些结论性的内容。学生期间不用特意去追求做所谓的有价值的东西,有兴趣好玩,追随自己内心就可以了。

胡帆:

  那您当初肯定是用R爬虫吧

刘思喆:

  对,我用R写的。当时还没有这些爬虫的包,我是用base写的

胡帆:

  能自己写这些代码,您对知识肯定理解得特别透彻!

刘思喆:

  如果明白原理的话,其实没有那么复杂。比如一些 ensemble 的一些方法,甚至像boosting的一些方法还有像爬虫等等,没几行代码就可以搞定。举个例子:在谢益辉没有写knitr之前,R的自动化报告都是用Sweave来做的,巨难用。有一次刚好业务上绕不过去,于是我就把Sweave 改了一遍,以适应当时的业务场景。所以理解你面临的问题,以及问题的本质是什么很重要。如果刚好自己有很喜欢就更好了,可以做到极致。

胡帆:

  这要花很长时间去看源代码吧?

刘思喆:

  这是一个很好的途径,但其实,我觉得有一个思维上的考虑:你要想明白你的问题是什么。你要能把你的问题抽象清楚,其实不需要看这些源代码。因为人类社会其实还是有章可循的,它为什么那样做,其实你大概也能猜测到。它并不是凭空创造的东西。学习还是很容易的东西,学习比处理人际关系要简单太多了(笑)

胡帆:

  您曾经在京东任职,请问您能给我们当中想进入京东做数据挖掘的同学,提供一些职业技能方面的建议吗?

刘思喆:

  所有的算法都要会,能落地的工具语言也都要会,比如R、Python、Spark等都要用得很熟。京东是规模化用R比较早期的企业,所以你看,现在京东在职位招聘上还是会有这方面的要求,但还是那个问题,工具只是工具,你用Python,用R,只要能做出事情来就行,工具其实是次要的。

关于R和Python的安全机制

对于Python:

>>> x = [1,2,3,4]
>>> y = x
>>> x[0] = 100
>>> x
[100, 2, 3, 4]
>>> y
[100, 2, 3, 4]

但在R中:

> x <- c(1,2,3,4)
> y = x
> x[1] = 100
> x
[1] 100   2   3   4
> y
[1] 1 2 3 4

从效率上看Python显然更有优势,但从数据分析角度,这个特点会带来灾难

因此怎么发挥各自的优劣势,各位看官就仁者见仁智者见智了,这里不再做展开。

Permanent link http://bjt.name/2017/07/interview-xiamenJul 02, 2017