Categories
事儿关经济

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

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

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

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

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

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

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

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

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

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

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

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

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

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
读书有感

≪统计学习精要(The Elements of Statistical Learning)≫课堂笔记(四)

照例继续本周笔记。这次我没啥废话了...

--------------笔记开始---------------

投影矩阵与消灭矩阵

首先是上次没证的若干OLS性质。基本都是公式。我就照抄原来econometrics做的笔记了。权当复习了...对计量有兴趣的、线性代数还不错的,建议去看《Microeconometrics- Methods and Applications》(?A. Colin Cameron / Pravin K. Trivedi )。

先定义两个矩阵,这两个矩阵会在某种程度上save your life while learning econometrics...投影矩阵和消灭矩阵。

复习一下,OLS估计量是 ,然后对应的Y估计量是。所以,我们定义投影矩阵P为,这样就有了。也就是说,我们对Y进行了一次投影,然后得到了一个估计值。当然定义投影矩阵并不仅仅是写起来比那堆X简单,而是投影矩阵本身有着一系列良好的性质。

我们先来看把P投在X上会怎么样。显然,,也就是说P不会改变X的值(本来就是把一个东西投到X上嘛~自己投自己怎么会有变化的嘛)。

然后呢,对P进行转置,则,所以接下来

再定义消灭矩阵M。很简单,我们定义M为,其中I为单位阵(对角线元素为1,其他为0)。这样M又有什么性质呢?显然,也就是说M对Y的效果是得到误差项。而与此同时,M对于X的作用就是,所以称为消灭矩阵嘛。继续,进行转置,则,所以我们还有

OLS估计值的方差

再次友情提醒,X不是随机变量,所以不要跟我纠结为什么没有条件期望公式之类的东西...

扰动项服从时,或者大样本下,OLS估计量的方差为:

这里为样本方差,所以其分布为: 。这样一来,就有了一个t检验:

大样本下,就直接用正态检验好了。此外,如果我们进一步的有更多的同时检验的约束条件,那就是联合检验F。这个就不赘述了...

高斯-马尔可夫定理

顺便还证了一下高斯-马尔可夫定理...这个不像OLS,每次我可记不住他的证明,每次都是现翻书...

我就直接抄wiki了。

选择另外一个线性估计量,然后C可以写为 ,则D为k*n的非空矩阵。

那么这个估计量的期望是 :

所以,为了保证 无偏,则必有 .

继续求方差:

是一个半正定矩阵,肯定要比大~得证。

变量选择与收缩方法

为了降低测试误差(减少函数的复杂度),有时候会放弃无偏性而进行变量选择。这里首先就是Ridge OLS(岭回归)。还是算一下这个东西好了。

岭回归就是对估计量另外加一个约束条件,所以很自然的想到拉格朗日乘子法。ridge regression的目标函数为,

可以重写为

这样我们就得到两个一阶条件:

,所以有:

这里还可以看出,的取值都是对应的。

Lasso则是把改成,已经没有解析解了...

至于为什么叫收缩方法,可以将X进行奇异值分解,然后可以得出的方差将变小...我就不写证明了,感觉这一块儿讲的也不是很透彻。

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
读书有感

≪统计学习精要(The Elements of Statistical Learning)≫课堂笔记(三)

照例文章第一段跑题,先附上个段子(转载的哦~):

I hate CS people. They don't know linear algebra but want to teach projective geometry. They don't know any probability but want to use graphical models. They don't understand stats at all but still do machine learning like crazy.

喵,最近被问了好几次machine learning 和statistical learning的区别在哪里,我觉得大致如上吧。这也是为什么,对后面这个词我的好感稍稍好于前面那个的原因...科学总是有意义的嘛,不能总是依靠强力乱猜是不是嘛。

免责声明:以下个人见解部分局限于我个人的见识和思考范围,不适用于所有场景。请大家弃糟粕取精华,不可一言全信之。

-------------笔记+随想开始------------

高维空间问题

这一段主要是说大名鼎鼎的"维数灾难"。我们都知道有两个数字决定着OLS中X矩阵的大小,这就是 观测数目N 和观测变量的个数p 。一般说来,我们都喜欢N比较大,这样可以很容易的应用大数定律什么的。然而对于p,却是既爱又恨—我们当然喜欢可以观察到个体的很多个特征,但是所谓"乱花渐欲迷人眼",特征越多噪音也越多,搞不好预测的时候就会有麻烦(关于变量的选择问题,应该是下一节课的内容。心急的可以先看看我以前的一篇自学笔记)。

为什么维数增多的时候会麻烦呢?这里主要是随着维数增多带来的高维空间数据稀疏化问题。简单地说:

  • p=1,则单位球(简化为正值的情况)变为一条[0,1]之间的直线。如果我们有N个点,则在均匀分布的情况下,两点之间的距离为1/N。其实平均分布和完全随机分布的两两点之间平均距离这个概念大致是等价的,大家可稍微想象一下这个过程。
  • p=2,单位球则是边长为1的正方形,如果还是只有N个点 ,则两点之间的平均距离为。换言之,如果我们还想维持两点之间平均距离为1/N,那么则需个点。
  • 以此类题,在p维空间,N个点两两之间的平均距离为,或者需要个点来维持1/N的平均距离。

