最优化之路

转直:http://www.cnblogs.com/joneswood/


进入算法研发部,在大致了解部门的项目构成,主要职责之后,我意识到最优化算法在各个项目组中都具有重要的作用,例如CTR预估、排序等。然而,由于自己在读博期间除了“逻辑回归”以外,没有系统参与过涉及最优化的项目,因此在还没有分配到具体任务的情况下,首先自发地对最优化算法的发展历程进行了调研。心得体会如下:

最优化领域中的方法虽然“多如牛毛”,但是总体上还是沿着一条“主线”发展的。这里按照时间顺序对这条“最优化之路”进行简要介绍:

1.1 最速下降法(梯度法):

即以负梯度方向作为目标函数极小化方法的下降方向。首先将目标函数进行泰勒展开:

clip_image002

clip_image004:代表第k个点的自变量(向量);

clip_image006:单位方向(向量),即|d|=1;

clip_image008:步长(实数);

clip_image010:目标函数在Xk这一点的梯度(导数向量);

clip_image012:α的高阶无穷小。

式[1]中的高阶无穷小可以忽略,因此,要使[1]式取得最小值,应使clip_image014取到最小,由此可得,clip_image006[1]clip_image016时,目标函数下降得最快,这就是负梯度方向作为“最速下降”方向的由来。

1.2 牛顿法:

最速下降法只用到了目标函数的一阶导数信息,而牛顿法则用到了二阶导数信息。在clip_image004[1]点处对目标函数进行泰勒展开,并只取二阶导数及其之前的几项(忽略更高阶的导数项),可得:

clip_image018

clip_image010[1]:目标函数在clip_image004[2]这一点的梯度;

clip_image020:目标函数在clip_image004[3]这一点的Hessian矩阵(二阶导数矩阵)。

由于极小值点必然是驻点,而驻点是一阶导数为0的点,所以,对 r(X) 这个函数来说,要取到极小值,应该分析其一阶导数。对X求一阶导数,并令其等于0:

clip_image022

因此,下一点的计算方法:clip_image004[4]在方向d上按步长1(1×d = d)移动到点X,方向d的计算方法:

clip_image024

牛顿法的基本步骤:每一步迭代过程中,通过解线性方程组得到搜索方向,然后将自变量移动到下一个点,然后再计算是否符合收敛条件,不符合的话就一直按这个策略(解方程组→得到搜索方向→移动点→检验收敛条件)继续下去。由于牛顿法利用了目标函数的二阶导数信息,其收敛速度为二阶收敛,因此它比最速下降法要快,但是其对一般问题不是整体收敛的,只有当初始点充分接近极小点时,才有很好的收敛性。

1.3 共轭方向法:

最速下降法和牛顿法对前后两次迭代的方向并没有特别的相关要求,而共轭方向法则要求新的搜索方向与前面所有的搜索方向是共轭的。也就是说,这些搜索方向向量是满足以下共轭条件的:

clip_image026

其中,m≠n,dm和dn分别为两个向量(搜索方向),G为对称正定矩阵。共轭方向法只利用了目标函数的一阶导数(梯度)信息,不用计算Hessian矩阵,使得其计算量比牛顿法小很多。在每一步迭代的过程中,可以利用“Powell共轭方向集”方法构造两两共轭的方向。在共轭方向法中,新搜索方向的确定,需要满足“下降”条件,即方向与梯度之积<0:

clip_image028

但是,并不是意味着目标函数值下降量越大,这个方向就越可取。在Powell算法的修正策略中,有一种方法通过放弃目标函数值下降最大的方向而更好地避免了各方向的线性相关。共轭方向法的过程可以总结为:选定搜索方向d,使之满足共轭条件以及下降条件,在此搜索方向上通过精确线性搜索确定移动的步长,然后将当前点移动到下一点,再重新选定搜索方向,周而复始,直到满足终止条件。 共轭方向法的收敛速度比最速下降法快,比牛顿法慢。

1.4 共轭梯度法:

“共轭梯度法”是一种特殊的“共轭方向法”。共轭方向法与梯度的关系是——共轭方向法利用了目标函数的梯度信息(梯度与方向的积满足“下降”条件)。共轭梯度法与此关系有所区别:用当前点的负梯度方向,与前面的搜索方向进行共轭化,以得到新的搜索方向。在推导共轭梯度法的搜索方向的公式之前,我们先假定目标函数是二次函数:

clip_image030

其中G为n阶对称正定矩阵。X为自变量(n维向量)。

[2]式的函数的梯度(即一阶导数)为:

clip_image032

