Categories
事儿关经济

我(对于统计方法)的一些偏见

Yihui写篇文章居然链到了我那篇吐槽文,瞬间亚历山大...我就是随便说说而已,一定要文责自负么?

其实我经常会有些自我的偏见在那里,而且有时候明明知道这些偏见的存在不好,还是很难说服自己改变它们。

比如,最深的偏见就是我对于计量经济学,我实在无法从根本上接受计量经济学属于经济学的这个事实...我对于它从统计观点出发搞的“因果推断”始终加上一个引号。

再比如,计量经济学内,我偏见最深的就是时间序列分析,我实在无法从根本上接受时间序列分析居然可以做因果推断,这东西更多的是预测的意味嘛,和机器学习的观点很像...

再再比如,机器学习各种模型中,我最不能接受的就是那些完全没有假设检验的...这东西至少也得能算个方差什么的才让人觉得靠谱些吧?

再再再比如,没有假设简单的那些机器学习模型中,我最最最最无法认同的就是最粗暴的把各种模型结果混合起来,用类似bootstrap的方法求得置信区间之类...这简直是就毫无办法之下的粗暴猜测嘛。

然后最后一个问题,施老师说,这个某种程度上反映了“群体智慧”。呃,好吧,就算每个模型都提取了一定的信息量,然后这么混合起来就是万灵药了?怎么听怎么像中药一锅煮的感觉,而不是西药那么配方分明...

其实我还讨厌的是“数据科学家”这个说法...努力的把science的帽子往自己脑袋上套,是大家都要遵循“科学发展观”的缘故么?就像我原来特别讨厌有人争论“经济学是硬科学还是软科学”一样,一定要沾上科学的边么?是为了好申请经费么?

如果科学,定义为消除我们对于世界的不确定性,那么无论是经济学还是统计学,不用争议多少,自然都是科学。如果科学,定义为探寻事物发展的因果规律,那么怕不是建立在演绎法逻辑之上的方法,都算不上科学了。我想说的只是,定义可能并不重要,如果定义是狭隘的,那么必然排除了一些有用的方法;如果定义是广阔的,那么必然包容了一些没用的方法。这东西又不是非黑即白的...

我只能说,科学在我这里的定义相对狭隘,宁缺勿滥,所以我的偏见有这么多...偏见越多,观点越偏颇,经常有过两年自己都不知道自己当年为什么那么幼稚和狭隘的感觉。所以大家一来请见谅落园文章的局限性,二来欢迎帮我突破局限性,用鲜明的观点和生动的例子来说服我——不仅仅是一些口头上关于定义之类的争论。

------------

照例跑题:确实如yihui所说,我的blog文章太多了,找起来难免不方便。尤其是对于不是常年订阅的读者来说。所以我决定对自己的blog主题动动手术了,瀑布流什么的最近蛮流行的,挺好的打算学习一下。

Categories
事儿关经济

安逸的富二代

听着听着音乐,突然间想起一个人,索性捉起笔来,描绘一番。

想说的这个人是我曾经的一个客户,那还是那个上海温暖的象夏天的秋天,也是那个出差跑到陕北冰冻的象冬天的秋天。那是第一次去到陕西榆林的客户那里,第一次自然什么都不顺利,客户基本不怎么搭理我们,一副给你们个机会来办公室喝杯热茶就不错了的姿态。那个时候,可谓见识透了做市场的人的嘴脸变化之快,小心翼翼的陪着笑脸,生怕自己说错了什么被人拿住当作了把柄。事后,还在那里费尽心思的揣摩客户的心思,不知道为什么上午的太阳说变就变成了下午的阴云。天晓得那个时候对我的心理是一种多么大的折磨和考验,职场的水深自那时开始体会...我们那时的客户都是国企,里面明争暗斗派系不断,搞不好就是人为刀俎我为鱼肉,搞不好人家来笑嘻嘻的啃了你都不知道...

只是在那众多的客户中,有那么一个不同寻常的客户。他第一次见我们,特别不友好,是那种放在表面上的不友好。我心里一悸,不知道会不会下一秒就被毫不客气的扫地出门了,心里顿时生出了若干委屈,而奇怪的是那是我居然控制住了内心的万千波澜,还在那里堆满了笑容小心翼翼的询问着一些不得不问的问题。