由此可见,高维空间使得数据变得更加稀疏。这里有一个重要的定理:N个点在p为单位球内随机分布,则随着p的增大,这些点会越来越远离单位球的中心,转而往外缘分散。这个定理源于各点距单位球中心距离的中间值计算公式:

时,。(很显然,当N变大时,这个距离趋近于0。直观的理解就是,想象我们有一堆气体分子,p变大使得空间变大,所以这些分子开始远离彼此;而N变大意味着有更多气体分子进来,所以两两之间难免更挤一些。看过《三体》的,大概会觉得这个很熟悉的感觉吧...四维空间下的"水滴"再也不完美的无懈可击,而一张一维的纸片就毁灭了整个地球呢。)

这个距离公式的推导就暂时不写了,好麻烦...大致是利用了各个点独立同分布的特性(完全随机情况下),把median距离变为以1/2概率大于中位数的概率集合公式,再进一步展开为单点距离累乘公式。

比如当p=10, N=500的时候,约为0.52,也就意味着有一半多的点离中心的距离大于1/2。

高维问题为什么是问题呢?回顾一下K近邻算法,我们用x的邻居来代替x,这样就希望他的邻居们不要离他太远。显然高维空间使得点和点之间越来越远。所以说,knn更适合小p大N即低维多观测量的情况,而在高维空间下可能会变得很麻烦。

这样,statistical learning的主要两个问题就总结完了:

  • 过拟合:为了控制预测误差,我们要选择适合的函数类。
  • 高维空间:随着维数的增多,我们面临着维数灾难。这对很多算法都有波及,主要体现在高维数据稀疏化。

回归的线性方法

这里主要是一些linear regression的东西,作为被计量经济学折磨了这么多年的孩子,我表示很淡定...此外还加上我们俗称的generalized linear models,即GLM。一些线性变换而已,无伤大雅。

这里一定要强调的是,在这里我们亲爱的X居然不是随机变量!多大的一个坑啊,我就华丽丽的掉下去了还问老师为什么无偏性不需要假设均值独立什么的... X不是随机变量意味着什么呢?X是人为设定或者决定的,比如我一天浇200 ml 或者500 ml水,然后看对于植物生长的影响。当时我真的是想"一口老血喷出来",这也太舒服了吧!要知道大多数情况下X也是随机变量哇,比如身高体重什么的。如果它不是随机变量而只有扰动项是独立的随机变量的话,整个计量经济学怕是要删掉好多篇幅了呢。我想说的只有,这群搞statistical learning的好幸福...

X不是随机变量的时候,为了满足无偏性的假设,只需要扰动项不相关且期望方差存在就可以了。期望不为0不要紧,回归的时候放进去常数项就可以了。

此外,对于任意一个正定阵W,我们都可以直接在回归方程两边乘以W,从而。也就是说,我们可以给X进行加权处理,加权矩阵W之后可以进行新的OLS估计,且可能会有对应的优良性质。加权最小二乘法我就不在这里复习了,学过计量的应该很熟悉,比如处理异方差什么的。

再就是我们可以给加上一些约束条件,这样的话最小化问题后面就可以简单的使用拉格朗日乘子法来解。

这次的收获之一就是OLS估计量的计算。在实践中,我们计算OLS估计值并不是直接使用,而是会事先进行QR分解(利用特征值来算)。即,我们把X分解为化为正交(酉)矩阵Q与实(复)上三角矩阵R的乘积。这样一来,

这样可解,计算时候的稳定性比直接求逆矩阵来的好很多,因为计算机必竟有数字长度的限制,各种位数带来的精度损耗最后会累积到估计量上。

最后就是高斯-马尔科夫定理,就是我们常说的BLUE估计量。我就直接拷贝这个定理了:

在误差零均值,同方差,且互不相关的线性回归模型中,回归系数的最佳无偏线性估计(BLUE)就是最小方差估计。一般而言,任何回归系数的线性组合的最佳无偏线性估计就是它的最小方差估计。在这个线性回归模型中,误差既不需要假定正态分布,也不需要假定独立(但是需要不相关这个更弱的条件),还不需要假定同分布

进一步的,如果假设扰动项服从正态分布,比如白噪声,那么的估计值也服从正态分布,y的预测值也服从正态分布,因此可以直接做一系列基于正态分布的假设检验。特别的,在大样本情况下,就算扰动项不是正态分布,我们也还是可以利用大数定律和中心极限定理...事实上一般也是这么做的。

本节课到此结束。老师没有一一推导无偏性最小方差这些性质,我倒是觉得对回归方法感兴趣的还是直接去看计量经济学吧。这东西水还是蛮深的。