还是来看预测房价的这个例子,我们先对该数据做线性回归,也就是左边第一张图。
如果这么做,我们可以获得拟合数据的这样一条直线,但是,实际上这并不是一个很好的模型。我们看看这些数据,很明显,随着房子面积增大,住房价格的变化趋于稳定或者说越往右越平缓。因此线性回归并没有很好拟合训练数据。
我们把此类情况称为欠拟合(underfitting),或者叫作叫做高偏差(bias)。
这两种说法大致相似,都表示没有很好地拟合训练数据。高偏差这个词是 machine learning 的研究初期传下来的一个专业名词,具体到这个问题,意思就是说如果用线性回归这个算法去拟合训练数据,那么该算法实际上会产生一个非常大的偏差或者说存在一个很强的偏见。
第二幅图,我们在中间加入一个二次项,也就是说对于这幅数据我们用二次函数去拟合。自然,可以拟合出一条曲线,事实也证明这个拟合效果很好。
另一个极端情况是,如果在第三幅图中对于该数据集用一个四次多项式来拟合。因此在这里我们有五个参数θ0到θ4,这样我们同样可以拟合一条曲线,通过我们的五个训练样本,我们可以得到如右图的一条曲线。
一方面,我们似乎对训练数据做了一个很好的拟合,因为这条曲线通过了所有的训练实例。但是,这实际上是一条很扭曲的曲线,它不停上下波动。因此,事实上我们并不认为它是一个预测房价的好模型。
所以,我们把这类情况叫做过拟合(overfitting),也叫高方差(variance)。
与高偏差一样,高方差同样也是一个历史上的叫法。从第一印象上来说,如果我们拟合一个高阶多项式,那么这个函数能很好的拟合训练集(能拟合几乎所有的训练数据),但这也就面临函数可能太过庞大的问题,变量太多。
同时如果我们没有足够的数据集(训练集)去约束这个变量过多的模型,那么就会发生过拟合。
过度拟合的问题通常发生在变量(特征)过多的时候。这种情况下训练出的方程总是能很好的拟合训练数据,也就是说,我们的代价函数可能非常接近于 0 或者就为 0。
但是,这样的曲线千方百计的去拟合训练数据,这样会导致它无法泛化到新的数据样本中,以至于无法预测新样本价格。在这里,术语"泛化"指的是一个假设模型能够应用到新样本的能力。新样本数据是指没有出现在训练集中的数据。
之前,我们看到了线性回归情况下的过拟合。类似的情况也适用于逻辑回归。
那么,如果发生了过拟合问题,我们应该如何处理?
过多的变量(特征),同时只有非常少的训练数据,会导致出现过度拟合的问题。因此为了解决过度拟合,有以下两个办法。
方法一:尽量减少选取变量的数量
具体而言,我们可以人工检查每一项变量,并以此来确定哪些变量更为重要,然后,保留那些更为重要的特征变量。至于,哪些变量应该舍弃,我们以后在讨论,这会涉及到模型选择算法,这种算法是可以自动选择采用哪些特征变量,自动舍弃不需要的变量。这类做法非常有效,但是其缺点是当你舍弃一部分特征变量时,你也舍弃了问题中的一些信息。例如,也许所有的特征变量对于预测房价都是有用的,我们实际上并不想舍弃一些信息或者说舍弃这些特征变量。
方法二:正则化
正则化中我们将保留所有的特征变量,但是会减小特征变量的数量级(参数数值的大小θ(j))。
这个方法非常有效,当我们有很多特征变量时,其中每一个变量都能对预测产生一点影响。正如我们在房价预测的例子中看到的那样,我们可以有很多特征变量,其中每一个变量都是有用的,因此我们不希望把它们删掉,这就导致了正则化概念的发生。
接下来我们会讨论怎样应用正则化和什么叫做正则化均值,然后将开始讨论怎样使用正则化来使学习算法正常工作,并避免过拟合。
在前面的介绍中,我们看到了如果用一个二次函数来拟合这些数据,那么它给了我们一个对数据很好的拟合。然而,如果我们用一个更高次的多项式去拟合,最终我们可能会得到一个曲线,它能很好地拟合训练集,但却并不是一个好的结果,因为它过度拟合了数据,因此,一般性并不是很好。
让我们考虑下面的假设,我们想要加上惩罚项,从而使参数 θ3 和 θ4 足够的小。
这里我的意思就是,上图的式子是我们的优化目标,也就是说我们需要尽量减少代价函数的均方误差。
对于这个函数我们对它添加一些项,加上 1000 乘以 θ3 的平方,再加上 1000 乘以 θ4 的平方,
1000 只是我随便写的某个较大的数字而已。现在,如果我们要最小化这个函数,那么为了最小化这个新的代价函数,我们要让 θ3 和 θ4 尽可能小。因为,如果你在原有代价函数的基础上加上 1000 乘以 θ3 这一项 ,那么这个新的代价函数将变得很大,所以,当我们最小化这个新的代价函数时, 我们将使 θ3 的值接近于 0,同样 θ4 的值也接近于 0,就像我们忽略了这两个值一样。如果我们做到这一点( θ3 和 θ4 接近 0 ),那么我们将得到一个近似的二次函数。
因此,我们最终恰当地拟合了数据,我们所使用的正是二次函数加上一些非常小,贡献很小项(因为这些项的 θ3、 θ4 非常接近于0)。显然,这是一个更好的假设。
更一般地,这里给出了正规化背后的思路。这种思路就是,如果我们的参数值对应一个较小值的话(参数值比较小),那么往往我们会得到一个形式更简单的假设。
在我们上面的例子中,我们惩罚的只是 θ3 和 θ4 ,使这两个值均接近于零,从而我们得到了一个更简单的假设,实际上这个假设大抵上是一个二次函数。
但更一般地说,如果我们像惩罚 θ3 和 θ4 这样惩罚其它参数,那么我们往往可以得到一个相对较为简单的假设。
实际上,这些参数的值越小,通常对应于越光滑的函数,也就是更加简单的函数。因此 就不易发生过拟合的问题。
我知道,为什么越小的参数对应于一个相对较为简单的假设,对你来说现在不一定完全理解,但是在上面的例子中使 θ3 和 θ4 很小,并且这样做能给我们一个更加简单的假设,这个例子至少给了我们一些直观感受。
来让我们看看具体的例子,对于房屋价格预测我们可能有上百种特征,与刚刚所讲的多项式例子不同,我们并不知道 θ3 和 θ4 是高阶多项式的项。所以,如果我们有一百个特征,我们并不知道如何选择关联度更好的参数,如何缩小参数的数目等等。
因此在正则化里,我们要做的事情,就是把减小我们的代价函数(例子中是线性回归的代价函数)所有的参数值,因为我们并不知道是哪一个或哪几个要去缩小。
因此,我们需要修改代价函数,在这后面添加一项,就像我们在方括号里的这项。当我们添加一个额外的正则化项的时候,我们收缩了每个参数。
顺便说一下,按照惯例,我们没有去惩罚 θ0,因此 θ0 的值是大的。这就是一个约定从 1 到 n 的求和,而不是从 0 到 n 的求和。但其实在实践中
这只会有非常小的差异,无论你是否包括这 θ0 这项。但是按照惯例,通常情况下我们还是只从 θ1 到 θn 进行正则化。
下面的这项就是一个正则化项
并且 λ 在这里我们称做正则化参数。
λ 要做的就是控制在两个不同的目标中的平衡关系。
第一个目标就是我们想要训练,使假设更好地拟合训练数据。我们希望假设能够很好的适应训练集。
而第二个目标是我们想要保持参数值较小。(通过正则化项)
而 λ 这个正则化参数需要控制的是这两者之间的平衡,即平衡拟合训练的目标和保持参数值较小的目标。从而来保持假设的形式相对简单,来避免过度的拟合。
对于我们的房屋价格预测来说,我们之前所用的非常高的高阶多项式来拟合,我们将会得到一个非常弯曲和复杂的曲线函数,现在我们只需要使用正则化目标的方法,那么你就可以得到一个更加合适的曲线,但这个曲线不是一个真正的二次函数,而是更加的流畅和简单的一个曲线。这样就得到了对于这个数据更好的假设。
再一次说明下,这部分内容的确有些难以明白,为什么加上参数的影响可以具有这种效果?但如果你亲自实现了正规化,你将能够看到这种影响的最直观的感受。
在正则化线性回归中,如果正则化参数值 λ 被设定为非常大,那么将会发生什么呢?
我们将会非常大地惩罚参数θ1 θ2 θ3 θ4 … 也就是说,我们最终惩罚θ1 θ2 θ3 θ4 … 在一个非常大的程度,那么我们会使所有这些参数接近于零。
如果我们这么做,那么就是我们的假设中相当于去掉了这些项,并且使我们只是留下了一个简单的假设,这个假设只能表明房屋价格等于 θ0 的值,那就是类似于拟合了一条水平直线,对于数据来说这就是一个欠拟合 (underfitting)。这种情况下这一假设它是条失败的直线,对于训练集来说这只是一条平滑直线,它没有任何趋势,它不会去趋向大部分训练样本的任何值。
这句话的另一种方式来表达就是这种假设有过于强烈的"偏见" 或者过高的偏差 (bais),认为预测的价格只是等于 θ0 。对于数据来说这只是一条水平线。
因此,为了使正则化运作良好,我们应当注意一些方面,应该去选择一个不错的正则化参数 λ 。当我们以后讲到多重选择时我们将讨论一种方法来自动选择正则化参数 λ ,为了使用正则化,接下来我们将把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了。
之前我们已经介绍过,岭回归的代价函数如下:
对于线性回归(的求解),我们之前运用了两种学习算法,一种基于梯度下降,一种基于正规方程。
梯度下降,如下:
正规方程,如下:
现在考虑 M(即样本量), 比 N(即特征的数量)小或等于N。
通过之前的博文,我们知道如果你只有较少的样本,导致特征数量大于样本数量,那么矩阵 XTX 将是不可逆矩阵或奇异(singluar)矩阵,或者用另一种说法是这个矩阵是退化(degenerate)的,那么我们就没有办法使用正规方程来求出 θ 。
幸运的是,正规化也为我们解决了这个问题,具体的说只要正则参数是严格大于零,实际上,可以证明如下矩阵:
将是可逆的。因此,使用正则还可以照顾任何 XTX 不可逆的问题。
所以,你现在知道如何实现岭回归,利用它,你就可以避免过度拟合,即使你在一个相对较小的训练集里有很多特征。这应该可以让你在很多问题上更好的运用线性回归。
在接下来的视频中,我们将把这种正则化的想法应用到 Logistic 回归,这样我们就可以让 logistic 回归也避免过度拟合,从而表现的更好。
Regularized Logistic Regression 实际上与 Regularized Linear Regression 是十分相似的。
同样使用梯度下降:
如果在高级优化算法中,使用正则化技术的话,那么对于这类算法我们需要自己定义costFunction。
For those methods what we needed to do was to define the function that's called the cost function.
这个我们自定义的 costFunction 的输入为向量 θ ,返回值有两项,分别是代价函数 jVal 以及 梯度gradient。
总之我们需要的就是这个自定义函数costFunction,针对Octave而言,我们可以将这个函数作为参数传入到 fminunc 系统函数中(fminunc 用来求函数的最小值,将@costFunction作为参数代进去,注意 @costFunction 类似于C语言中的函数指针),fminunc返回的是函数 costFunction 在无约束条件下的最小值,即我们提供的代价函数 jVal 的最小值,当然也会返回向量 θ 的解。
上述方法显然对正则化逻辑回归是适用的。
通过最近的几篇文章,我们不难发现,无论是线性回归问题还是逻辑回归问题都可以通过构造多项式来解决。但是,你将逐渐发现其实还有更为强大的非线性分类器可以用来解决多项式回归问题。下篇文章中,我们将会讨论。
最近在阅读这本elements of statistical learning,这本书的题目翻译成中文可以叫做统计学系基础。但是我认为这本书非常之不基础。需要读者具备比较扎实的数理统计和概率论的功底,对于统计推断,统计决策以及基本的机器学习的概念有所了解。我所阅读的是从学校图书馆借来的影印本,内容为本书第一版(2001)。据说第二版有700多页那么厚。这本书有中文翻译版,但是翻译作者可能非统计专业出身,很多专有名词不光翻译不准确,另外很多语句也翻译的很奇怪。因此,建议本书的读者还是阅读影印本或者从作者网站下载原本比较好。 本书阅读已经进行了将近两周的时间,大致上阅读了前四章的内容。觉得内容虽不艰深,但是也绝不基础。是本非常好的书。决定现在开始,定期写点读书笔记上来,做个小结。 第二章的题目是有指导学习概述。所谓的有指导学习,在我理解来看,就是真实的输出或者响应事实上是已知的,在这种情况下利用输入数据,构建一定的模型来预测输出,再通过和真实输出值之间进行比较,从而调整模型,减少模型的预测误差。而所谓的统计学习,这个概念和机器学习既有联系又有所不同。统计学系,我认为是机器学习的一个特殊的情况,从数学和统计学的角度看待问题,事实上是在利用统计学的模型做函数逼近。统计学模型的建模,大致上有两种不同的思路,这也是本书第二章第三节所介绍的最小二乘和最近邻方法。在统计学中,最小二乘是参数统计中构建线性模型的求解方法,事实上最小二乘是一种最优化算法。而最近邻方法则是非参数统计建模的基本思想之一。最小二乘的前提是对统计模型做出一定的假定,比如说统计模型是全局线性的(非线性回归模型也有相应的最优化解法)。而最近邻方法则认为距离相近的点,其相应的输出应该差不了太多。后面我们会看到,这种方法的一些局限及其推广。 2.3节介绍完最小二乘以及最近邻方法之后,2.4节介绍了一些基本的统计决策理论。我认为,并且深刻的认为,统计决策的理论,是整个统计学习的理论基础,因此有必要好好梳理一下统计决策理论的思路。 统计决策理论,我记得是在大三的时候学的。现在留下的最深的印象其实就是贝叶斯公式的各种推倒。事实上,所谓的决策,是需要将决策问题的分析化为两部分,第一部分是寻找损失函数,也就是通过分析,得出你所做的决策可能发生的损失。在统计学中,损失函数有很多种,而损失函数归根到底,也就是在某种分布下的期望。决策的第二步就是从损失函数出发,求解使得损失最小的参数设置,这个参数设置就是我们的决策。那么从统计学习的角度来讲,有输入X,也有输出Y,这两者之间的联合分布P(X,Y)是我们知道的。如果我们选用最常用的平方和损失,那么可以得到在联合分布P(X,Y)下平方和损失的期望。我们将这个期望当成是我们选择模型的准则。使得这个值最小的模型即使我们所选择的模型。那么建模问题就变成了统计决策的问题。利用条件期望与期望之间的关系,我们得到,在损失平方和的期望的准则之下,最优的解是关于X的Y的条件期望。这个解是我们所熟识的,在线性模型中,我们也证明过条件期望是使得该准则达到最小的唯一的解。 到现在,我们应该注意到,所建构的模型是一个条件期望。而如果要确切知道条件期望,我们必须知道条件概率分布或者条件密度。而事实上,如果我们知道了这些,我们其实也就没有必要来建模了。我们所知道的仅仅是数据,我们需要利用数据来估计这个条件概率分布或者条件密度。举一个例子,在有指导学习的分类问题中,我们就可以利用不同类别所占的比例来估计这个类别的概率分布,用在该类别下的输入的数据来估计输入变量的先验概率分布,然后用贝叶斯公式就可以求得后验概率分布了。 事实上,最小二乘与最近邻都是对这个条件期望的估计。我们先拿最近邻说事儿。事实上,我认为最近邻相比最小二乘,是一个更加“统计”的东西,最小二乘更像是一个数学的最优化问题。最近邻方法,是用某个目标值点附近的几个点对应的输出的平均值最为该目标输入点对应的输出的估计(预测)。事实上,也是一个条件均值,条件就是求均值的这几个值必须是目标点的某个近邻中的点所对应的输出。这里有两次近似,一次是用平均值来近似均值,另外,就是某个点上的条件分布,我们用这个点的近邻来近似。可以证明,当训练样本数量足够大的时候,最近邻方法是收敛到上述所需要的条件期望的。这是一个非常好的大样本性质。这个至少说明了最近邻方法是从理论上来讲是非常合理的。稍后我们会看到在实际应用中,这种方法的局限。 讲完了最近邻方法是如何纳入到统计决策的问题框架下的,下面我们来看一看线性回归是如何纳入到这个框架下来的。线性回归,事实上只是参数回归问题的一种,参数回归中,线性回归的起源最早,原因是其模型假设最简单。其假设模型参数是线性的。在这个前提假设之下进行模型的搜索。事实上,我们不应该忘记我们始终要寻找的,其实是条件期望。正因为没有确切知道条件概率分布我们才用其他方法找寻条件期望的一个估计。我们把线性假设放在条件期望中,这样做事实上缩小了搜索最优解的范围,而且在这个限制之下,我们也是可以求得理论解的。我们通常所使用的最小二乘解其实也仅仅是这个理论解的一种估计。 此外,我们可以更换损失函数,比如L1范数的损失函数,得到的理论的最优解是条件中位数,那么这个也可以用样本中位数去估计。当输出是定性变量的时候,我们也可以通过编码,以及改变损失函数的结构,来将分类问题纳入到统计决策的理论框架中来。而这就是所谓的贝叶斯分类器。我想对此感兴趣的读者应该去看看原文,那里的推导是令人感到赏心悦目的。 本章2.5节接着介绍了局部方法在高维情况下所遇到的很多问题。虽然局部方法的大样本性质很好,但是高维情况下,出现了很多不适合用局部方法求解的问题。这里我就不一一介绍了。我认为这部分内容只要知其然就可以了,本章课后有一道习题,是要推导高维球体离球心最近点的分布情况的,看了就傻眼。 介绍完高维灾难之后,本书2.6节理清了统计模型,有指导学习以及函数逼近三者之间的逻辑联系,相同点和不同点。值得一提的是,在函数逼近部分,作者终于提出了极大似然方法,这个在统计中,我认为最重要的方法。 在2.7节,作者提到了一些结构化的回归方法,事实上这个方法可以看成是线性模型的相应推广,目的是为了解决高维情况下局部方法的不足。2.8节,也是综述性的介绍了统计模型的分类,我觉得这部分的内容还是比较有趣的。也有必要梳理一下。下面开始简单的梳理。 统计模型,从本源来看,一种是从最近邻方法发展出来的局部方法,另外一种则是对线性模型的相应的改进。当然,这样的划分或许并不是那么准确,因为有些模型则是二者之间的混搭。 第一种,加惩罚项的回归。目前用的比较火的有很多变量选择的方法,比如lasso,岭回归,桥回归。是研究的一个热点,其本质是对损失加惩罚,从而达到对系数的压缩。 第二种,核方法,这个是非参数回归中的一种非常重要的方法,引入核函数,对点与目标点之间的关系附上权重,相当于是将最近邻方法中的求均值变成了求加权平均值。是最近邻方法的推广。 第三种,基函数方法。这个是对线性模型的推广,假设模型仍然是可加的,对系数而言仍然是线性的,但是所加的这些项则变成了函数(基函数),对这种方法而言,比较常用的一个是样条,另外一个是多项式回归。在地理统计学和计算机试验的建模中,也有一个所谓的kriging方法,也可以划分为这个类别。 以上的分类,对于我们学习统计建模或者说统计学习,是很有帮助的。我们知道了某种方法的来源,就可以对这种方法进行改进。就比如说Efron提出的最小角回归方法,正是看清了逐步回归的本质,才做了相对的改动提出来的。就我个人的经验而言,所有统计学上的进步,至少我所阅读过的四大顶级杂志中的文章,其都是看明白了某种统计方法的本质,然后在此基础上做了相应的改进的。 本章的最后一节,谈了模型选择的问题,事实上,模型选择所涉及的问题是一个平衡模型复杂程度以及预测精度的问题。所提出的模型选择准则,无非是对上述问题的从某种角度来说比较合理的解答。对于模型选择,我更愿意关注的一些策略,比如cross-validation,boosting等等。 以上就是我对第二章的阅读的一些心得。第二章仅仅是本书的开局,所介绍的内容都是非常基本的,也是很概括的。后续章节逐步深入展开,难度也增加不少。继续加油阅读吧。
这两天看这本书,每天都要遭受不同程度的打击。读起来进度非常之慢,并且时不时会卡壳。如果有童鞋能够一块讨论,一定会受益匪浅。下面小结一下这几天看书的一些心得吧。本书的第三章内容是线性回归,包括了很多变量选择的内容。这部分内容,我暂时先不写笔记。在我们已经拥有了线性回归的相关的基本知识之后,我们来看第四章。第四章的题目是linear methods for classification。众所周知,分类是机器学习,数据挖掘的最重要的任务之一。而线性方法则是这些方法中最为基本的,往往也是比较有效地,因此需要花费精力来学习这些基本的内容。 首先,所谓的分类问题,是一种有指导的学习,也就是说我们知道数据本身属于哪一类,我们要做的是找出数据分类的规则,以便对于新的数据进行分类。第二,我们要搞清楚什么是线性方法,线性到底意味着什么。我们举一个非常直观的例子。
本次笔记的内容主要是集中于第五章的第二节。第五章的内容比较重,因此计划每一小节读完都写点笔记,并且尽量给出这些内容在R中的实现。下面开始:分段多项式,是通过把输入变量($X$)的取值空间分割成连续的区间,然后在每个区间中进行多项式拟合得到的。分段多项式是基函数回归的一种,因此,我们可以用基函数的模子来描写这个多项式。 分段拟合多项式会遇到问题,就是在结点处,所拟合的多项式不连续。一般来说,我们比较希望拟合得到的函数是连续的,甚至更光滑的,因此我们要增加一些限制条件。比如要求结点处,两边的多项式值相等。或者更光滑的,一阶,二阶微分也是连续的。 我们需要注意的一点是,分段多项式的基函数可以有不同的表达,通常truncated power basis是一个简单的表达,但是在计算的时候,当结点数太多的时候会有问题。B样条基能够比较有效地解决这个问题,因此在大多数的统计软件中,都是用B样条基来作为分段多项式回归的基函数的。(B样条基在后续的笔记中会介绍到,这里就不叙述了)。 关于样条和分段多项式,它们之间的联系很紧密。一个有着结点($\xi_j,j=1,\ldots,K$)的M阶样条,是一个M阶的分段多项式,并且该分段多项式的M-2次微分都是连续的。比如说一个三次样条(cubic spline),阶数($M=4$)。并且,有人指出,三次样条是人眼无法辨别结点处不连续的最低阶的样条。也就是说,三次样条以上的样条,在结点处,看起来都是连续的。在实际中,常用的样条的阶数为1,2,4。 在用样条进行回归也好,分类也好,我们都必须要选择样条的阶数,样条中结点的个数以及结点的位置。 下面介绍一个非常常用的样条,自然三次样条(natural cubic spline)。我们知道,多项式模型在变量的边界部分波动很大,用了分段多项式以后,每一个结点出的拟合的波动都比较大,这是一个问题。自然三次样条就是通过多加一些限制,来缓解这个问题。当然,缓解这个问题所付出的代价就是结点部分的拟合的偏差可能会增大。但是,这是一个平衡。这个额外的限制是,在结点两侧的边界部分,限制所拟合的函数是线性的。我们来直接看看有K个结点的自然三次样条的K的基函数是长什么样的: ($N_1(X)=1,N_2(X)=X,N_{k+2}(X)=d_k(X)-d_{K-1}(X)$) 其中($d_k(X)=\frac{(X-\xi_k)_{+}^3-(X-\xi_K)_{+}^3}{\xi_K-\xi_k}$) 现在笔者的问题是,这个基函数是怎么推导出来的,我还是没有搞清楚,如果有童鞋对此问题比较清楚地,可以指导我一下。 如上的,就是自然三次样条的定义。我们下面通过一个实际数据的例子来看看如何用自然三次样条对实际问题进行分析。 数据来自于网站:http://www-stat.stanford.edu/~tibs/ElemStatLearn/ 这个网站就是这本书的网站。这三位斯坦福的大牛把自己书的几次版本全都放在这个网站上,还有相应的数据,为读者练手提供了良好的条件。相当的靠谱。 以下部分是数据的描述:
原谅我太懒,没有翻译这段文字。数据的响应是chd,是分类变量。输入中也有分类变量是famhist。我们先看看数据长什么样。A retrospective sample of males in a heart-disease high-risk region of the Western Cape, South Africa. There are roughly two controls per case of CHD. Many of the CHD positive men have undergone blood pressure reduction treatment and other programs to reduce their risk factors after their CHD event. In some cases the measurements were made after these treatments. These data are taken from a larger dataset, described in Rousseauw et al, 1983, South African Medical Journal. sbp systolic blood pressure tobacco cumulative tobacco (kg) ldl low densiity lipoprotein cholesterol adiposity famhist family history of heart disease (Present, Absent) typea type-A behavior obesity alcohol current alcohol consumption age age at onset chd response, coronary heart disease
本书第六章介绍了核方法(Kernel)。记得上高等数理统计的时候,老师布置过关于核方法的一片小论文作业,只不过当时并没有重视,作业也是应付了事。这两天读了这一章,觉得核方法是一种非常重要的工具。当然,这一章中也有众多地方读不懂,慢慢继续读吧。下面写点读书笔记和心得。 6.1节,先从最基本的一维核平滑说起。 所谓的平滑,我觉得可以这样理解。对于一维变量及其相应,可以在二维空间中画一个散点图。如果利用插值,将点连接起来,那么连线可能是曲折不平的。所谓的平滑,就是用某种手段使得连线变得平滑光滑一点。那么手段可以有多种,比如第五章介绍的样条平滑,是利用了正则化的方法,使得连线达到高阶可微,从而看起来比较光滑。而本章要介绍的核方法,则是利用核,给近邻中的不同点,按照其离目标点的距离远近赋以不同的权重,从而达到平滑的效果。 下面比较详细的介绍 之前介绍过k-最近邻方法,是用($\hat{f}(x)=Ave(y_i|x_i \in N_k/(x))$)作为回归方程($E(Y|X=x)$)的估计。
这一章的内容是模型评估与选择,断断续续看了两周时间,感觉比看模型还费劲。其实这一章的大部分内容我是熟悉的,包括各种模型选择的准则,交叉验证以及bootstrap,这些在实际建模的时候也经常用到,但是关于其原理确实不是很清晰。这一章给出了详尽,但是又不那么理论的阐述。经典确实是经典。闲话不多说了,开始读书笔记。对于同一个问题,比如分类问题或者预测问题,往往会有一系列的模型都可以做。那么这些模型表现的如何,如何从这些模型中选择一个合适的,最好的模型,就成为了一个问题。而这个问题在实际中是非常重要的。我们都知道,模型是建立在训练样本上的,而预测是需要在一个独立的新的样本上进行的。在训练样本上所建立的模型,其在一个新的独立的样本上的表现如何进行评估,是一个非常重要的问题。 这一章首先介绍了偏差(bias),方差(variance)以及模型复杂度(model complexity)。我们有一个target variable Y,以及输入向量X,以及通过训练样本得到的对于响应的估计(也就是我们的模型)($\hat{f}(X)$)。此外,我们还应该有一个损失函数($L(Y,\hat{f}(X))$)。损失函数可以有多种选择,比如平方损失,绝对值损失,这两个主要是针对定量的响应的,对于定性的响应,也有0-1损失,对数似然之类的。一般而言,损失函数中比较常用的就是这些。 有了模型以及损失函数之后,首先定义test error(原谅我在这里中英混杂,因为我发现用这种方法可以更好地区分几个不同的概念)。test error是损失函数在一个新的,独立的检验样本上的期望。($Err=E[L(Y,\hat{f}(X))]$)。这个期望的计算需要涉及到新的检测样本的联合分布。 以上是test error的概念。于此对应的是training error的定义,training error是指在训练样本上的损失的平均值。($\bar{err}=\frac{1}{N}\sum_{i=1}^N L(y_i,\hat{f}(x_i))$)
。那么我们就按照作者的经验,来开始对in-sample error进行估计吧。 对于in-sample error的估计,有两个不同的角度可以进行,一种是估计op,然后加到($\bar{err}$)上即可。这也就是AIC,BIC的思路。另外一种就是利用重抽样,比如cross-validation或者bootstrap的策略,来估计in-sample error。下面的部分,就分别比较详细的介绍一下这些方法。 ($C_p$)统计量: ($\hat{Err}_{in}=\bar{err}+\hat{op}$) 是通用的一个式子,不同的准则有对这个式子不同的估计,我们先来看最常用的($C_p$)准则。 ($C_p=\bar{err}+2\frac{d}{N}\sigma_{e}^2$) 这个公式适用于加法模型,而且如果估计值是线性的情况下。 AIC准则: ($AIC=-2Loglik+2\frac{d}{N}$). 当损失函数对数似然损失函数的时候,这个准则比($C_p$)准则更加广义。其所依赖的理论是一个大样本性质,当N趋于无穷大的时候, ($-2E[log Pr_{\hat{\theta}}(Y)] \sim -\frac{2}{N}E[loglik]+2\frac{d}{N}$) 其中($loglik=\sum log Pr_{\hat{\theta}}(y_i)$) 用AIC准则进行模型选择的时候,是选择AIC越小愈好。这一部分书中有一个简单的例子,但是很能说明问题,不在此多说了。 BIC准则: ($BIC=-2loglik+(logN)d$) BIC准则的得来的motivate是非常不同的,选择BIC最小的模型,事实上是在选择后验概率最大的模型。BIC准则的得来,是通过bayes理论推导得到的。这里在书中也有具体的公式推导。 MDL: minimum description length。这个部分,我几乎没怎么看明白,其核心是编码理论。 以上是一些模型选择的准则。模型选择的准则都涉及到了模型有效参数的个数,因此,这一章也对这个问题做了一些讲解。包括7.6the effective number of parameters以及7.9的Vapnik-Chernovenkis dimension,都是主要讲了模型复杂度的度量。这两部分的内容我看的并不是很清晰,也没什么感觉。希望再读此书能有所收获。这次阅读,这部分我都略过了。 以上的一些准则,都是对op的一个比较解析的估计。下面介绍两种通过重抽样的策略,来估计in-sample error的方法。 cross-validation: ($CV=\frac{1}{N}sum_{i=1}^N L(y_i,\hat{f}^{-k(i)}(x_i))$) 交叉验证,就是把训练样本大致平均地分成K分,然后每次剔除一部分,用另外的部分进行模型构建,然后用剔除的那一部分来估计误差,这样做K次,然后平均K次的误差。 通常而言,都是用5-cross validation或者10-cross validation。当然还有每次剔除一个值,leave-one-out。如何选择K是一个问题,当K=N的时候,CV是预测误差的渐进无偏估计。但是方差可能会很大。当K比较小的时候,方差会比较小,但是偏差比较大,也是一个问题。作者说“In-sample error is not usually of direct interest since future values of the features are not likely to coincide with their training set value.But for comparison between models,in-sample error is convenient and often leads to effective model selection”
。拿来用用,比一比即可。 bootstrap方法: 这一部分我不想多说,在豆瓣里我有分享过关于bootstrap的相关资料。bootstrap这个方法最早就是stanford的Efron提出的,在模型选择中应用非常广泛,但是我个人还是比较喜好cross-validation的策略一些。 差不多今天就到这了,这本书啥时候才能看完啊。"over-all five or ten fold cross-validation are recommended as a good compromise"
这一章的题目叫做model inference and averaging。直译过来是模型推断和模型平均。这一章断断续续看了也有一周时间,只可惜平日里在这方面无甚积累,写不出来什么。今天的读书笔记只好瞎白活两句了。部分内容与本章所讲有关,部分是我平日里关于统计的一些思考。统计学在南开,是放在数学院下面。比较偏重统计的数理方面,重理论。上了硕士以后,直接接触的都是试验设计的东西,关于统计学习或者统计建模方面的文章,读来也都是为设计服务,看看有木有一个好的设计能改进某个模型的精度的。由于本人个人专业方向的原因,对于bayes的一些东西了解的不够,对于非参的东西了解的也不够。直接导致了我对于第七章,第八章(尤其是第八章)内容的不适用。在上高等数理统计的时候,院长给我们布置了很多当时看起来很诡异的课后作业,包括自学bootstrap,核方法等等。都是交小论文,读过Efron的那本关于jackknife和bootstrap的小册子,也读过不少核方法的论文,因为当时没有怎么用心,而且当时的英文程度也不行,因此也就没什么收获。如今读到这本书,觉得当时真是蹉跎了岁月。 这一章的内容充满了斯坦福的味道,尤其是本章后半部分内容,基本上都是Tibs的成果。包括model averaging方面的一些方法,比如bumping,看了看,确实是一种很好的提高估计精确度的策略。之前却对此毫无耳闻。第十章专门介绍boosting方法,这种方法经常见到,应用较广。因此对于本章介绍的方法,我也仅仅是大致扫了几眼,没在深究。 我觉得,本章比较有意思的内容,是前半部分,关于bootstrap和极大似然,最小二乘之间的关系。其本质上是bootstrap方法的大样本理论。南开这两年因为邹老师的缘故,在大样本这方面建树颇多,虽然我依然对其理论不熟悉,但是同宿舍有这方面的专家,随便讲解几句,心里也了然很多。 第八章的内容事实上是延续了第七章的内容,是做模型实务的非常好的参考。 看了这一章的内容之后,我对于bootstrap方法多了很多认识,这种方法真的非常不错,从其大样本的性质来讲也好,从其可计算性来讲也好。以后要重视对这种方法的应用。 另外,本章介绍了EM算法和Gibbs抽样。EM算法,学过,可是从来也没自己编程实现过,而MCMC的内容,也非常的不熟悉。 第七章和第八章就这样吧,接着看第九章,树的内容。还有支持向量机,以及无监督的几种学习算法,争取在一个月之内,把本书剩余部分搞掉,然后开始看MCMC的书。 看一天书,倍儿累。嗓子眼儿堵堵的,看书看费劲了我就这德行了。 儒林重新开业,昨儿去定了现在看的这本书。这本书确实非常经典,有必要收藏,顺手买了Monte Carlo Statistical Methods,瞬间穷了。 儒林在南开的重新开业,让我这个临近毕业的人稍微有所慰藉。
第九章的内容,介绍了一些比较高级的模型,连续在资料室苦读了两天,终于把内容大致过了一遍。这些模型的R包也基本上找出来,并实例演练了一下。感觉收获非常多。下了相关的参考文献,又是一大堆。准备回头具体看看吧。老外写这种专业性质的书,都是属于百科全书式,引导读者去读文献,书中的内容,因为省略了大量的步骤,因此有时会感到有些费解。不过如果纯粹从应用的角度去看到话,知道原理,用在何处,如何用,如何解读大致的结果,似乎也就够用了。对于第九章,我决定写三篇读书笔记,这是第一篇,主要是小结广义可加模型。第二篇准备介绍树(CART)以及相关的(prim,HME),第三篇则重点介绍Friedman的MARS(带我读完其参考文献之后详细点写).先给自己定这些目标,然后慢慢去看吧。 本学期还剩下不到一个月结束,务必先把这本书看完。 下面进入正题,开始简单介绍广义可加模型。 广义可加模型的优点是more automatic flexible,当然这是相比起传统的线性模型而言的。也就是模型更加灵活,因此对非线性性的识别和探索上比较有优势。其模样如下: ($E(Y|X_1,X_2,\ldots,X_p)=\alpha+f_1(X_1)+f_2(X_2)+\cdots+f_p(X_p)$) 其中($f_j$)是未知的,非参函数,也就比较平滑。对于每个这样的函数,都用scatterplot smoother来拟合。(这里不知道这个词具体怎么翻译,但是意思就是,拟合的方法是某种平滑方法,比如三次平滑样条,或者核平滑之类的,之前的笔记中介绍过),这个模型的构建的另外一个特别之处,在于提供了一种同时估计p个函数的一种算法。这都是相对于以前的传统的模型的区别。 上面的这个广义可加模型的样子,事实上只体现出来了可加,而所谓的广义,与广义线性模型中的广义意思差不多,指的是响应所服从的分布,比如可加的logistic回归模型,就是长成下面这个样子: ($log(\frac{\mu(X)}{1-\mu(X)})=\alpha+f_1(X_1)+\cdots+f_p(X_p)$) 和广义线性模型一样,这边就涉及到了link function,link function和广义线性模型(glm)中的都类似。 关于方程($f_j$)的估计,是比较flexible的,所用的算法,其构成的基础元素是scatterplot smoother。估计得到的($\hat{f}_j$)可以挖掘出($X_j$)的效应中的非线性的成分。当然了,并非所有的($X_j$)的函数都必须是非线性的。我们可以使用半参数模型。 事实上,传统的线性模型,只是广义可加模型的一种特例。这一点也就让我们充分意识到广义可加模型的重要地位。(在这里又要发表一下小小的感慨,stanford对统计学的贡献真是高山仰止)。 以上介绍了广义可加模型的定义,以及大致粗浅介绍了其拟合模型的算法思想。下面比较具体的(但是也没有太多具体推到)介绍如何拟合一个可加模型。 将要介绍的算法是一种通用的方法。为了比较方便叙述,我们这里选用的scatterplot smoother为三次平滑样条。可加模型是: ($Y=\alpha+\sum_{j=1}^p f_j(X_j)+\varepsilon$) 误差项($\varepsilon$)均值为0。 我们定义一个损失函数: ($PRSS(\alpha,f_1,f_2,\ldots,f_p)=\sum_{i=1}^N{y_i-\alpha-\sum_{j=1}^p f_j(x_{ij})}^2+\sum_{j=1}^p \lambda_j \int f_j^{''}(t_j)^2dt_j$) ($\lambda_j$)是tuning parameters。可以证明(书中并没有证明,具体如何证明,徐参看参考文献,我没看过参考文献,纯从应用的角度考虑,可以不用管这是如何证明的),最小化PRSS得到的解是一个可加三次样条模型。每一个函数($f_j$)是一个关于($X_j$)的三次样条,每一个不同的值($x_{ij}$)都是结点(knot),($i=1,2,\ldots,N$)。 这个模型显然不是唯一的(因为有常数项,可以对后面的可加项进行调节),为此,我们必须再增加一点限制,使得输入变量的矩阵必须是非奇异的,才能保证求解是唯一的。通常选用的限制是($\sum_{i=1}^Nf_j(x_{ij})=0$),对所有($j$)都成立。 对于这个问题的求解算法,需要用到一个简单的迭代。下面我试图用语言,而少用公式。看看能不能将其表述清楚。 一开始,我们就设定($\hat{\alpha}=\frac{1}{N}\sum_{i=1}^N y_i$),并且这个值以后都不改变了。我们对($\{y_i-\hat{\alpha}-\sum_{j \neq k} \hat{f}_j(x_{ij)}\}_1^N$)这些点,拟合一个三次平滑样条($S_k$),这个三次平滑样条相当于是($x_{ik}$)的一个函数($\hat{f}_k$)。对于每个输入变量,这个是轮流进行的。直到我们得到的估计值($f_j$)比较稳定了,不怎么变化了。这种算法的名称叫做backfitting。算法如下:
> setwd("F:/Data Mining/Machine Learning/spam") > mydata<-read.table("data with name.txt",header=TRUE) > varsname<-names(mydata[-58]) > #varsname > for(i in 1:length(varsname)) + { + varsname[i]<-paste("s(",varsname[i],sep="") + varsname[i]<-paste(varsname[i],")",sep="") + } > varsname [1] "s(word_freq_make)" "s(word_freq_address)" [3] "s(word_freq_all)" "s(word_freq_3d)" [5] "s(word_freq_our)" "s(word_freq_over)" [7] "s(word_freq_remove)" "s(word_freq_internet)" [9] "s(word_freq_order)" "s(word_freq_mail)" [11] "s(word_freq_receive)" "s(word_freq_will)" [13] "s(word_freq_people)" "s(word_freq_report)" [15] "s(word_freq_addresses)" "s(word_freq_free)" [17] "s(word_freq_business)" "s(word_freq_email)" [19] "s(word_freq_you)" "s(word_freq_credit)" [21] "s(word_freq_your)" "s(word_freq_font)" [23] "s(word_freq_000)" "s(word_freq_money)" [25] "s(word_freq_hp)" "s(word_freq_hpl)" [27] "s(word_freq_george)" "s(word_freq_650)" [29] "s(word_freq_lab)" "s(word_freq_labs)" [31] "s(word_freq_telnet)" "s(word_freq_857)" [33] "s(word_freq_data)" "s(word_freq_415)" [35] "s(word_freq_85)" "s(word_freq_technology)" [37] "s(word_freq_1999)" "s(word_freq_parts)" [39] "s(word_freq_pm)" "s(word_freq_direct)" [41] "s(word_freq_cs)" "s(word_freq_meeting)" [43] "s(word_freq_original)" "s(word_freq_project)" [45] "s(word_freq_re)" "s(word_freq_edu)" [47] "s(word_freq_table)" "s(word_freq_conference)" [49] "s(char_freq_.)" "s(char_freq_..1)" [51] "s(char_freq_..2)" "s(char_freq_..3)" [53] "s(char_freq_..4)" "s(char_freq_)" [55] "s(capital_run_length_average)" "s(capital_run_length_longest)" [57] "s(capital_run_length_total)" > (fmla<-as.formula(paste("y~",paste(varsname,collapse="+")))) y ~ s(word_freq_make) + s(word_freq_address) + s(word_freq_all) + s(word_freq_3d) + s(word_freq_our) + s(word_freq_over) + s(word_freq_remove) + s(word_freq_internet) + s(word_freq_order) + s(word_freq_mail) + s(word_freq_receive) + s(word_freq_will) + s(word_freq_people) + s(word_freq_report) + s(word_freq_addresses) + s(word_freq_free) + s(word_freq_business) + s(word_freq_email) + s(word_freq_you) + s(word_freq_credit) + s(word_freq_your) + s(word_freq_font) + s(word_freq_000) + s(word_freq_money) + s(word_freq_hp) + s(word_freq_hpl) + s(word_freq_george) + s(word_freq_650) + s(word_freq_lab) + s(word_freq_labs) + s(word_freq_telnet) + s(word_freq_857) + s(word_freq_data) + s(word_freq_415) + s(word_freq_85) + s(word_freq_technology) + s(word_freq_1999) + s(word_freq_parts) + s(word_freq_pm) + s(word_freq_direct) + s(word_freq_cs) + s(word_freq_meeting) + s(word_freq_original) + s(word_freq_project) + s(word_freq_re) + s(word_freq_edu) + s(word_freq_table) + s(word_freq_conference) + s(char_freq_.) + s(char_freq_..1) + s(char_freq_..2) + s(char_freq_..3) + s(char_freq_..4) + s(char_freq_) + s(capital_run_length_average) + s(capital_run_length_longest) + s(capital_run_length_total)muhaha
继续第九章的读书笔记,这次的读书笔记主要内容为基于树的模型(tree-based methods)以及相关的两个模型,prim以及HME。我越是看这本书,越觉得我硕士的前两年真是白念了。如果这本书我早一年或者一年半遇到,并且开始阅读的话,这一年多的时间,我应该足够参与更多的比赛,拿更好的名次和奖励。每次读这本书,都觉得确实相当之经典。此外,看着我已经写了九章的读书笔记,书已经读了10章多,马上就要读完它。还是觉得小有成就感的。最后一年的学生生活(其实只剩下半年不到就要毕业),且行且珍惜吧。 开始正题,开始介绍基于树的模型。主要是介绍分类树与回归树(classification and regression tree,CART),关于其他树结构的算法比如C4.5之类,这里不介绍。R里做CART有两个包,tree和rpart,里面的函数都蛮好用。 具体介绍一下分类树与回归树的背景,也就是这种方法的大致想法。