现在,假设初始点为X0。在每一个迭代点处,新的搜索方向都是用前面的搜索方向与当前点的负梯度方向共轭化得到的。在初始点X0处,并没有“前面的搜索方向”,因此,初始点处的搜索方向d0简单地定为负梯度方向:

clip_image034

上面的式子中,将目标函数在X0点的梯度g(X0)写为g0,同理,g(X1)也记为g1,等等。

第二个迭代到的点为X1,它与X0满足关系:

clip_image036

这表明,点X1是在d0方向上,由X0点移动一定的距离得到的。移动的步长α0,则是通过精确线搜索的方法计算得到的,X1是一个极小值点,在点X1处,目标函数的一阶导数为零,即:

clip_image038

所以一阶导数再乘以d0仍然为零:

clip_image040

从共轭梯度法的定义——新的搜索方向是用前面的搜索方向与当前点的负梯度方向共轭化得到的——来看,d1与d0(前面的搜索方向)有关,也与-g1(当前点的负梯度方向)有关,因此,假定d1是-g1与d0的线性组合:

clip_image042

其中,r0是一个实数。此外,由于每一个搜索方向与前面的搜索方向都是共轭的,因此,d1与d0还要满足共轭条件:

clip_image044

计算r0的值:

clip_image046

首先,在同一点处,搜索方向与梯度的点积:

clip_image048

可以看出,在同一点处,搜索方向与梯度的点积等于负梯度与梯度的点积。

其次,在某一点处的梯度与前面所有的梯度的点积:

clip_image050

点X2,X3,……均为极小值点,因此,在这些点处,目标函数的梯度为零,即g(Xk)=0,因此[14],[15]式均为零,得到:

clip_image052

又可以看出,在某一点处的梯度与前面所有梯度的点积为零。

由上面的特例的计算,可以总结出一些规律并用这些规律来得到通用的结论。假设对所有的搜索方向和梯度,有如下规律:

clip_image054

即同一点处的搜索方向与梯度的点积等于该点处的负梯度与梯度的点积,某一点处的梯度与前面所有搜索方向的点积为0,某一点处的梯度与前面所有梯度的点积为0,某一点处的搜索方向与前面所有搜索方向共轭。

设方向d的通用的表达式为:

clip_image056

该式表示的含义是:当前点的搜索方向是当前点的负梯度方向与前面所有方向的线性组合。前文所述的方向d1,也是这样假设之后再求出来的。[22]式的左边是一个方向向量,在共轭梯度法中,要保证某一点的搜索方向与前面所有搜索方向是G共轭的,因此,在[22]式两边均左乘一个式子,形成“G共轭”的表达式:

clip_image058

例如,当m=4时,[22]式就是用来求d4的,此时:

clip_image060

对n所取的任何值,在[24]式的求和式∑中,除最后一项外,其余所有项的值均为0——这是因为任何一个方向与前面所有方向都是G共轭的(参看G共轭的定义)。所以现在可以写出[24]式的结果了:

clip_image062

完全可以用rn来代替[25]式中的r的表达式:

clip_image064

[29]式就是r的计算方法。

共轭梯度法同样会有与共轭方向法类似的问题:经过n步迭代之后,产生的新方向不再有共轭性。所以在实际运用中,也有很多修正方向的策略。其中一种策略是:经过n步迭代之后,取负梯度方向作为新的方向。共轭梯度法比最速下降法的收敛性要好得多。

1.5 拟牛顿(Quasi-Newton)法:

拟牛顿法是一种“模拟”的牛顿法,具体来说模拟的是牛顿法中搜索方向的生成方式。牛顿法中,在每一次要得到新的搜索方向的时候,都需要计算Hessian矩阵(二阶导数矩阵)。在自变量维数非常大的时候,这个计算工作是非常耗时的,因此,拟牛顿法的诞生的意义就是:它采用了一定的方法来构造与Hessian矩阵相似的正定矩阵,而这个构造方法计算量比牛顿法小。

1.5.1 DFP算法

假设目标函数可以用二次函数进行近似(实际上很多函数可以用二次函数很好地近似):

clip_image066

忽略高阶无穷小部分,只看前面3项,其中A为目标函数的Hessian矩阵。此式等号两边对X求导,可得:

clip_image068

于是,当 X=Xi 时,将[2]式两边均左乘Ai+1-1,有:

clip_image070

上式左右两边近似相等,但如果我们把它换成等号,并且用另一个矩阵H来代替上式中的A-1,则得到:

clip_image072

方程[4]就是拟牛顿方程,其中的矩阵H,就是Hessian矩阵的逆矩阵的一个近似矩阵.在迭代过程中生成的矩阵序列H0,H1,H2,……中,每一个矩阵Hi+1,都是由前一个矩阵Hi修正得到的。DFP算法的修正方法如下,设:

clip_image074

再设:

clip_image076

其中,m和n均为实数,v和w均为N维向量。将[6]代入[5]式,再将[5]式代入[4]式,可得:

clip_image078

得到的m,n,v,w值如下:

clip_image080

将[8]~[11]代入[6]式,然后再将[6]代入[5]式,就得到了Hessian矩阵的逆矩阵的近似阵H的计算方法:

clip_image082

通过上述描述,DFP算法的流程大致如下:

已知初始正定矩阵H0,从一个初始点开始(迭代),用式子 clip_image084 来计算出下一个搜索方向,并在该方向上求出可使目标函数极小化的步长α,然后用这个步长,将当前点挪到下一个点上,并检测是否达到了程序终止的条件,如果没有达到,则用上面所说的[13]式的方法计算出下一个修正矩阵H,并计算下一个搜索方向……周而复始,直到达到程序终止条件。

值得注意的是,矩阵H正定是使目标函数值下降的条件,所以,它保持正定性很重要。可以证明,矩阵H保持正定的充分必要条件是:

clip_image086

在迭代过程中,这个条件也是容易满足的。

1.5.2 BFGS算法

BFGS算法和DFP算法有些相似,但是形式上更加复杂一些。BFGS算法目前仍然被认为是最好的拟牛顿算法。BFGS算法中矩阵H的计算公式如下所示:

clip_image088

在[14]式中的最后一项(蓝色部分)就是BFGS比DFP多出来的部分,其中w是一个n×1的向量。

在目标函数为二次型时,无论是DFP还是BFGS——也就是说,无论[14]式中有没有最后一项——它们均可以使矩阵H在n步之内收敛于A-1

BFGS算法有一个变种,叫作“Limited-memory BFGS”,简称“L-BFGS”。使用L-BFGS算法来编写程序时,它会比BFGS算法占用的内存小。

另外,还有“面向象限”的OWLQN算法(Orthant-Wise Limited-memory Quai-Newton),这里不再赘述。

posted @ 2012-03-11 19:21 吴军 阅读(955) 评论(1) 编辑

回归模型评估

1. 拟合优度

1.1 Pearsonclip_image002检验

协变类型描述的是模型中协变量不同值的特定组合,对于一个含有分类自变量的模型来说,数据所含的协变类型的数目由每个分类自变量的情况所决定。

构造clip_image002[1]统计量:clip_image004,其中j=1,2,…,J,J是协变类型的种类数目。Oj和Ej分别为第j类协变类型中的观测频数和预测频数。clip_image002[2]的自由度是协变类型数目与参数数目之差。clip_image002[3]统计量很小意味着预测值与观测值之间没有显著差别,表示模型很好地拟合了数据,clip_image002[4]统计量为0时表示模型与数据两者完全吻合;与此相反,若clip_image002[5]统计量很大,拟合不佳。(当拟合不好时,可以用残差和其他诊断测量来描述每个自变量对模型拟合的影响,以便寻找模型不合理的原因。)

注:只适合于自变量是分类类型的情况,若模型中自变量有连续数值类型,需要事先进行离散化处理。

1.2 偏差检验

clip_image006作为设定模型所估计的最大似然值,概括了样本数据由这一模型所拟合的程度。但是这一统计量不能独立于样本规模,因此不能仅根据它的值来估计模型的拟合优度。对于同一套数据我们还必须有一个基准模型作为比较所设模型拟合优度的标准。一种基准模型为“饱和模型”,它可以完美地预测观测值。饱和模型的最大似然值为clip_image008(=1)。偏差D的公式为:

clip_image010

偏差越小,模型的似然概率值越大,拟合优度越好。

注:当在建立模型中涉及连续自变量时,偏差和皮尔森clip_image002[6]不适合用来检验模型拟合优度,因为这时有些协变量(即连续性自变量)有过多的不同值,导致大量的协变类型存在,从而使得许多协变类型只有很少的观测案例。因此,若要用这两种方法进行模型拟合优度检验,须事先对连续自变量进行离散化处理。

1.3 Hosmer-Lemeshow检验

这种检验首先将观测数据按照预测概率做升序排列,然后根据预测概率值将数据分为大致相同的n(eg. n=10)个组,而不管模型中有多少协变类型。第一组包括估计概率最小的那些观察案例,而最后一组包括估计概率最大的那些观测案例。Hosmer-Lemeshow(HL)指标是一种类似于pearson clip_image002[7]统计量的指标,公式如下:

clip_image012

其中,clip_image014表示第g组样本的观测数量,clip_image016表示第g组样本的预测数量(clip_image018),clip_image020为第g组的案例数,clip_image022为第g组的平均预测概率。

该统计量符合自由度为(n-2)的clip_image002[8]分布。和clip_image002[9]检验类似,HL统计量很小意味着预测值与观测值之间没有显著差别,表示模型很好地拟合了数据;统计量为0时表示模型与数据两者完全吻合;与此相反,若统计量很大,拟合不佳。

1.4 信息测量指标

Akaike’s Information Criterion (AIC)

AIC的定义如下所示:

clip_image024

其中,K为模型中自变量的数目;S为因变量类别总数减1(对于logistic回归有S=2-1=1);n是观测数量,clip_image026是所设模型的估计最大似然值的对数。当模型中的参数数量越大时,似然值也就越大,-2clip_image026[1]的值就会变得很小,因此,将2(K+S)加到AIC公示的分子中抵消参数数量产生的影响。由于观测数也会影响似然值,因此公式中通过除以n来取得每一观测对于-2clip_image026[2]的贡献。在其他条件不变的情况下,较小的AIC值表示拟合模型较好,AIC指标还常常用于比较不同样本的模型。

Schwarz准则 (SC)

SC指标是对AIC的一种修正,这一指标根据自变量数目和观测数量对-2clip_image026[3]值进行另外一种调整。其定义为:

clip_image028

其中ln(n)是观测数量的自然对数。这一指标只能用于比较对同一数据所设的不同模型。在其它条件相同时,一个模型的SC值越小说明模型拟合越好。

Bayesian Information Criterion (BIC)

定义如下:

clip_image030

d.f.s为模型的自由度,它等于样本规模与模型估计系数数目之差(即d.f.s=n-K-1);ln(n)为样本规模总数的自然对数。BIC具有绝对值更大的负值的模型更好。

2. 预测准确性

2.1 clip_image032指标

线性回归中的clip_image032[1]有一种十分诱人的解释特性,即它描述因变量的变动中由模型的自变量所“解释”的百分比。但是,在逻辑回归分析中却没有相应的统计指标。不过,在模型似然值对数的基础上,可以为logistic回归模型计算某种类似clip_image032[2]的指标。

似然比指数(LRI, Likelihood Ratio Index):

clip_image035,其中LL0为零模型(截距模型)的最大似然值对数。

与R2类似,LRI的值域是0至1,当自变量与因变量完全不相关时(即所有的回归系数为0时),LRI=0。当模型的拟合程度提高时,LRI值增加。拟合得越好,LRI值越接近1。只有当模型“完全”拟合数据时,LRI值达到1。在实际应用中,LRI的只可能非常接近1,但不会等于1。

广义线性模型判定系数:

clip_image037,其中clip_image039clip_image041分别表示所设模型与零假设模型各自的似然值,n为样本规模。这种一般定义对于线性模型能够得到经典的R2指标,但对于逻辑回归,这样定义的最大值R2的最大值却小于1。这一最大值可以通过下列公式计算:clip_image043

Logistic回归的调整类判定系数:

clip_image045,这种调整的类判定系数可以得到最大值为1。

2.2 排序相关系数(Rank Correlation Coefficient, RCC)

RCC有多种度量,这里选用Spearman排序相关系数进行度量。Spearman排序相关系数是用来衡量两个变量之间统计相关性的非参数度量。它用来评估利用一个单调函数是否能够很好地描述两个变量之间的关系。Spearman相关系数的值在-1和+1之间,这两个值代表了“完美”Spearman相关,表示其中每一个变量都是其他一个变量的完美单调函数。

Spearman相关系数被定义为“排序变量之间的Pearson相关系数”。对于n个样本,设其预测分数为Xi,观察分数为Yi,将原始分数转坏为排序数据xi,yi(比如Xi按照升序排序,其对应的Yi也按升序排序),则Spearman相关系数ρ如下式所示:

clip_image047

遇到相等预测值的情况,做如下处理:

Variable clip_image048

Position in the descending order

Rank clip_image049

0.8

5

5

1.2

4

clip_image051

1.2

3

clip_image051[1]

2.3

2

2

18

1

1

Spearman系数的一个更加简单的计算方法:

clip_image053,其中,di=xi-yi是预测变量的值与观测变量的值之间的差异。

举例:

clip_image048[1]

clip_image054

rankclip_image049[1]

rankclip_image055

clip_image056

clip_image057

86

0

1

1

0

0

97

20

2

6

−4

16

99

28

3

8

−5

25

100

27

4

7

−3

9

101

50

5

10

−5

25

103

29

6

9

−3

9

106

7

7

3

4

16

110

17

8

5

3

9

