星期日, 一月 27, 2013

如何学习数据科学


本文翻译自一篇博客文章,作者是一名软件工程师,他描述了在五年时间内学习数据科学的经历和心得,他的学习途径包括了自学(书籍、博客、小项目),课程学习,教学讨论,会议交流和工作实践。

一、入门

1)自学(2 - 4个月)

自学是起步的关键。两年前,我和几个同事组成了一个研究小组,讨论统计202课程的学习材料。这让我感觉很兴奋,并由此开始数据分析的学习研究。研究小组有5名成员,但最后只有2个人选择去更深入地研究这个领域(数据科学并不适合每一个人)。

  • 学习基本的统计知识:统计202课程是非常合适的入门资料
  • 学习一种统计工具:作为一个菜鸟,我用了3个月的时间埋头学习R语言,R学起来非常有趣。(为什么要学习R?
  • 解决一些好玩的小问题:好奇心是数据科学的关键。如果你对国家的经济问题,犯罪统计,体育成绩等感兴趣的话,去收集数据并开始回答你的问题吧。
  • 学习Unix工具:我选择了O'Reilly出版的数据之魅作为学习材料。
  • 学习SQL和脚本语言:我了解的有Java,Ruby和SQL。 Python也在我的名单上。


星期日, 一月 20, 2013

那些奇葩的R函数


看别人的代码会遇到一些奇葩的函数,一般的教程上很少提到,但却有很好的用处,这类函数基本上分布在base以及utils包中,下面将它们略为归纳一下,以备后用。

1,文件执行:
在用R生成一个PDF文档后,如果想去打开它,你可能会在文件夹里找到再点开。再或者我们想调用系统中的其它程序来做点事情,可能要打开cmd敲点命令。实际上这都可以在R内部完成。举例来说用pandoc转换na.md成docx再打开它。
system('pandoc d:\\rspace\\na.md -o d:\\rspace\\na.docx')
shell.exec('d:\\rspace\\na.docx')

2,网络浏览:
browseURL:浏览某个指定的网页
download.file:下载网络文件到本地

3,文件操作
dir.create:新建一个文件夹
list.dirs:显示目录下的文件夹
list.files:显示目录下的文档
file.create:文档创建
file.exists:判断文档是否存在
file.remove:文档删除
file.rename:重命名
file.append:文档添加
file.copy:文档复制
file.symlink(from, to)
file.show:显示文档内容
file.info:显示文档信息
file.edit:编辑文档
zip: 压缩文件
unzip: 解压缩文件

4,运算进度条
在一个大循环运算时,如果可以看到目前的进度是比较方便的,txtProgressBar和setTxtProgressBar函数可以帮助做到这一点,下面是内置的一个小例子:

testit <- ...="..." function="function" p="p" x="sort(runif(20)),">{
    pb <- p="p" txtprogressbar="txtprogressbar">    for(i in c(0, x, 1)) {Sys.sleep(0.5); setTxtProgressBar(pb, i)}
    Sys.sleep(1)
    close(pb)
}
testit()

星期五, 一月 11, 2013

用XLConnect包操控Excel表格


作为一个R迷,为什么要去捣鼓XLS文件?其实这种需求场景很多的啦,比如其它部门的同事有批量的Excel文件要处理,或者家里一把手的直接命令。Excel里面已经有不少函数可以处理数据了,包括简单的矩阵运算以及透视表什么的,但归根到底它还是需要鼠标点来点去,伤手腕啊。为了保护右手我们要提倡用代码控制一切需要鼠标的动作。高级的Excel玩家可能会用VBA去做自动处理,更高明的玩家则跳出三界外,从外部来控制单位格数据的输入输出。

R语言中有很多包可以处理表格文档,包括最为通用的RODBC包,XLConnect包也是操控Excel文档的利器,功能很丰富。使用该包的前提是要安装好Java,还要在环境变量里搞好设置。之后就可以安装加载包了。我们可以将表格文档看做是数据输入和输出端,R则是中间的运算单元。二者主要是通过数据框格式和工作表单元格进行交换。下面来看将iris数据框写入和读取的示例(其实是翻译的官方文档)。

星期五, 一月 04, 2013

浅谈ROC曲线

机器学习中很常见的一个大类就是二元分类器。很多二元分类器会产生一个概率预测值,而非仅仅是0-1预测值。我们可以使用某个临界点(例如0.5),以划分哪些预测为1,哪些预测为0。得到二元预测值后,可以构建一个混淆矩阵来评价二元分类器的预测效果。所有的训练数据都会落入这个矩阵中,而对角线上的数字代表了预测正确的数目,即True Positive+True Nagetive。同时可以相应算出TPR(真正率或称为灵敏度)和TNR(真负率或称为特异度)。我们主观上希望这两个指标越大越好,但可惜二者是一个此消彼涨的关系。除了分类器的训练参数,临界点的选择,也会大大的影响TPR和TNR。有时可以根据具体问题和需要,来选择具体的临界点。


星期二, 一月 01, 2013

2012年的学习、工作和生活

在《英雄志》里面,沉毅木讷的伍定远一直到35岁才跳出公门、踏入江湖,由此获得一系列的奇遇、成长和体验,这番际遇让人感慨。既然2012的玛雅末日没有来,就将过去一年发生的事情在第200篇博文中简单梳理一下。

学习:

最初的博客只是一个粗糙的读书笔记,但仍得到了许多同好的鼓励。赞扬的力量是强大的,于是越发的用心,花了很多时间去读去写去钻研。学习的体会可以总结为四句笨办法:精选资料,反复阅读,归纳笔记,动手操练。2012年大体上钻研了四个方面:数据挖掘、R语言、Python、数据库和SQL。

数据挖掘的算法学了一些皮毛,也知道怎么使用R的一些包,但是还需练习更底层的实现。参加了Coursera的很多公开课,但只有Machine Learning算是拿到最后的成绩,其它的都没有时间跟完进度,所谓贪多嚼不烂。R方面的书已经看得不少了,代码也敲了一些,但其实还是有一些不理解的地方,还需要深入系统的总结,2013年应该会有更进一步的成果。Python断断续续玩了半年,目前还只能用它折腾点小东西,整体感觉很好玩,应该会坚持下去。SQL的话目前工作需要用到,处理速度的确很快,不过它的思维方式和R还真是很有一些不一样,不是太感冒。

五月份和十一月份分别参加了两次R会议,见到了神交已久的统计之都各位高手,也从他们那里学到了很多东西。六月份参加了Supstat办的统计夏令营,这是我第一次参加商业培训,有点小紧张,整体还算圆满顺利。这些会议中我发现很多人都是用LaTeX来做PPT,见贤思齐嘛,回头就买了本LaTeX学习大全,日夜操练。目前正式的成果就是用LaTeX帮老婆作了一份简历,应该可以震慑住一些HR吧。

工作:

写博客的收获不止是知识,还能认识很多朋友,并在职业道路上得到他们的支持和帮助。芒果的S君是最早给我博客好评的,很是鼓舞啊。三月份的时候到上海见到了他本人和同乡L君,聊了很多,也开始了解这一行业。

八月份时候便下定决心要离开所谓的“舒适生活圈”,进入数据江湖冒险。当时还在微博上发了一个贴,原文比较煽情:“早上醒来,如系统自检一样,我知道了我是谁,我从哪来,要到哪去,心情便沉了下去。我希望今后的人生历程变得不一样,所以我想换一份工作。能和数据有关,能用到R语言更好。”

通过微博和朋友们的帮助获得了一些面试机会,因为地域、经验、专业、能力等等原因,蛮多想去的地方都没能如愿。这个过程有困扰、有磨练,也有思考和提高。最后,机会大门还是给我留了一条缝,这样我最终得以从事数据挖掘和R有关的工作,也算是从一档起步了。

生活:

2012年生活中最大的变化就是结婚了,当年达尔文曾用17页纸写下了有关结婚的系统思考。因为结婚会带来收益:例如拥有终身伴侣,避免孤独。结婚也会有成本:放弃了一定程度上的自由。两个人的生活当然会比一个人来得复杂和琐碎,这样看来是否结婚也是可以定量计算的。在我计算很长时间之后,终于让我找到了最后的稳定解,没有留下白卷。

还是用2012读书收获的一句话来结束吧:“要让宿命的人生变得有趣,就尽可能地多走几条路;要让荒谬的人生变得有意义,就不妨细细地体味每一过程的悲欢痛快,结局如何也就无关紧要了。”对我来说,新一年的生活就好象鲁滨逊踏上荒岛,虽然手中只有一把板斧,心中也无所畏惧,因为我将由此获得一系列的奇遇、成长和体验。

2013我们一起进步!