Categories
日常应用

无知的比较:R和Teradata SQL(附赠TD经验几枚)

今年夏天的时候,刚刚开始被SQL虐,写了一篇很无知且更多是吐槽意味的blog post: 关于R的若干SQL等价问题。当时被若干朋友批评,我还浑然不觉个中精要。现在用Teradata也有半年多的时间了,越来越习惯了SQL的表述方式,也越来越体会到Teradata作为一个强大的数据仓库系统,是有多么的伟大...这感觉,就是只玩过几个G数据的乡下人进城,猛然看到各路英雄都是动辄几个T的数据,只能暂时以原来落后的思维方式、勉强挥舞着新型工具...好在个性不是特别愚钝,终究还是可以慢慢地领悟到T级数据的奥妙之处,终究用着新武器也越来越顺手了。

这一段时间,也充分证明了我是master in economics而绝对不是 in cs。数据库系统的原理终究学的不深——我哪儿知道MySQL的SQL和Teradata的SQL差了那么多呀...后来慢慢的去听同事传授TD使用经验,慢慢的去看老板传过来的代码,慢慢的一次次处理掉 no more spool space的错误和一次次接到SQL语句效率低强制退出的警告信之后,才逐渐地越来越了解TD的原理和脾气。工欲善其事,必先利其器,这些都是沉重的学费。

所以各位如果没有看过那篇「无知者无畏」状post的,就不要看了。直接接受我诚挚的道歉然后看下文吧。Teradata下简称TD。绝非专业知识,只是个人有限的了解,不对之处请及时批评。

有次跟同事聊,问他们为什么不在本机上装个TD测试用...然后被狠狠鄙视了一番——TD没有单机版!天生就是架在云上的。这东西还真是个原生的分布式数据仓库。

TD和oracle的关系也比较简单:一个是数据仓库,一个是数据库,功能设计什么的压根就不一样。这么说吧,oracle支撑的是ebay的网站运行,所以必然涉及大量的查询、插入、删除等请求。更麻烦的是,以ebay的访问量,这些请求都是同时过来的,这就要求系统并发性要好一点(专业人士可以绕道了,我只是浅薄的知道一点东西...)。体验过12306买火车票排队的大家,想必都知道这个系统并发起来的厉害。ebay若是也来个排队,消费者还不疯掉...

为了应对这样的任务,oracle的数据库设计自然是要按那「三大范式」来。这个就不多说了,再说就暴露了...

TD则是把oracle的数据定期地导出来存着,所以除了简单的复制数据之外,还要对数据进行一定程度的清理和整理,并不完全是最最原始的数据。然后到了食物链上端数据分析师手里,面对的数据很多都是已经弄的很整齐的了。说是食物链上端,只是因为这大概是分工中需要用到原始数据的最后一拨人,且这拨人用到的最多的就是查询(甚至是整表查询)和计算,所以我们写SQL的时候更多是考虑到这些需求,利用TD在这方面的性能优势——我已经很少在SAS或者R里面进行数据整理的工作了,性能跟TD完全不是一个量级的。

下面是TD使用的若干经验,不过这东西只有自己碰壁了才知道个中真滋味,我就是缩短一下解决问题的进程,不用太折腾到处搜来搜去。

No more spool space。当你的SQL没有语法错误,那么最常见的运行不下去的情况就是 no more spool space了,这大概是每个用TD的不管新鸟老鸟都会经历的痛苦历程。这个错误就像R里面报"cannot allocate a vector of size ***",或者你玩游戏正high的时候系统告诉你内存不足。解决的思路就是"空间换时间",就是看你具体怎么换了。

1. 多表join查询的时候,就要看这些表是怎么merge的——TD会去算是一大一小join,还是两个大表join。前者TD会复制小表到每个大表的"节点"上(大表肯定要分块存起来嘛),所以可以事先加collect statistics on *** column ***。后者就要费点脑子了,争取两个表的排序(PI)一致,这样TD join的时候就不需要对两个表都重新排列了是不是(merge join)?每一次重排都会占掉大量的临时空间呢。再者,查询结果储存到另外的永久或者临时表里面,就要注意primary index(简称PI)的选择,不要让TD再把查询结果重排...

2. 除了看primary index,有时候还要去注意partition by。有些已经建好的超级长的表需要去看是怎么真正"分块"存储的。对于partition by 的字段设定一个where条件,会让TD很快的知道你要查询和join的是哪些部分,大大缩短范围。一般说来,最常见的partition by就是时间了,缩短一个时间范围也不失为良策嘛。

3. 擅用cast()可以避免很多跟数据类型有关的错误,这个就不赘述了。