112

6

9

2

7

49

113

12

10

4

6

36

clip_image058

3. 模型clip_image060统计

为了对logistic回归模型进行有意义的解释,要求模型中所包含的自变量必须对因变量有显著的解释能力。也就是说所设模型必须要比零假设模型(即指包含常数项的模型)要好。在多元线性回归及ANOVA模型中,常用自由度分别为K和n-K-1的F检验(其中K为自变量个数,n为样本规模)来检验“除常数项外所有系数都等于0”的无关假设。而在logistic回归中,服务于同一目的的检验却是“似然比检验”(Likelihood Ratio Test),它可以用来检验logistic回归模型是否统计性显著。似然比统计量近似地服从于clip_image061分布。

所谓模型clip_image061[1]定义为零假设模型与所设模型在clip_image063上的差距。模型clip_image061[2]的自由度为零假设模型自由度与所设模型自由度之间的差,即回归系数个数。实际上,模型clip_image061[3]与多元线性回归中的F检验十分类似。模型clip_image061[4]作为一种clip_image061[5]统计量来检验零假设:“除常数项外的所有系数都等于0”。通常表示为:clip_image065。如果模型clip_image061[6]的统计量显著,便拒绝零假设,认为自变量所提供的信息有助于更好地预测事件是否发生。似然比统计量公式如下:

clip_image067

必须强调,模型clip_image061[7]值不是关于模型对数据拟合优度的检验,而只是关于自变量是否与所研究事件的对数发生比(log odds)线性相关的检验。按照理想情况,最好是模型clip_image061[8]统计性显著而拟合优度统计性不显著,但是,我们有时发现,模型clip_image061[9]和拟和指标都是显著的,尤其是在大样本的情况下,这种矛盾现象可能出现。这种现象说明模型并不能很好地拟合数据,另一方面又说明自变量对因变量能够进行很好地解释。两种指标同样重要,如果模型clip_image061[10]统计性不显著或拟合优度(尤其是HL指标)统计性显著,那么这个模型应该重新设定。

分类模型评估

1. 混淆矩阵(Confusion Matrix)

clip_image069

1. 正确预测到的负例的数量, True Negative(TN,0->0)

2. 负例预测成正例的数量, False Positive(FP, 0->1)

3. 正例预测成负例的数量, False Negative(FN, 1->0)

4. 正确预测到的正例的数量, True Positive(TP, 1->1)

混淆矩阵是大多数分类性能评估指标的基础。

2. 由混淆矩阵派生出的评估标准

2.1 准确率

准确(分类)率=正确预测的正负例数/总数

Accuracy=(TP+TN)/(TP+TN+FP+FN)

2.2 误分类率

误分类率=错误预测的正负例数/总数

Error Rate=(FP+FN)/(TP+TN+FP+FN)

2.3 (正例)覆盖率

正例覆盖率=正确预测到的正例数/实际正例总数

Recall (TPR, Sensitivity) =TP/(TP+FN)

2.4 (正例)命中率

正例命中率=正确预测到的正例数/预测正例总数

Precision (Positive Predicted Value, PV+) =TP/(TP+FP)

2.5 (负例)覆盖率

负例覆盖率=正确预测到的负例数/实际负例总数

Specificity(TNR) =TN/(FP+TN)

2.6 (负例)命中率

负例命中率=正确预测到的负例数/预测负例总数

PV- (Positive Predicted Value) =TN/(TN+FN)

2.7 F1度量

clip_image071,F1值是Recall和Precision的调和平均数。

2.8 Lift(提升指数)

clip_image073,该指标衡量的是,与不利用模型相比,模型的预测能力“变好”了多少。不利用模型,我们只能利用“正例的比例是TP+FN/TN+FP+FN+TP”这个样本信息来估计正例的比例(baseline model),而利用模型之后,我们不需要从整个样本中挑选正例,只需要从我们预测为正例的那个样本的子集(TP+FP)中挑选正例,这时预测的准确率为TP/TP+FP。显然,lift(提升指数)越大,模型的运行效果越好。如果这个模型的预测能力跟baseline model一样,那么TP/TP+FP就等于TP+FN/TN+FP+FN+TP(lift等于1),这个模型就没有任何“提升”了。

2.9 ROC (Receiver Operating Characteristic Curve)

ROC曲线就是不同的阈值下,以下两个变量的组合:

Sensitivity(覆盖率,True Positive Rate)

1-Specificity (Specificity, 负例的覆盖率,True Negative Rate)

clip_image075

上图那条曲线就是ROC曲线,横轴是1-Specificity,纵轴是Sensitivity。随着阈值的减小,Sensitivity和1-Specificity也相应增加(也即Specificity相应减少),所以ROC呈递增态势。那条45度线是作为参照(baseline model)出现的,就是说,ROC的好坏,是跟45度线相比的。在不使用模型的情况下,Sensitivity和1-Specificity之比恒等于1,这就是45度线的来历。一个模型要有所提升,首先就应该比这个baseline表现要好。ROC曲线就是来评估模型比baseline好坏的一个著名图例。

在最好的情况下,Sensitivity为1(正确预测到的正例就刚好等于实际的正例总数),同时Specificity为1(正确预测到的负例个数就刚好等于实际的负例数),在上图中,就是左上方的点(0,1)。因此,ROC曲线越往左上方靠拢,Sensitivity和Specificity就越大,模型的预测效果就越好。

2.10 AUC (Area Under ROC Curve)

ROC曲线是根据与45度线的偏离来判断模型好坏。图示的好处是直观,不足就是不够精确。到底好在哪里,好了多少?这就要涉及另一个评估指标,AUC(Area Under the ROC Curve,ROC曲线下的面积)。AUC也只是ROC的一个派生而已。

对于ROC曲线,45度线下的面积是0.5。ROC曲线与它偏离越大,ROC曲线就越向左上方靠拢,它下面的面积(AUC)也就应该越大。我们就可以根据AUC的值与0.5相比,来评估一个分类模型的预测效果。关于AUC的计算有多种方法,本平台中采用的方法如下:

clip_image077

设正例样本数为M,负例样本数为N,样本数n=M+N。首先对score从大到小排序,然后令最大score对应的sample的rank为n,第二大score对应的sample的rank为n-1,以此类推。然后计算clip_image079,得到的就是所有样本中有多少正例样本的score大于负例样本的score,最后除以M×N。需要特别注意的地方是,在存在score相等的情况时,需要赋予相同的rank值,具体操作是把所有这些score相同的样本的rank取平均。

2.11 多类AUC

前节所述AUC指标适用于二元分类情况,为了适应多类分类模型的性能评估,在二类AUC的基础上扩展出了“多类AUC”:

clip_image081

其中,c为类别个数。clip_image083为类别(i,j)情况下的AUC值。

posted @ 2012-03-06 00:11 吴军 阅读(329) 评论(0) 编辑

       皮尔森相关系数(Pearson correlation coefficient),也称皮尔森积矩相关系数(Pearson product-moment correlation coefficient) ,是一种线性相关系数。皮尔森相关系数是用来反映两个变量线性相关程度的统计量。相关系数用r表示,r的绝对值越大,表明相关性越强。
       两变项间的相关可以用许多统计值来测量,最常用的是皮尔森相关系数。Pearson r 的取值在-1与+1之间,若r>0,表明两个变量是正相关,即一个变量的值越大,另一个变量的值也会越大;若r<0,表明两个变量是负相关,即一个变量的值越大另一个变量的值反而会越小。r 的绝对值越大表明相关性越强,要注意的是这里并不存在因果关系。若r=0,表明两个变量间不是线性相关,但有可能是其他方式的相关(比如曲线方式)。
  利用样本相关系数推断总体中两个变量是否相关,可以用t 统计量对总体相关系数为0的原假设进行检验。若t 检验显著,则拒绝原假设,即两个变量是线性相关的;若t 检验不显著,则不能拒绝原假设,即两个变量不是线性相关的。

posted @ 2012-03-04 23:16 吴军 阅读(1063) 评论(0) 编辑

1.      什么是Treelink

      Treelink是阿里集团内部的叫法,其学术上的名称是GBDT(Gradient Boosting Decision Tree,梯度提升决策树)。GBDT是“模型组合+决策树”相关算法的两个基本形式中的一个,另外一个是随机森林(Random Forest),相较于GBDT要简单一些。

1.1    决策树

      应用最广的分类算法之一,模型学习的结果是一棵决策树,这棵决策树可以被表示成多个if-else的规则。决策树实际上是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间一分为二,比如说下面的决策树:

这样使得每一个叶子节点都是在空间中的一个不相交的区域。学习得到如上这棵决策树之后,当输入一个待分类的样本实例进行决策的时候,我们就可以根据这个样本的两个特征(x, y)的取值来把这个样本划分到某一个叶子节点,得到分类结果了,这就是决策树模型的分类过程,决策树的学习算法有ID3算法和C4.5算法等。

1.2    Boosting方法

Boosting是关于模型组合的一种思想(另一种重要的思想是Bagging)。Boosting算法总是一个迭代的过程,每一次新的训练都是为了改进上一次的结果。原始Boosting算法是在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。在每一步训练中得到的模型,会使得数据点的估计有对有错,因此,在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就是被赋上一个很高的权重。那么,在进行了M次迭代之后,将会得到M个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。Boosting过程如图所示:

图中绿色的线表示目前取得的模型(由前m次得到的模型组合而成),虚线表示当前这次basic learner。每次分类的时候,模型会更关注分错的数据。图中红色和蓝色的点代表数据,点越大表示权重越高,当m=150的时候,获取的模型已经几乎能够将红色和蓝色的点区分开了。Boosting也可以用下面的公式来表示:

式中YM(X)为学习得到的最终模型。总之,Boosting算法的最大特点就是:“知错就改”!

1.3    Gradient Boosting

      Gradient Boosting是一种Boosting的方法,其与传统的Boosting的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boosting中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少,与传统Boosting对正确、错误样本进行加权有着很大的区别。

1.4    Treelink模型

      Treelink不像决策树模型那样仅由一棵决策树构成,而是由多棵决策树构成,通常都是上百棵树,而且每棵树规模都较小(即树的深度会比较浅)。模型预测的时候,对于输入的一个样本实例,首先会赋予一个初值,然后会遍历每一棵决策树,每棵树都会对预测值进行调整修正,最后得到预测的结果:

F0是设置的初值, Ti是一棵一棵的决策树。对于不同的问题(回归问题或者分类问题)以及选择不同的损失函数,初值的设定是不同的。比如回归问题并且选择高斯损失函数,那么这个初值就是训练样本的目标的均值。

Treelink自然包含了boosting的思想:将一系列弱分类器组合起来,构成一个强分类器。它不要求每棵树学到太多的东西,每颗树都学一点点知识,然后将这些学到的知识累加起来构成一个强大的模型。

Treelink模型的学习过程,就是多颗决策树的构建过程。在树的构建过程中,最重要的就是寻找分裂点(某个特征的某个取值)。在Treelink算法我们通过损失函数的减小程度用来衡量特征分裂点的样本区分能力,Loss减小得越多,分裂点就越好。即以某个分裂点划分,把样本分成两部分,使得分裂后样本的损失函数值减小的最多。

Treelink训练:
1.估算初值;

2.按如下方式创建M棵树:

–更新全部样本估计值;

–随机选取一个样本子集;

–按如下方式创建J个叶子;

•对当前所有叶子

–更新估计值、计算梯度、最优划分点、最优增长量以及增益(损失函数减少量);

–选择增益最大的叶子及其划分点,进行分裂,同时分裂样本子集;

–将增长量刷新到叶子;

Treelink预测:

将目标估计值赋估值;

•对M棵树:

–根据输入数据的特征(x),按照决策树的路径查找到叶子节点;

–用叶子节点上的增长量更新目标估计值;

•输出结果;

例如,GBDT得到了三棵决策树,一个样本点在预测的时候,也会掉入3个叶子节点上,其增益分别为(假设为3分类的问题):

(0.5, 0.8, 0.1),  (0.2, 0.6, 0.3),  (0.4, 0.3, 0.3),

那么这样最终得到的分类为第二个,因为选择分类2的决策树是最多的。

2.      Treelink二元分类性能测试

2.1 实验目的及数据准备

      利用成交情况历史数据,通过treelink预测某个卖家的成交情况,即是否有成交,转化为二元分类问题。

数据格式: target feature1 feature2 … feature13,其中target只有两个值:0代表无成交,1代表有成交,0代表没有成交,每个sample由13个feature进行描述。在样本数据中,正例(target=1)样本数为23285,负例样本数为20430,比率为1.14:1。所有样本数据被分到训练集和测试集两个集合:训练集包括33715个样本,测试集包括10000个样本。

2.2 模型参数设置

      测试环境利用MLLib 1.2.0工具包中的Treelink模块进行,主要工作是在训练过程中根据损失函数的下降趋势和预测准确率对treelink的各项参数进行调节,最终找到一个最优的参数组合。涉及到的配置文件包括:

mllib.conf:

[data]

filter=0

sparse=0

weighted=0

[model]

cross_validation=0

evaluation_type=3

variable_importance_analysis=1

cfile_name=

model_name=treelink

log_file=日志文件保存路径

model_file=模型文件保存路径

param_file=treelink配置文件保存路径

data_file=样本数据文件保存路径

result_file=分类结果文件保存路径

 

treelink.conf:

[treelink]

tree_count=500

max_leaf_count=4

max_tree_depth=4

loss_type=logistic

shrinkage=0.15

sample_rate=0.66

variable_sample_rate=0.8

split_balance=0

min_leaf_sample_count=5

discrete_separator_type=leave_one_out

