机器学习-回归总结-标准回归,局部加权回归,岭回归,lasso,前向逐步回归


标准回归函数

使误差平方和最小

minwi=1n(yiw0j=1mxijwj)2

回归系数公式可写为
w=(XTX)1XTy


局部加权线性回归

标准线性回归当样本数据不成线性时,可能会出现欠拟合的现象。可以通过局部加权线性回归解决,给待测电附近的每个点赋予一定的权重,然后在通过最小均方差的方法计算,每次预测均需要遍历所有样本数据集。通过核函数,来给待测点附近的点赋予较高的权重,常用高斯核

minwi=1nwi(yiw0j=1mxijθj)2

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

回归系数为
θ=(XTWX)1XTWy

W 为对角阵。


岭回归

如果数据的特征比样本还要多,则数据的矩阵x不是列满秩,则没有逆,无法求取权值。可以理解为提供的数据量不足以说明特征关系。还有一种解释是,岭回归可以让估计的权值参数波动的范围变小,可以理解为有两个特征a,b,但是a,b高度相关,所以w1,w2之间可能相互抵消, y=w1a+w2b ,当把 w1 变得很大时,将 w2 变成绝对值很大的复数,则可能对结果影响非常小。这会导致不同样本拟合出的 w1,w2 差距很大,模型的可解释性不高。通过岭回归,可以限制 w1,w2 的范围。
岭回归的数学公式可以写为:

minwi=1n(yiw0j=1mxijwj)2+λj=1mw2j

上式等价于:
minwi=1n(yiw0j=1mxijwj)2s.t.  j=1mw2jλ

λinf wi0 。通过引入惩罚项,可以限制所有 wi 之和。
其回归系数公式可写为 :
w=(XTX+λI)1XTy

避免了因为样本数小于特征数,而使X列不满秩导致的无法求逆的问题。


lasso

岭回归限定了回归系数平方和不能大于 λ 。使用普通的最小二乘法在当两个特征相关时,可能会出现一个很大的正系数以及一个很大的负系数,通过上述限制可以很好的避免这个问题。与岭回归类似,另一个缩减方法lasso也对回归系数做了限定。

i=1m|wi|λ

睢县约束形式稍作变化,但是结果大相径庭。但计算复杂度大大增加,需使用二次规划的算法。前向逐步回归是一个更简单的算法。


前向逐步回归

前向逐步回归可以得到与lasso差不多的效果,但是更加简单,易于实现。属于一种贪心算法,每一步都尽可能的减小误差。一开始,所有的权重都为1,然后每一步所做的决策是对每个权重增加或者减少一个很小的值。逐步线性回归的优点在于它可以帮助人们理解现有的模型并作出改进,当构建了一个模型后,可以运行该算法找出重要的特征,这样就可能及时停止对那些不重要特征的收集。
伪代码如下:

数据标准化,使其分布满足0均值和单位方差
每次迭代:(每一次迭代只改变一个参数的大小)
    设置当前最小误差lowestError为正无穷
    对每个特征:
        增大或者减小:
            改变一个系数得到一个新的W
            计算新W下的误差
            如果误差Error小于当前最小误差lowestError:设置Wbest等于当前的W
        将W设置为新的Wbest

代码

import numpy as np
from numpy import *

def regularize(xMat):#regularize by columns
    inMat = xMat.copy()
    inMeans = np.mean(inMat,0)   #calc mean then subtract it off
    inVar = np.var(inMat,0)      #calc variance of Xi then divide by it
    inMat = (inMat - inMeans)/inVar
    return inMat

def loadDataSet(fileName):      #general function to parse tab -delimited floats
    numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields 
    dataMat = []; labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr =[]
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat
def rssError(yArr,yHatArr):
    return (yArr-yHatArr).T*(yArr-yHatArr)


def stageWise(xArr,yArr,eps=0.001,numIt=5000):
    xMat = np.mat(xArr)
    yMat = np.mat(yArr).T
    yMean = np.mean(yMat,0)
    yMat = yMat - yMean
    xMat = regularize(xMat)
    m,n = np.shape(xMat)
    ws = np.zeros((n,1))
    returnMat = np.zeros((numIt,n))

    for i in range(numIt):
        lowestError = np.inf
        for j in range(n):
            for sign in [-1,1]:
                wsTest = ws.copy()
                wsTest[j] += + sign*eps
                yTest = xMat * wsTest
                rssE = float(rssError(yMat,yTest))
                if rssE < lowestError:
                    wsMax = wsTest.copy()
                    lowestError = rssE
        ws = wsMax.copy()
        returnMat[i,:] = ws.T
    return returnMat

data,label = loadDataSet('abalone.txt')
returnMatrix = stageWise(data,label)
print(returnMatrix)

偏差与方差

偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据。
方差:多次采用不同样本集训练,使用不同模型预测同一点的偏差。也有文献说是,多次训练模型的系数的差异大小。
机器学习-回归总结-标准回归,局部加权回归,岭回归,lasso,前向逐步回归_第1张图片

偏差方差折中与模型测试误差的关系,以及模型复杂度。
机器学习-回归总结-标准回归,局部加权回归,岭回归,lasso,前向逐步回归_第2张图片

方差与偏差的权衡

你可能感兴趣的:(机器学习,回归,机器学习)