机器学习实战-基本算法总结2

机器学习基本算法总结

☞监督学习——回归

代码在这,基于python3(原书代码是python2)

这里只是一个总结,原书已经讲解很清楚了,不清楚的直接看代码

目录

==========================

一、预测数值型数据:回归

1.线性回归最佳拟合

———————————————————————————————————- 
- 优点:结果易于理解,计算上不复杂。
- 缺点:对非线性的数据拟合不好。
- 适用数据类型:数值型和标称型数据。
———————————————————————————————————- 
———————————————————————————————————- 
- 训练算法:找到回归系数。
- 测试算法:使用幻或者预测值和数据的拟合度,来分析模型的效果。
- 使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。
———————————————————————————————————- 

  前面讲到的基本都是分类问题,分类问题的目标变量是标称型数据,或者离散型数据。而回归的目标变量为连续型,也即是回归对连续型变量做出预测,最直接的办法是依据输入写出一个目标值的计算公式,这样,对于给定的输入,利用该公式可以计算出相应的预测输出。这个公式称为回归方程,而求回归方程显然就是求该方程的回归系数,而一旦有了这些回归系数,再给定输入,就可以将这些回归系数乘以输入值,就得到了预测值。
  线性回归,简单而言,就是将输入项分别乘以一些常量,再将结果加起来得到输出。假设输入数据存放在矩阵x中,而回归系数存放在向量w中,那么对于给定的数据x1,预测结果将会通过y=xTw给出。那么,如何才能够找出最佳的回归系数向量w呢?采用最小化平方误差来进行度量。

(1)(yixiTW)2,i=1,2,3......N(N)

这样,用矩阵表示可以写成(yX·w)T(yX·w) 因为要求函数的极小值,再对w求导得,xT(yX·w) ,则令其等于0,即可得到w的最优解:

w=(XTX)1XT·y

 需要注意的是,公式中,出现的求逆运算,而对于任意一个矩阵而言,不一定可逆,所以,我们在实际写代码过程中,需要事先确定矩阵是否可逆,否则很可能会造成程序出现严重的错误。
  此外,我们知道线性回归的方程的一般形式为:y=wx+b ;即存在一定的偏移量b,于是,我们可以将回归系数和特征向量均增加一个维度,将函数的偏移值b也算作回归系数的一部分,占据回归系数向量中的一个维度,比如w=(b,w1,w2,...,wN) 。相应地,将每条数据特征向量的第一个维度设置为1.0。
  
  最后,通过上面的数据我们可以得到一个拟合的线性回归模型,但是我们还需要验证该模型的好坏。如果将所有样本的真实值y保存于一个数列,将所有的预测值yHat保存在另外一个数列,那么我们可以通过计算这两个序列的相关系数,来度量预测值与真实值得匹配程度。相关性最好为1,最差为0,表示不相关。
  

2.局部加权线性回归

  线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计。显而易见,如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引人一些偏差,从而降低预测的均方误差。
  解决上述问题的一个方法即是局部加权线性回归(LWLR)。即在算法中,为每一个待预测的数据点附近的赋予一定的权重,越靠近预测点的数据点分配的权重越高。这里,我们采用高斯核函数为预测点附近的数据点分配权重,即:
  

w(i,i)=exp(|x(i)x|2k2)

  其中参数k可以由用户自己定义。显然,有上面高斯核函数可知,矩阵W是一个只含对角元素的矩阵。这样,回归系数的解的形式变为:w=(XTWX)1(XTWY)
  需要说明的是,当为某一预测点附近的数据点分配权重时,由高斯核函数公式可知,与预测点越相近的点分配得到的权重越大,否则权重将以指数级衰减,与预测点足够远的数据点权重接近0,那么这些数据点将不会在该次预测中起作用。当然,用户可以通过自己设定参数k来控制衰减的速度,如果k值较大,衰减速度较慢,这样就会有更多的数据点共同参与决策;否则,如果参数k非常小,那么衰减速度极快,参与预测点决策的数据点就很少。所以,我们在实验中,应该多选择几组不同的k值,得到不同的回归模型,从而找到最优的回归模型对应的k值。
  此外,局部加权线性回归也存在一定的问题,相对于普通的线性回归,由于引入了权重,大大增加了计算量,虽然取得了不错的拟合效果,但也相应地付出了计算量的代价。

3.缩减系数”理解”数据的方法

  试想,如果此时数据集样本的特征维度大于样本的数量,此时我们还能采取上面的线性回归方法求出最佳拟合参数么?显然不可能,因为当样本特征维度大于样本数时,数据矩阵显然是非满秩矩阵,那么对非满秩矩阵求逆运算会出现错误。

3.1 岭回归

  简单而言,岭回归即是在矩阵xTx 上加入一个λI 从而使得矩阵非奇异,进而能对矩阵XTX+λI 求逆。其中矩阵I 是一个单位矩阵,即对角线上元素皆为1,其他均为0。这样,回归系数的计算公式变为:
  