fast_train=0

tree_count:决策树的个数,越大学习越充分,但太大也会造成过度拟合,而且也消耗训练和预测的时间。可以先选择比较大的树个数,然后观察训练过程中的损失减少趋势,损失减少比较平缓时,树个数就比较合适了。tree_count和shrinkage也有关系,shrinkage越大,学习越快,需要的树越少。
shrinkage:步长,代表学习的速度,越小表示学习越保守(慢),越大则表示学习越冒进(快)。通常可以把Shrinkage设小一点,把树的个数设大一点。
sample_rate:样本采样率,为了构造具有不同倾向性的模型,需要使用样本的子集来进行训练,过多的样本会造成更多的过拟合和局部极小问题。这个采样的比例一般选择50%-70%比较合适。
variable_sample_rate:特征采样率,是指从样本的所有特征中选取部分的特征来学习,而不使用全部特征。当发现训练出来的模型,某一两个特征非常强势,重要性很大,而造成其他特征基本学不到的时候,可以考虑设置一下把这个参数设置成<1的数。

loss_type:设置该参数的时候要格外注意,务必要使优化目标与损失函数保持一致,否则损失函数在训练过程中不但不减小,反而会增大。

其他参数的详细含义可以参见mlllib user manual。

2.3 实验结果

本次试验利用Lift,F_1和AUC三个指标对treelink模型的分类性能进行评估。

Lift:该指标衡量的是与不利用模型相比,模型的“预测”能力变好了多少。模型的lift(提升指数)越大,模型的运行效果更好。Lift=1表示模型没有任何提升。

F_1:是覆盖率与准确率的综合指标,随着precision和coverage的同时增大而增大,公式如下: 

AUC:Area Under ROC Curve,其值等于ROC曲线下的面积,介于0.5到1之间。较大的AUC代表了较好的performance。关于AUC的计算有多种方法,本实验中采用的方法如下: 

设正例样本数为M,负例样本数为N,样本数n=M+N。首先对score从大到小排序,然后令最大score对应的sample的rank为n,第二大score对应的sample的rank为n-1,以此类推。然后把所有的正例样本的rank值相加,再减去正例样本的score为最小的那M个值的情况。得到的就是所有样本中有多少正例样本的score大于负例样本的score,最后除以M×N。需要特别注意的地方是,在存在score相等的情况时,需要赋予相同的rank值,具体操作是把所有这些score相同的样本的rank取平均。

注:Lift,F_1,ROC曲线可以通过R语言环境机器学习包求得,AUC的计算没有找到常用工具,因此利用python编程实现。

 

模型评估结果:

AUC=0.9999,Lift=1.9994,F_1=0.9999

注:以上评估结果为经过长时间参数调整后treelink的分类性能,结果过于理想,目前尚不能判断是否出现过拟合,需在利用其它数据经过多次实验后方能验证。

posted @ 2012-03-04 21:22 吴军 阅读(970) 评论(1) 编辑

     Makefile文件描述了整个工程的编译、链接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的Makefile。编译整个工程你所要做的唯一的一件事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。

     Makefile书写规则:

  (1)若工程没有编译过,那么所有的C(或C++)文件都要被编译并被链接;

  (2)若工程的某几个C文件被修改,那么只编译被修改的C文件,并链接目标程序;

    (3)若头文件被改变了,那么只需要编译引用了这几个头文件的C文件,并链接目标程序。

只要Makefile写得好,所有的这一切,只需要一个mak命令就可以完成。Makefile规则写法:

target ... :prerequisites ...

  command

  ...

  ...

这是一个文件的依赖关系,即target这一个或多个目标文件依赖于prerequisites中的文件,prerequisites中若有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。要执行lable之后的命令,就要在make命令后面明确指出这个lable的名字。

     若被依赖的文件找不到,那么make就直接退出,并报错,而对所对应的命令的错误,或者编译不成功,make根本不理。

     Makefile中使用变量:

     在makefile中使用变量,可以使得makefile更易维护。举例,使用变量的makefile内容为:

objects=main.o kbd.o command.o display.o

edit:$(objects)

...

...

如果有新的.o文件加入,只需简单地修改一下objects变量即可。

     每个Makefile文件都应该写一个清空目标文件的(.o或可执行文件)的规则,一般的风格为:

clean:

  rm edit $(objects)

更为稳健的做法是:

.PHONY:clean

clean:

  -rm edit $(objects)

.PHONY表示clean是一个“伪目标”,在rm前面的“-”表示也许某些文件出现问题,但不要管,继续做后面的事。

posted @ 2012-03-04 20:56 吴军 阅读(458) 评论(0) 编辑
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值