估且称呼这个客户为度总吧。度总年纪不大,又是技术部门的领导,自然充满了技术范儿。度总是榆林当地人,西北汉子的性格爽朗的很,在这么一个不知道隔壁是不是就藏着暗箭的地儿,也是直来直去的,喜欢就是喜欢,不喜欢就是不喜欢,不加掩饰。也是这一点,让我后来越来越好生感激—其实很多时候这些部门的领导也是只能奉上面领导的指示行事的,有的时候跟你山路十八弯也只是一些不能做的事儿,绕来绕去的,害得我们只能不断的猜度,好生费力。度总则不会跟你浪费时间,说什么就是什么,爽快的很。

隔了一段时间,再去榆林,又见度总。这次上面大概是点头了,所以一路下来我们就只是操作一些具体事务。这个时候度总难得的,坐下来跟我们讨论技术的东西(我一直觉得做咨询尤其是纯乙方,两分技术,八分耐心与人交流),这些相比于人情那些我自然更熟络一些,所以聊起来倒也敞快。度总也是个数码玩具迷,当时正巧背着一个kindle还有一个ipad去了,就跟他相互鼓捣了好久这些玩意儿。还给我拷贝了一些音乐,这也是为什么突然听到这些音乐想起他来的缘故。

后来听说,度总开了一辆非常好的车来上班,大概仅次于他们老总。这显然不会是单位配的。联想到榆林那地儿暴发户甚多(煤炭发家),我们就揣测度总家里怕也是殷实的很。大致的人生轨迹无外乎是,上学,然后毕业家里找点关系塞进国企,舒舒服服的做个闲差头头,舒舒服服的过着小日子,买个几千块的耳机发发烧或者空运几罐普洱解解渴之类。一个三十出头的技术领导,低调而文艺的很~

这种富二代的人生,让人几乎无可指责和羡慕什么。极度的安逸,与世无争。可以喜欢什么玩弄什么,不喜欢就不理会,不用象我们乙方这样天塌下来也得陪着笑(这也是我为什么一度要离开乙方做甲方的推动力)。关键是,你不会觉得他无知,他傲气,你可以感受到他有自己喜欢的东西,只是不用像我们这样需要努力的养活自己而已。但不见得他不能养活自己,搞不好真正做起东西来比我们都要强得多。只是不需要吧。有种大隐隐于市的脱俗感。

不知道,若干年后有没有机会再去品品他沏的那壶温热的普洱,在那个寒冷的秋天唯一让我感到有所温存的普洱。在那个弱肉强食明枪暗箭的环境中,唯一让我敢放下心来细细品品茶的味道的普洱。

Categories
Uncategorized 事儿关经济

R会议小记

今年的R会又热热闹闹的开了两天,一切进行的还算顺利,没有大的波折。大家玩的很开心,各种旧友重逢相见恨晚按下不表。只说几点我的体会:

1. 数据挖掘越来越热,却越来越觉得泡沫。今年R会议创纪录的收到了接近500人报名,实际到场领取材料350人。会场一直有人需要站着听,这是以前没有的。R这两年越来越热,说明业界的需求上来了,用R的人越来越多毕业了,进入企业了。然而听了很多演讲,却没有感觉有让人“惊喜”。大家在重复的炒有限的东西。不见新意。

2. 工具越来越热,只能说明用的人越来越多,而不见得是用法越来越聪明。大数据热的一塌糊涂,大家关注的却只是怎么能实现计算,而少有从根本思想的角度提出创造性的方法的。这让人不免觉得疲惫。

3. 林大师兄说的有句话让我印象深刻——用复杂的方法解决复杂的问题那是做研究,用简单的方法解决复杂的问题是在业界。一路看来,被业界认可的方法,大都是simple and elegant的,只可惜翻来覆去就那些,看久了就审美疲劳了。

4. 大多数分析只能说是typical的完成任务,有灵性的分析不多。张翔的“短文本分类实践”在这个意义下,是可圈可点的有灵性的分析之一。在现有的算法上,如何聪明的排列组合优化改造,这不仅仅考验的是分析者对于模型的理解,更多是对于业务需求的洞见。再好的模型,也得多少按需定制一下,否则总让人觉得空洞无物。

5. 机器学习是小聪明而不是大智慧。我这么说坐等被骂,不过确实是思喆大哥的一句点评醍醐灌顶——机器学习的人从来不关心假设检验,尤其是对于分布的假设。反正计算机可以算,那么就去算好了。很多算法直觉上过得去,就可以了。我总感觉这东西,要么大家玩够了破灭一下,要么有人从头建造一些夯实的基础,真正繁荣。现在还是一个初生牛犊的混沌阶段吧。比较好的应用,除了google发起的那几类,大概也很难有本质上的突破了。

6. 业界是 short sighted,这个不用多说了。

7. 我对整个数据分析的行业未来持负面预测。有泡沫的感觉。可是,明明自己还在混这口饭吃...不过至少这口饭还能吃个十年二十年吧,不怕不怕。

8. 以前总觉得建模什么的最重要,最刺激,最有成就感。现在感觉,其实很多时候解决问题的能力大家都有,而发现问题却不是每个人都擅长。也劝最近打算从学校里面出来的朋友们,不要一上来就跟招人的企业说“我希望做统计建模”blablabla...其实有的时候那些fancy的模型提高的可能只是最后的5%,而为此牺牲的效率有可能有着更高的成本。至少我现在,有点越来越问题导向了。还有,其实很多时候,在学校里大家对于模型的理解还都是很肤浅的,纸上谈兵的。其实自己根本把握不住那些东西。最近好多次深深感觉,我以前觉得自己熟练把握的很多模型都不见得可以迅速的应用到实际的业务场景中去。在不断的跟同事、老板、partner讨论的过程中,才是真正的去深入的理解那些模型的过程。所以,一句聊以自勉的话:还是从简单的做起吧。

几乎没说几句好话,见谅。好玩的东西就是那么多,天天玩天天看不免觉得疲惫。不过平心而论(与我的工作单位无关),eBay对于数据的理解和应用整体水平绝对是行业前列的。能把一个数据分析的大问题break down到若干几乎独立的小问题,这就说明整体的框架已经成熟并足以支撑业务了。这样的情况下,作为个人可能接触的好玩的事情会越来越少,因为几乎相似背景的人都可以很快的胜任日常的工作(这也是我对大企业最佩服的一方面,分工确实细致,有利于提高整体效率),另一方面也是学习如何化整为零的好去处。每个人都有自己想要的人生,都会选择适合自己的地方。只是这一次很多人一致评价,觉得我来了eBay之后更快乐了——这怕是最好的褒奖了吧。

----对于未来R会议的期许-----

我们号称要做“学术会议里面最文艺的,文艺里面最学术的”,那么总要多多的有些有灵性的分析。R语言基础培训可以淡出R会议的舞台了。

此外,力争联系更多的大牛~要有学术会议范儿嘛 ^_^

Categories
事儿关经济

中文文本聚类小尝试(Text Clustering in R)

众所周知的,我会经常百无聊赖的玩一些比较好玩的东西。比如画画旅行地图啦,恶搞一下COS的版猪啦,抓抓新浪围脖啦。这不R大会又要开始了么,有一点点小数据也要玩玩啦。比如,呃,君不见周六上午三场演讲都是文本挖掘的,那我不研究一下文本挖掘怎么去混演讲听啊~自己动手先。

A nearby galaxy cluster about 65 million light years from Earth.
文本挖掘自然也有有个情景嘛。这不正好会议要排日程表嘛,那得把我们16个讲座分成四个半天,每天大约4场。这个应该怎么分呢?从直觉上来说,听众肯定是希望相关的话题放在相邻的时间,这样他们就可以选择自己感兴趣的时间段去听啦,不用在那里一坐两天。同时也便于之后的集中讨论嘛。于是这个目的就是:根据演讲的题目、摘要和关键字,进行聚类。这显然是一个无监督的学习嘛,我又没有一个特定的结果变量。

那么首先,自然是要对中文文本进行分词啦。这个嘛就可以偷个懒,直接用现成的R包rmmseg4j。(中间鼓捣若干编码问题,不赘述...)

然后就是聚类。这里继续偷懒,调用现成的文本处理包tm,可以直接生成文本词对应的矩阵。比如,一个编号为1的句子是 “我 在 中国”,编号为2的句子是“我 爱 中国” 那么生成的矩阵就是:

句子 我 在 中国 爱

1 1 1 1 0

2 1 0 1 1

就是说,把每个词都作为一个变量,然后统计它在每个句子出现的次数作为变量值。这样一来,如果总共有10个句子,有不重复的100个词,那么就会给出一个10×100的矩阵了。

有了这个矩阵之后,我们就相当于知道了每个个体的观测特征,那么就可以聚类了。比较简单的,可以直接算余弦相似度(比如google识别相似新闻的做法);也可以调用kmeans聚类。这里我们的摘要直接不会有特别多的相似,所以余弦相似度的区分度可能会不好。那么就先试试kmeans吧。

到这里,代码如下:

#读数据
library(xlsx)

presentations <- read.xlsx("r-presentations.xlsx", sheetName="Sheet1") #读excel数据

summary(presentations)

presentations$Title <- as.character(presentations$Title) #转文本

Encoding(presentations$Title) <- "UTF-8" #转换编码

presentations$Title

presentations$Abstract <- as.character(presentations$Abstract)

Encoding(presentations$Abstract) <- "UTF-8"

presentations$Abstract

presentations$KeyWords <- as.character(presentations$KeyWords)

Encoding(presentations$KeyWords) <- "UTF-8"

#分词

library("rmmseg4j")

presentations$raw_word <-with(presentations,paste0(KeyWords,Abstract, sep=";")) #连接所有标题、摘要、关键字

presentations$raw_word <- with(presentations, str_replace_all(raw_word, "R","")) #去掉r

presentations$seg <- mmseg4j(presentations$raw_word) #分词

#kmeans聚类

library("tm")

presebtation_seg <- Corpus(DataframeSource(presentations[,c("Title","seg")])) #转换到tm专用格式

presebtation_term <- TermDocumentMatrix(presebtation_seg, control = list(stopwords = TRUE)) #生成词频矩阵

presebtation_term <- t(as.matrix(presebtation_term)) #转换为matrix并转置

summary(presebtation_term)

presebtation_kmeans <- kmeans(presebtation_term, 7) #kmeans聚为7类

为什么我会在kmeans里面聚成7类呢?理论上只是要聚4类嘛。可是直接聚四类的话,区分度没那么好,一半多的演讲都聚到一类去了,没法安排嘛~所以只能增加聚类的个数,看看到时候再把小类合并。

聚成7类的结果如下:

Title cluster_result
R语言在eBay搜索引擎反馈与测试中的应用 1
营销分析模型及其在广告界的应用 2
系统生物学和转换医学中的R语言 + R in Systems Biology and Translational Medicine 3
R/Bioconductor在生物多维组学数据整合中的应用 3
R Case Study from EBAY APD 4
网络用户浏览路径分析 4
啤酒与尿布的当代版--商品分析在电子商务中的应用 4
基于RHadoop的关联规则挖掘 5
模型预测的利器——随机森林 5
基于R的地理信息系统 (R-based GIS) 6
R语言和其他计算机语言的混合编程 6
ggplot和knitr包简介 6
R与面向对象统计分析 6
twitteR包入门和应用 6
短文本分类器与电商品类数据挖掘 7
R语言环境下的文本挖掘 7

比较理想的是,聚类之后识别出来了两个文本挖掘的演讲...还有一堆R包的演讲。但是还是没法安排演讲嘛。看到这里,大家有没有发现,这样做最大的问题就是,聚类的时候把一些没有实际意义的虚词也聚类进来了,比如“的”;还有一些几乎所有演讲都会涉及的词,比如“R”和“分析”。这些词在其中是没有意义的,也会影响我们算dissimilarity的结果——这到底是按内容聚类啊,还是按作者的行文风格聚类啊?此外,虽然我们规定演讲摘要大都在100-200字,但还是有长有短,到目前我还没有对文本的出现频率用语句长度来加权...这也是不科学的嘛。那些原来在Google搜搜里面排名作弊的,不就是同样的内容复制10几次,来提高关键词出现频数(而不是频率)嘛。

