预测数值型数据——回归
总结几种数值回归的例子:线性回归、局部加权线性回归、岭回归、前向逐步回归。
线性回归
回归的目的是预测数值型的目标值。
线性回归意味着可以将输入项乘以一些常量,再将结果加起来得到输出。
非线性回归并不是如此。这里只探讨线性回归。
线性回归的计算表达式,也就是所谓的回归方程。求方程里的回归系数的过程就是回归。怎样从一大堆数据里求出回归方程呢?
假定输入数据存放在矩阵 X \rm{X} X中,回归系数存放在向量 w \rm w w中。那么对于给定的数据 X \rm X X,预测结果将会通过 Y = X T w \rm Y=\rm X^T\rm{w} Y=XTw给出。现在的问题是,手里有一堆 X \rm X X和对应的 y y y,怎么能找到 w \rm w w呢?
一个常用的方法就是找出使误差最小的
w
\rm w
w。这里的误差是指预测
y
y
y值和真是
y
y
y值之间的差值,使得该误差的简单累加将使得正差值和负差值相互抵消,所以我们采用平方误差。平方误差可以写作:
∑
i
=
1
m
(
y
i
−
x
i
T
w
)
2
\sum_{i=1}^m(y_{i}-x_{i}^Tw)^2
i=1∑m(yi−xiTw)2
用矩阵表示还可以写作
(
y
−
X
w
)
T
(
y
−
X
w
)
(y-\rm Xw)^T(y-\rm Xw)
(y−Xw)T(y−Xw)。如果对
w
\rm w
w求导,得到
X
T
(
Y
−
X
w
)
\rm X^T(Y-\rm Xw)
XT(Y−Xw),零其等于零,可解得:
w
^
=
(
X
T
X
)
−
1
X
T
y
\rm \hat w = (\rm X^TX)^{-1}X^Ty
w^=(XTX)−1XTy
要注意的是,上式中包含了求逆符号,也就是需要对矩阵求逆,因此这个方程只在逆矩阵存在的时候适用。然而矩阵的逆可能不存在,因此写代码的时候要在代码中加一条判断语句。
python中求行列式的函数:
# python版本:3.10
from numpy import *
linalg.det(X)
局部加权线性回归
线性回归求的是具有最小均方误差的无偏估计,所以它有可能出现欠拟合现象。如果模型欠拟合将不能取得最好的预测结果。所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。
局部加权线性回归(Locally Weighted Linear Regression,LWLR)给待预测点附近的每个点赋予一定的权重,然后在这个子集上基于最小均方差来进行普通的回归。这个方法接的回归系数
w
\rm w
w的形式如下:
w
^
=
(
X
T
W
X
)
−
1
X
T
W
y
\rm \hat w = (\rm X^TWX)^{-1}X^TWy
w^=(XTWX)−1XTWy
其中
W
\rm W
W是一个权重,用来给每个数据点赋予权重。
LWLR使用“核”来对附近的点赋予更高的权重。最常用的核就是高斯核,其对应的权重如下:
w
(
i
,
i
)
=
e
x
p
(
a
b
s
(
x
(
i
)
−
x
)
−
2
k
2
)
w(i,i) = \rm {exp}(\frac{abs(x^{(i)}-x)}{-2k^2})
w(i,i)=exp(−2k2abs(x(i)−x))
这样就构建了一个只含对角元素的权重矩阵
W
\rm W
W,并且点
x
\rm x
x与
x
(
i
)
\rm x(i)
x(i)越近,
w
(
i
,
i
)
w(\rm i,i)
w(i,i) 将会越大。上式中的
k
\rm k
k是一个需要用户指定的参数,它决定了对附近的点赋予多大的权重。
LWLR也存在一个问题,即增加了计算量。
岭回归
如果数据的特征比样本点还多,在求逆的时候就会出错,因为输入数据的矩阵不是满秩矩阵。非满秩矩阵在求逆时会出现问题。
简单说来,岭回归就是在矩阵
X
T
X
\rm {X^TX}
XTX上加一个
λ
I
\lambda I
λI从而使矩阵非奇异,进而能对
X
T
X
+
λ
I
\rm {X^TX} + \lambda \rm I
XTX+λI求逆。其中矩阵
I
\rm I
I是一个对角线元素全为1,其他元素全为0的
m
×
m
\rm m\times m
m×m的单位矩阵。这时,回归系数的计算公式将变成:
w
^
=
(
X
T
X
+
λ
I
)
−
1
X
T
y
\rm \hat w = (\rm X^TX+\lambda \rm I)^{-1}X^Ty
w^=(XTX+λI)−1XTy
岭回归中的"岭"是什么?
岭回归使用了单位向量乘以常量 λ \lambda λ,我们观察其中的单位矩阵 I I I,可以看到值1贯穿整个对角线,其余元素都是0.形象地,在0构成的平面上有一条1组成的“岭”,这就是岭回归中的“岭”的由来。
岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。这里通过引入 λ \lambda λ来限制了所有 w \rm w w之和,通过引入该惩罚项,能够减少不重要的参数,这个技术在统计学中也叫“缩减”(shrinkage)。
缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果。
前向逐步回归
该算法可以得到与lasso差不多的效果,但是比lasso简单。它属于一种贪心算法,即每一步都尽可能减少误差。一开始,所有的权重都设为1,然后每一步所做的决策时对某个权重增加或减少一个很小的值。
该算法的伪代码:
数据标准化,使其分布满足0均值和单位方差
在每轮迭代过程中:
设置当前最小误差lowestError为正无穷
对每个特征:
增大或缩小:
改变一个系数得到一个新的w
计算新w下的误差
如果误差Error小于当前最小误差lowestError:设置wbest等于当前的w
将w设置为新的wbest
逐步线性回归算法主要的有点在于它可以帮助人们理解现有的模型并做出改进。当构建了一个模型后,可以运行该算法找出重要的特征,这样就有可能及时停止对那些不重要特征的收集。最后,如果用于测试,该算法每100次迭代后就可以构建出一个模型,可以使用类似于10折交叉验证的方法比较这些模型,最终选择使误差最小的模型。