4. No space on ***说明没有永久表的存储空间了,这个就得去删过于古老的表和去要新的空间了。

5. 每段SQL不要太长,join不宜太多。熟悉TD的脾气之后,就张弛有度了,擅用临时表。

6. 多用group by少用distinct。

7. 最后终极野蛮办法,如果实在是没法两个大表join又没有partition by的话...手动按PI拆其中某个表吧。

----例行碎碎念----
那些在LinkedIn上endorse我R的朋友们,我真心感觉承受不起呀!至今依旧觉得我的R很烂,代码只停留在"可运行"的水平,效率大都很糟糕,基本就是折磨CPU的...哎,非科班出身终究是有莫大的差距呀。

Categories
读书有感

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

上海的冬天越来越冷了,这门课也越来越临近这学期结束了。这节课公式推导不多,有也是那种烂熟于胸无数次的,所以可以稍稍歪楼,不时掺杂一点八卦什么的。

BootStrap

1. 定义

BootStrap的基本思想就仨字:重抽样。先开始八卦~

跟高斯窥探天机猜出来正态分布的密度函数表达式相似,Efron搞出来BootStrap的时候,大概也在偷偷的抿嘴而笑吧。“上帝到底掷不掷骰子呢?”,每次我们都在揣测天意,也是现在越来越有点理解为什么牛顿老先生晚年致力于神学了。每当我们猜中一次,就会有一个新的突破到来。BootStrap思想简单到如斯,以至于我的一位朋友在当高中老师的时候(可惜是美国不是中国),就尝试着跟 teenagers 介绍BootStrap思想了(貌似用的还是Econometrica上的一篇文章,我瞬间声讨“你们这群高中老师真凶残-_-||)——结果显然是我多虑了,那群熊孩子居然表示理解毫无压力!可见BootStrap这个东西是有多么的平易近人。什么测度论什么高等代数都不需要,会摸球就可以了!

顺便抄一下杨灿童鞋《那些年,我们一起追的EB》上的一段八卦:

五十多年前,Efron为 Stanford 的一本幽默杂志 Chapparal 做主编。那年,他们恶搞 (parody) 了著名杂志Playboy。估计是恶搞得太给力了,还受到当时三藩的大主教的批评。幽默的力量使 Efron 在“错误”的道路上越走越远,差点就不回Stanford 读 PhD 了。借用前段时间冰岛外长的语录:“Efron 从事娱乐时尚界的工作,是科学界的一大损失!”在关键时刻,Efron在周围朋友的关心和支持下,终于回到 Stanford,开始把他的犀利与机智用在 statistics 上。告别了娱乐时尚界的 EB,从此研究成果犹如滔滔江水,连绵不绝,citation又如黄河泛滥,一发不可收拾...

所以说嘛,天才之人做什么都是能闪光的,Efron从事科学界的工作,怕也是美国几亿人民周末娱乐的损失吧。好了,满足了你们这群越来越挑剔的读者八卦的胃口了,开始正儿八经的说BootStrap。

我们有观测数据集,然后对这N个样本,进行有放回的重抽样。每轮我们还是抽N个,然后一共抽B轮(比如几百轮,话说前几天weibo上有人问“如果给你一万个人,你要做什么”,放在这里我就要他们不停的抽小球抽小球抽小球,哈哈!)。这样就得到了新的观测样本

2. 应用

BootStrap几乎可以用来干各种合法的不合法的事儿,只要是跟数据估计有关的...这就如同你问一个画家,“什么最好画?”“上帝和魔鬼,因为大家都没有见过。”大家都没有那么明确的知道BootStrap的界限在哪里,所以BootStrap就被应用在各种跟估计有关的地方了。

在统计学习中,我们最常用的可能就是估计精度:对于每一个,我们都可以得到一个预测函数,然后就对于给定的,有B个预测值,这样就可以做直方图什么的,还可以排排序算出来的置信区间。

最大似然估计(MLE)

我们有一族密度函数,其中为参数集,可不止一个参数。按照概率的定义,我们有,而且

数据方面,我们有一组数据,为\emph{i.i.d}(独立同分布)。

这样就可以写出来似然函数: ,从而可以写出来对数似然函数:。接下来驾轻就熟的,我们就有最大似然估计量:

最大似然估计之所以这么受欢迎,主要是他有一个非常好的性质:一致性,即当,估计值收敛于真值

仅仅渐进一致还不够,我们当然更喜欢的是MLE的附加优良性质:渐进正态,即,其中称为信息矩阵,定义为。实际中,如果我们不知道真值,则会用估计值来代替正态分布中的参数。(没想到事隔这么多年,我居然又手动推导了一遍MLE...真的是,我跟统计的缘分怎么这么纠缠不断呀)。

MLE大都要求数值解的,少数情况下可以求解解析解。比如正态分布。

正态分布的密度函数为:,所以我们有对数似然函数:

还有一个特例是正态线性回归模型(Gauss-Markov),即,其中,这个就和OLS的BLUE性质蛮像了,MLE和OLS对于此种情形估计值是完全一样的。所以说高斯王子在搞出OLS的时候,也是各种深思熟虑过的...揣测上帝的“旨意”也不是件信手拈来的事儿的。

简单情形下,我们可以直接求得估计量的置信区间,但是在复杂的情形下,就只能用BootStrap了。人们的思路就从传统的数学推倒,越来越多的转换到计算能力了。有的时候稍稍感觉这更符合统计学的思维——归纳嘛,这也是统计学在computer

area和数学渐行渐远的表现之一么?

吴老师总结了一句话:BootStrap类方法,就是思想简单、实际有效,虽然不知道为什么...

模型平均

模型平均也是有点延续上面的BootStrap思想,就是我有很多重抽样出来的模型之后,要怎么平均这些结果来找出最优模型的。

1. Bagging方法。 这个就有点直截了当了。利用BootStrap,我可以,然后自然收集了一堆,所以简单一点就平均一下:

2. Stacking方法。这个就稍稍动了一点心思,直接平均看起来好简单粗暴呀,还是加权平均一下比较细致一点。所以:,其中权重。实际操作中,的选取也是一个蛮tricky的事儿。可以利用validation集来优化...

3. Bumpping (优选)方法。,即在所有的中,选择最好的那个,使得一定标准下的损失最小。

话说,Machine learning或者统计学习,无非就是四件事儿:数据(D)、函数族()、准则()、算法(A)。说来说去,每一样改进都是在这四个的某一方面或者某几方面进行提升的。

Categories
读书有感

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

一个东西写到10,总会多少有点成就感...只是不知道已经磨掉了多少人的耐心了呢?

此外这节公式密集,大家看着办吧...

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

继续上一讲,先说说EM算法。

MM、EM和GMM

1. MM(混合模型)

(1) 定义:,其中,构成一个离散分布。同时有,且

(2) 隐变量

我们有数据,同时依据条件概率分布,有。记,则,其中

则有为x的边际分布。

(3) GMM(正态混合模型)

,我们有,且

(4) 对数似然函数和最大似然估计

对数似然函数写为。则我们要求的就是,其中

2. EM算法 (expectation maximum,期望最大方法)

(1) 迭代方法: 给定起始值,迭代出。那么问题就是,如何在已知的情况下,求

(2) E1步:求。函数形式已知,故可以求各种条件概率什么的。所以有:

E2步:计算,由于函数形式已知,我们可以计算并将移出来,所以换成线性形式。

(3) M步:求,这样就完成了迭代。需要证明的性质是:随着迭代,越来越大,且收敛。

(4) 定理:

证明:

其中,且,定义为两分布的KL距离。

所以,且。而由M步,,故有

在GMM的情况下,应用EM算法,则有:

(1) E1步:,可以直接计算。

(2) E2步:

(3) M步:注意有约束条件,所以使用拉格朗日乘子法:

,故有一阶条件:。从而,其中

还有一阶条件:,得到

最后,,有

对GMM而言,E步和M步在k=2的时候,求解过程可参见书上。

第七章:模型评估与选择

1. 概念: 我们有数据集,函数族和损失函数,这样得到最优的,然后求得

(有监督的学习)。之后就是对模型进行评估:的精度如何(使用测试集)?模型的选择就是的选择,使得测试误差比较小。

2. 方法:

(1) 数据充分:分成三块,1/2用来训练(train),1/4用来检验(validation),1/4用来测试(test)。其中validation

的概念是,在中,加入J函数来考虑函数族的复杂度,以避免过拟合。而validation就是来调正和选择这里的,再用train和validation重新训练模型。

最后,用test数据集,测试并且评估测试误差。

(2) 数据不充分:一种是cross-validation,分成k(比如5-10)份,极端的就是K=N,ave-win-out;另一种是bootstrap,后续章节详述。

Categories
互联网产业观察

新媒体营销中随机分组实验的失败

这个话题可以很深,我这里只是随便写写。当然我也不去定义什么是“新媒体”了...基本上下面可以视之为社交网络媒体。此文纯属若干无知的随便念叨,内行请无视。

记得原来在做社会实验的时候,最头疼的就是网络效应——这东西会让你的随机分组失效。如果网络扩散是均匀的也就罢了,这东西还不均匀,搞得随机分组基本上被破坏殆尽。今天和做社会网络营销这块儿同事聊起,发现他们在新媒体营销上也是遇到了类似的问题——传统的A/B test基本失效,因为control组会被极大程度的“污染”。和电视营销的地理隔离还不一样,社交网络是无孔不入的...

但是偏偏,我们还是希望可以利用这样的网络效应的——主动的传播岂不是更好?于是问题就变成了如何去精准衡量网络效应。

从我们以前的做法(可以参见我的硕士论文,in English),基本上是需要动用IV的...哎,然后这个IV还其难找无比。有些幸运的情况,IV是可以找到的,但是也需要一些外在的shock强行的打破现有的网络连接。

如果说要找一种比较简单的做法,那可能就是类似于spatial econometrics他们做的那样,对各个个体在空间中的位置进行加权。比如你要衡量微博营销的ROI,肯定要跟踪到实际覆盖的个体,然后在构造了网络结构的基础上,对个体的位置进行加权。但是讨厌的是,位置或者连接这些东西都是内生的...所以需要去找自然实验,然后去找工具变量...

总而言之,在我读过的为数不多的paper里面,可以很好的衡量网络效应的很少,而那些极少的还是控制了可控的资源的(比如实际的物品发放而不是新闻式传播)。感觉受新媒体的影响和冲击,很多传统的营销方式都在面临着极大的变化,做的好的往往不是分析人员算出来的而更多的是营销人员一步步摸索出来的...

所以,其实我想说的是,可能需要增加一些更好使用的指标来衡量新媒体营销的力量,而不是期待更好的分析方法的改进来支撑营销。后者还需时间来打磨(如果不是case by case的找IV的话)...

Categories
读书有感

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

眼瞅着这学期也快接近尾声了,也在讲我越来越不熟悉的东西了...

核平滑与局部方法

1. 核平滑器

(1) K-NN(K近邻)

KNN的思想已经说过很多遍了,大致就是找点x的k个近邻,然后取其平均值作为x点y的预测值。不过这里我们就在想了,可不可以加权呀~于是从最简单的,我们给他按距离算个加权平均:,其中代表权重,离x点越近越大,越远越小。这样听起来更make sense一点嘛~近朱者赤,近墨者黑。

(2) 单峰函数

顾名思义,就是长得像一个山峰的函数,比如我们最经典的正态钟型函数,或者翻过来的二次抛物线函数等等。

(3) 权重(按距离)

我们定义权重,再进一步归一化:

多维的情况下,写成矩阵形式就是,其中A为正定对角阵,然后我们就可以加权了。

2. 局部方法

(1) 一般概念

我们有数据集,然后定义函数族。再定义损失函数, 我们的目标就是最小化

相应的引入了加权的概念之后,我们就可以定义加权损失函数:,然后对于每个x做优化,寻找使其最小化的

(2) 具体例子

(i) 局部回归: ,则损失函数为,其中代表已经归一化的权重。

在线性的情况下,我们有,有点类似于我们常见的加权最小二乘法。这里的思想也是,在x点附近的点权重会比较大,离x远的权重则比较小,整体感觉就是在x点附近做了一个回归分析。

(ii) 局部似然:和局部回归蛮像的,只是把损失函数换成(对数)似然函数,即从最大化 到现在的最大化加权似然函数

3. 密度估计与分类

(1) 密度与分类: 我们有x和观测结果G的联合分布:,其中为先验的结果分布,在有K类结果的情况下,写成。这样,也可以写开为 其中

反过来,后验概率,所以我们有贝叶斯分类器

(2) 密度估计

为了使用贝叶斯分类器,我们需要先对密度进行估计。

(i) 直方图: 最简单的就是根据直方图来估计密度,这个没什么好说的...

(ii) 核估计方法(Parzen):Parzen提出的核密度估计为,该估计当在减小的时候,收敛于

4. 核作为基函数

密度函数,然后定义函数族,则其中我iyigexianxingde参数,为指定的函数类,亦为函数参数。这样的话我们有三个函数的参数,指定某一个便可以简化函数形式。不过这里的问题是,没有很好的算法来求解优化问题。比如对于正态分布,我们以写出来,然后的求解就比较复杂了。

上面的两个是非参数方法,下面说一些参数方法。

(iii) 混合模型(GMM, Gauss Mixed Model)

,其中参数有,然后可以利用最大似然准则,最大化,具体算法可用EM,下节课详述。

-----稍稍跑题------

GMM,我印象中它怎么是 Generalized Moment Method, 广义矩估计呢?果然是被计量经济学祸害太深了...