w=(XTX+λI)1(XTy)

  公式中通过引入该惩罚项,从而减少不重要的参数,更好的理解和利用数据。此外,增加了相关约束:Σwi2<=λ ,即回归系数向量中每个参数的平方和不能大于λ,这就避免了当两个或多个特征相关时,可能出现很大的正系数和很大的负系数。岭回归就是一种缩减方法,通过此方法可以去掉不重要的参数,更好的理解数据的重要性和非重要性,从而更好的预测数据。 
  在岭回归算法中,通过预测误差最小化来得到最优的λ 值。数据获取之后,将数据随机分成两部分,一部分用于训练模型,另一部分则用于测试预测误差。为了找到最优的λ ,可以选择多个不同λ 值重复上述测试过程,最终得到一个使预测误差最小的λ
  注:岭回归中数据需要进行标准化处理,即数据的每一维度特征减去相应的特征均值之后,再除以特征的方差。可以看出,当λ非常小时,系数与普通回归一样。而λ非常大时,所有回归系数缩减为0。这样,可以在中间的某处找到使得预测结果最好的λ。
3.2 逐步前向回归

  逐步前向回归是一种贪心算法,即每一步都尽可能的减小误差。从一开始,所有的权重都设为1,然后每一步所做的决策是对某个权重增加或减少一个较小的数值。
数据标准化,使其分布满足均值为0,和方差为1
在每轮的迭代中:
设置当前最小的误差为正无穷
对每个特征:
 增大或减小:
  改变一个系数得到一个新的w
  计算新w下的误差
  如果误差小于当前最小的误差:设置最小误差等于当前误差
  将当前的w设置为最优的w,
将本次迭代得到的预测误差最小的w存入矩阵中
返回多次迭代下的回归系数组成的矩阵

前向逐步回归算法也属于缩减算法。它主要的优点是可以帮助我们更好地理解现有的模型并作出改进。当构建出一个模型时,可以运行该算法找出重要的特征,这样就可能及时停止对不重要特征的收集。同样,在算法测试的过程中,可以使用s折交叉验证的方法,选择误差最小的模型。

此外,当我们不管是应用岭回归还是前向逐步回归等缩减算法时,就相应的为模型增加了偏差,与此同时也就减小了模型的方差。而最优的模型往往是在模型偏差和方差的折中时获得。否则,当模型方差很大偏差很小时模型复杂度很大而出现过拟合现象,而方差很小偏差很大时而容易出现欠拟合现象。因此,权衡模型的偏差和方差可以做出最好的预测。

总结

(1) 回归与分类的区别,前者预测连续型变量,后者预测离散型变量;回归中求最佳系数的方法常用的是最小化误差的平方和;如果xTx 可逆,那么回归算法可以使用;可以通过预测值和原始值的相关系数来度量回归方程的好坏。

(2) 当特征数大于样本总数时,为解决xTx 不可逆的问题,我们可以通过引入岭回归来保证能够求得回归系数。

(3) 另外一种缩减算法是,前向逐步回归算法,它是一种贪心算法,每一步通过修改某一维度特征方法来减小预测误差,最后通过多次迭代的方法找到最小误差对应的模型。

(4) 缩减法可以看做是对一个模型增加偏差的同时减少方差,通过偏差方差折中的方法,可以帮助我们理解模型并进行改进,从而得到更好的预测结果。

==============================================================

二、树回归<

  
优点:可以对复杂和非线性的数据建模。
缺点:结果不易理解。
适用数据类型:数值型和标称型数据。

训练:大部分时间都花费在叶节点树模型的构建上。
测试:使用测试数据上的^ 值来分析模型的效果。
使用:使用训练出的树做预测,预测结果还可以用来做很多事情

==================================================
  尽管线性回归包含了一些强大的方法,但这些方法创建的模型需要拟合所有的样本数据。当数据拥有众多特征并且特征之间的关系比较复杂时,构建全局线性模型就会非常困难。并且,在实际生活中很多问题都是非线性的,很难通过全局线性模型来拟合所有数据。
  解决上述非线性数据的拟合问题的一个可行的方法是,将数据集切分成很多份容易建模的数据,然后再利用线性回归方法来对切分后的数据子集分别建模如果切分后仍难以拟合线性模型就继续切分。这样,就可以比较好的拟合全局数据。

1. CART算法——回归树

  CART算法,即分类回归树算法,该算法既可以用于分类,也可以用于回归。该算法数据的建模方法为二元切分法。
  ID3决策树算法通过不断将数据切分成小数据集,知道所有目标变量完全相同,或者数据不能再切分为止;决策树是一种贪心算法,要在给定时间内找到最佳选择,并并不关心全局最优问题。
  ID3决策树算法存在以下两个问题:
  (1)ID3算法每次选取最佳特征来分割数据,并按照该特征所有的取值来切分,即有几种可能的取值,数据就会被切分成几份。而一旦按该特征切分后,该特征在之后的算法执行过程中便不再起作用了,所以存在一些观点认为该算法过于迅速。
  (2)ID3算法并不能处理连续型特征,只能事先将连续性特征转化为离散型,才能使用。显然,在转换过程中会破坏连续型变量的内在性质。
  
  相比于ID3算法,显然CART算法更有优势,因为我们知道CART算法不仅可以用于分类,还可以用于回归,这里的回归即是处理连续型特征的体现。CART算法之所以能够处理连续型特征,就在于采用了二元切分法,而使用二元切分法易于对树构建过程进行调整以处理连续型特征。二元切分法的具体过程为每次将数据集划分为两份,如果数据的某特征值大于给定值就进入左子树,否则就进入右子树

CART算法树的构建:

  CART算法既可以用于分类也可以用于回归,回归树与分类树思路类似,但叶节点的数据不是类型不是离散型,而是连续型。这里,我们将通过CART算法构建两种树,一种是回归树,其每个叶节点包含单个值;另外一种是模型树,其每个叶节点包含一个线性方程。
  首先,这里采用跟ID3算法中使用相同的字典结果来存储构建树的数据结构。在这里,CART算法构建树包含四个主要元素,待切分特征,待切分的特征值,左子树(当数据不能再切分时,也可以是叶节点),右子树
  

CART算法用于回归:

对每个特征:
  对每个特征值:
    将数据集切分为两份
    计算切分误差
    如果当前误差小于当前最小误差,那么将当前切分设定为最佳切分并更新最小误差
返回最佳切分的特征和阈值

树剪枝

上面我们利用回归树构建算法构建了回归树,虽然看起来效果不错,但是我们还要需要某种有效的措施来检查构建过程是否得当。这就是树剪枝技术,它通过对决策树剪枝的方式来达到更好的预测效果, 一棵树如果节点过多,表明该模型可能对数据进行了过拟合,一旦发生了过拟合,就表明该模型对训练数据拟合效果非常好,而对其他的测试数据拟合效果很差的情况。所以,为避免过拟合,我们需要通过剪枝的方式来降低模型的复杂度。
剪枝包括预剪枝和后剪枝两种方法。

(1)预剪枝
  预剪枝的方法,即通过设置合理的切分终止条件tolS,tolN,在树构建的过程中进行剪枝过程,从而防止过拟合。在预剪枝过程中,我们需要不断的修改停止条件tolS,tolN来得到较好的结果,这显然不能算作是一种好的办法,因为,寻找到合适的停止条件意味着需要更多的时间损耗。而后剪枝则不需要用户指定参数,是一种比较理想的剪枝方法
  
(2)后剪枝
  后剪枝的方法意味着我们需要两个不同的数据集,一个作为训练集,另外一个作为测试集。训练集构建出来的树需要足够大,足够复杂,这样才能便于后面的剪枝。接下来,从上而下找到叶节点,用测试集判断将这些叶节点合并是否能降低测试误差。如果是那就将这些叶节点合并。
基于已有的树切分测试数据:
  如果存在任一子集是一棵树,则在该子集上递归剪枝过程
  计算将当前两个叶节点合并后的误差
  计算不合并的误差
  如果合并会降低误差,就将两个叶节点合并  

模型树构建

  回归树计算误差的方法是,首先计算数据集目标变量值的均方差,再乘以数据集的样本数;而模型树的误差计算方法为:首先计算数据集各个样本目标变量的真实值与预测值得差值的平方,然后再进行累加,即类似于前面的平方损失函数。
  上面的构建的回归树,是将叶节点设定为常数值来进行建模。还有一种方法是把叶节点设为分段线性函数,这里的分段线性是指模型由多个线性片段组成。因为,数据集不是线性的,那么我们很难通过全局线性函数来拟合数据,所以采用将数据集分段,分段后的数据都满足线性要求,这样就分别构建出相应的线性方程,再将分段线性模型组合起来就是全局的模型。比如,下图分段线性数据,显然使用两条直线组合来拟合会比一条直线拟合效果要好。

小结

  在实际生活中,数据集经常会包含一些复杂的相互关系,输入数据与目标变量之间呈现出非线性关系。对这些复杂数据建模,我们可以采用树回归的方法来对数据进行分段线性预测,分段线性函数包括分段常数(回归树模型)和分段直线方程(模型树);二者的区别在于构建树的叶节点模型上,若叶节点采用分段常数则是回归树,若使用的模型是线性回归方程则称为模型树。
  上面用到的树构建方法,是基于CART算法的二元切分法,通过计算最小误差的方法得到切分该数据集的最佳特征以及最佳的特征取值,从而来对数据集进行二元划分。
  很显然,CART算法是一种贪心算法,更多的是关心最佳切分特征及特征值的选取上,而不关注全局模型的最优解。所以,大多时候,该算法构建的树会产生过拟合情况,即对训练数据拟合很好,而对测试数据拟合效果较差。
  预剪枝和后剪枝是两种对决策树剪枝从而降低模型复杂度的方法,前者在树构建的过程中边构建边剪枝,后者则是先利用训练集构建出树,在对构建的树利用测试集进行剪枝处理;从效果来看,预剪枝要比后剪枝要好;但是,预剪枝需要用户提供合理的输入,对用户输入的参数较为敏感,从这方面来看,后剪枝因为不需要用户的参与而更加理想。在实际的构建树过程中,往往采用两种方法结合的方法对于寻求最佳模型效果较好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章