为了解决这些问题,首先就是要去掉没有意义的虚词。这个不算太麻烦,把一些常用的虚词和转折词连接词之类去掉就可以了。其次,要去掉每个演讲都有的词。这里虽然可以一个个去看,不过简单一点,我们先统计一下词频嘛:

#高频词统计

presentations$seg2 <- unique((strsplit(presentations$seg,split=" "))) #断词

all_key_words <- iconv(unlist(presentations$seg2), from="UTF-8", to="GBK") #转换到GBK编码

all_key_words_fre <- as.data.frame(table(all_key_words)) #统计词频

names(all_key_words_fre)

all_key_words_fre <- arrange(all_key_words_fre,desc(Freq)) #按词频排序

all_key_words_fre[1:20,]$all_key_words #100个高频词

然后看一下TOP 20高频词:

1 的 105

2 数据 27

3 分析 24

4 和 21

5 图 18

6 在 17

7 挖掘 15

8 用户 15

9 应用 14

10 分类 13

11 了 13

12 语言 13

13 介绍 11

14 是 11

15 文本 11

16 试验 10

17 平台 9

18 ebay 9

19 案例 8

20 模型 8

所以看来,“挖掘”,“用户”,“文本”,“试验”,“平台”,“ebay”,“案例”,“模型”等等还是比较有区分度的词。按照这个思路,选择有限的几十个词重新分类,效果可能会有所改善。

此外,鉴于样本量不大(16个),所以可以人工的去看每个简介,手动标注tag作为聚类的变量。事实上,最后我还是这么做了一下,来在上述原始聚类结果上进行了一下重新的分组处理,形成了4大类。但是这个东西也不完全是可以直接用的,总要考虑时间之类的其他因素。最终的结果更多是人工思考的排序,估计李舰哥在确定顺序的时候更多的是按照经验和以往R会议的风俗。算法虽然好玩,但毕竟捕捉的还是人的思维模式,暂时没办法完美的取代吧。不过其实也差的不远呢。

最终人工结果:

冯兴东:R语言和其他计算机语言的混合编程

刘思喆:R语言环境下的文本挖掘

张翔:短文本分类器与电商品类数据挖掘

沈羽、周春英:R语言在eBay搜索引擎反馈与测试中的应用

周扬:基于R的地理信息系统

肖凯:twitteR包入门和应用

陈钢:系统生物学和转换医学中的R语言

杭兴宜:R / Bioconductor在生物多维组学数据整合中的应用

陈逸波:基于RHadoop的关联规则挖掘

李忠:R Case Study from EBAY APD

洪健飞:啤酒与尿布的当代版——商品分析在电子商务中的应用

廖明:营销分析模型及其在广告界的应用

肖嘉敏:网络用户浏览路径分析

刘成昊:模型预测的利器——随机森林

王雨晨:R与面向对象统计分析

魏太云:R基础作图与可重复研究

纯属好玩而已~不过R会议也举行了整整五届了,每次15个演讲的话也有15*9=135个演讲了。在这个样本量下,如果我们要出个论文集什么的,倒是可以直接用聚类的办法划分chapter了...嘻嘻。

Categories
事儿关经济

R并行做大数据时间序列分析与bootstrap

好久没写关于经济学的文章了...今天看到两个搞matching的人拿到诺奖,瞬间想起当年和一个学心理学出身的童鞋一起搞的考虑到心理学因素的matching game...可惜最后没有时间完善,就放在那里当雏形了。我们的idea应该还是蛮有新意的呢~matching需要设计机制,然后用博弈来解,哎,很好玩的...

很多人都知道我是不搞时间序列分析的,尤其不喜欢基于时间序列的因果推断(格兰杰因果检验几乎是被我打入黑名单的一个词)。但这次为什么专门写这么一篇blog post呢?其实,我不反对时间序列作预测嘛~而google这篇paper,目的在于预测,又是latex排版的(搞不好还有sweave或者knitr的功劳),读起来赏心悦目的多。

这篇paper题目是:

Large-Scale Parallel Statistical Forecasting Computations in R

地址见:http://research.google.com/pubs/pub37483.html

亮点自然是:大数据计算、map reduce、时间序列分析、bootstrap (所以说google是一家让人尊敬的公司,http://t.cn/zlbAYJY这里总结了他将学术成果悄无声息的服务于大众的案例)。虽说大半夜的,但看到这个东西,再也睡不着了,索性写完一吐为快。(那次沙龙还说到来着,看吧,google早把这些好玩的东西都搞定了,只是不公开拿出来给大家用罢了~)

1. 并行算法

并行算法这里,主要是map reduce。他们的任务主要有:

  • Facilitate parallelism of computations on up to thousands of machines without access to shared NFS filesystems(上千个节点的并行计算,无共享的NFS文件系统).
  • Make distribution of code and required resources as seamless as possible for analysts to minimize code modifications required to enable parallelism.(无缝衔接各环节,减少分析师写并行算法工作量)
  • No setup or pre-installation of R or specific libraries should be required on the machines in the cluster. A virtual machine for the workers should be created dynamically based on the global environment and available libraries of the caller(节点上无需事先安装R,虚拟机会自动按需构建).
  • Return results of parallel computations in list form directly back to the calling interactive session, as with lapply in R.(lapply函数直接返回并行结果)
  • Allow the parallel functions to be used recursively, so that MapReduce workers can in turn spawn additional MapReduces.(并行函数可以循环调用)

系统构架如下:

2013-12-09 16_48_39-37483.pdf - Adobe Reader

然后若干技术细节还包括,搞定R函数复制和计算的环境并行同步,搞定data.frame和list存储格式与在map函数中直接调用。搞定后,基本底层就搭建好了,剩下的就是调用R了。

2.时间序列预测

最典型的就是google trend的预测了...

2013-12-09 16_49_18-37483.pdf - Adobe Reader

这里他们直接用R包googleparallelism,然后希望用一些时序模型都尝试,做预测,然后取他们的均值(剔除上下总计20%)作为估计值以减少误差。示意图如下:

2013-12-09 16_49_35-37483.pdf - Adobe Reader
我只能说,果然是做机器学习的人啊,和random forest思路一致,弱的分类器结合起来,可能有意想不到的结果。同样的,每个模型都是多少有效的话,平均一下就更稳健啦,尤其是在大数据支撑下...

这样的平均之后已经无法直接推导方差和置信区间,所以他们采取了更依赖机器计算的bootstrap方法,直接强行算出来置信区间...喵的,我只能说谁让当年高斯那群天才整出来大数定律和中心极限定理呢?推不出来估量量方差不要紧嘛,直接重抽样模拟就好了...汗。

3.训练集

果然是做机器学习的人,接下来的思路就是直接一期期训练模拟呗。这个没啥说的了,见下图。

2013-12-09 16_49_51-37483.pdf - Adobe Reader

模拟出来的结果示意图:

2013-12-09 16_50_05-37483.pdf - Adobe Reader

至此,整个问题解决完毕。细节还请大家直接去看原文paper。我的几点感触吧:

  • 1. 机器学习之所以在业界这么受欢迎,主要是其确实能够解决问题。迅速、有效,这个是其他方法比不上的。
  • 2. 大数据、大规模计算,使得一些很简单的idea借助模拟和重抽样方法,大放异彩。
  • 3. 预测,有时候不比因果推断次要。
  • 4. 传统模型,需要适应大数据。
  • 5. 说到底,理论体系还是有待完善的。希望这类方法是下一个微积分,可以先用,然后慢慢补充完相应理论体系。这样,我们才知道什么时候,需要勒贝格测度来取代原有牛顿积分。

总之,虽然无奈,但是有用之物必有有用的道理。期待对理论研究的冲击和激发。