aihot  2017-10-11 22:22:22  机器学习 |   查看评论   

  实际上,岭回归通过增加正则项,就是为最小二乘法增加了这样的约束条件:

 

  除了岭回归,还有一种缩减方法叫做lasso,只不过它的约束条件是这样:

 

  用绝对值取代了平方和,虽然变化非常细微,但计算复杂度却大大增加了,我们要介绍一个更简单的方法,叫做『前向逐步回归』。

  前向逐步回归是一种贪心算法,一开始所有的系数的权重都为1,然后每一步都是对某个权重增加或减少一个很小的值。

  首先固定其他特征,只看第一个特征,看系数值是增加好还是减小好,处理完成后再处理第二个特征,不断循环往复,处理完全部特征了再从第一个特征重新开始处理,一直到系数都稳定下来。

树回归

  上一节介绍了多种线性回归算法,但是对于某些复杂的数据集,并不能建立全局的回归方程,所以我们希望结合树的思想,先将数据集进行分类,将数据集切分成很多份易建模回归的数据,然后再用前面的回归方法来求得回归方程。

  前面我们讲过ID3决策树算法,在那里我们一次分类就要消耗一个特征,在后面的分类过程中,这个被消耗掉的分类就不再起作用,这样的分类有时候太过迅速,浪费了一些信息,而且ID3决策树也只能处理离散型的数据,如果要处理连续性数据需要先经过一步预处理,但是这种处理会破坏连续性数据原本的内在性质。

  为了解决前面提到的问题,我们介绍CART树(分类回归树)构建算法,它利用二元切分法处理连续型变量,即每次把数据切为两份,分别进入左子树和右子树。基于CART可以构建回归树,也可以构建模型树。

  回归树概要,加载数据集,随后选定最好的划分特征和划分特征值,将原数据集划分成左子树和右子树,随后不断迭代划分,直到满足停止条件。当回归树构建完成后,我们用每个叶子节点数据的均值来代表这个叶子节点下的所有数据。

  构建回归树的过程与ID3算法构建树的过程非常相似,接下来需要确定的是两点,一个是在构建回归树的过程中怎样选定最好的划分特征和划分特征值,第二个是应该用什么作为提前停止条件。

  在ID3算法中,我们每次选择让整个数据集香农熵减小最多(信息增益最大)的特征对数据集进行划分,而在回归树算法中因为要处理的是连续性的数值变量,直接采用总方差来度量分类的有效程度,遍历所有特征及其所有可能的取值,每次选择让整个数据集总方差减小最多的特征及划分特征值对数据进行划分。

  回归树算法中需要提前设定两个参数以控制算法的停止时机,一个是容许的误差下降值,一个是切分的最少样本数。也就是如果这次最佳划分使总方差的下降值小于预定阈值,或划分后的两个子集存在某个子集大小小于预定阈值,则停止继续划分。

  使用CART构建树时还会涉及到树剪枝的问题,一棵树如果节点过多,表示该模型可能对数据进行了过拟合,我们可以通过交叉验证来判断是否发生了过拟合,通过降低决策树复杂度来避免过拟合的过程称为剪枝,提前终止条件实际上就是预剪枝,另一种形式的剪枝需要使用训练集和测试集,称作后剪枝。

  如果使用预剪枝,我们需要不断的修改停止条件,而后剪枝则不需要用户指定参数,但相对的,后剪枝不如预剪枝有效。

  后剪枝需要在树构建完成后使用测试集,自上而下找到叶节点,然后尝试合并相邻的叶节点,如果合并叶节点后能够降低在测试集上的误差,那我们就合并掉两个叶节点。

  接下来要讲的是模型树,模型树与回归树的区别在于,每个叶子节点下不再是常数,而是用线性函数来对数据做拟合,整棵模型树成为了一个分段线性函数。

 

  比如上图这样的数据就相当适合采用模型树来建模,整个数据集会被分为两个叶子节点,每个叶子节点下是一个线性函数。

  其划分的基本思想仍然是找让整个数据集总误差最小的划分方式,回归树中的方法不能再用,但是我们在上一节讲过了相当多的线性模型,也讲过了它们对应的计算误差的方式(平方误差),我们只要在每次尝试划分后对每个叶子节点下用线性模型去拟合该节点下的数据,然后分别计算误差值,选取使总误差最小的划分方式即可。

  树回归在预测复杂数据集时会比简单的线性模型更有效。

无监督学习

  前两部分讲的都是有监督学习,所做的大多是:『对于输入数据X能预测变量Y』,而无监督学习要回答的问题是:『从数据X中能发现什么』。

K-均值聚类算法

  一句话概要,首先,选择k个初始点作为质心,然后为每个样本点找距其最近的质心,并将其分配给该质心所对应的簇,然后将每个簇的质心更新为该簇所有点的平均值,既然质心位置改变了,那对样本点的划分自然也要随之改变,如此不断迭代,直到对所有样本点的分类都不再改变,也即算法收敛。

  既然存在质心的概念,就要使用某种距离度量方式计算,我们当然可以用欧式距离公式,也可以利用余弦距离,根据两者夹角的大小表示距离的大小。

  这里我举一个利用K-均值聚类算法进行文本分类的例子,类似于前面的朴素贝叶斯算法,我们为每篇文档建立一个词向量,只不过用的既不是词袋模型也不是词集模型,首先去掉单词表中的所有的停用词,之后每个词的对应位置放置的,是这个词在这篇文档当中的TF-IDF值,若该词在该文档中所占比例越大,则其TF值越大,而若该词在所有文档中的出现比例越高,则其IDF值越小,最后计算其TF*IDF的值(TF-IDF值),作为该词表示所在文档主题的能力。这样我们就得到了每篇文档的词向量,随后走K-均值聚类算法的流程,先给出若干随机向量,对全部文档进行第一次分类,这里的距离度量方式采用的就是余弦距离,通过判断两个向量夹角的余弦值来描述两者间的距离关系,若其夹角为0度,则余弦值为1,若其夹角为180度,则余弦值为-1,认为夹角余弦值越大则两篇文档越相近,越小则两者越无关。

  接下来我们要谈一下K-均值聚类算法所存在的问题,首先K值是由用户定义的,很多时候用户并不知道要将K设置成多少,而且又因为其初始质心的设置是依靠随机生成,所以K-均值算法会收敛到局部最小值而不是全局最小值。

  我们通过SSE(误差平方和)来度量聚类效果,SSE值越小说明数据点越接近它们对应的质心,我们当然可以通过增加簇的个数来降低SSE,但这违背了我们聚类的目标,我们希望在保持簇数目不变的情况下提高簇的质量。

  我们可以采用这样的后处理来提高K-均值聚类算法的聚类质量:首先将SSE值最大的簇拆分成两个簇,具体方法可以是对该簇内的数据运行K-均值聚类算法,同时将K设置为2,而且,为了保证总的簇数不变,我们还要将两个质心合并,我们可以选择合并两个最近的质心,或者合并两个使得SSE增幅最小的质心。

  为了克服K-均值聚类算法可能会收敛到局部最小值的问题,有人提出了二分K-均值算法,一句话概要,该算法首先将所有点作为一个簇,然后将该簇一分为二,之后选择其中一个簇继续进行划分,选择哪个簇取决于对其划分是否可以最大程度降低SSE值(是不是与构建树的过程有些相似),上述基于SSE的划分过程不断重复,直到得到用户指定的簇数目为止。

  
 

除特别注明外,本站所有文章均为 人工智能学习网 原创,转载请注明出处来自浅谈机器学习基础(下)

留言与评论(共有 0 条评论)
   
验证码: