线性回归详解 从零开始 从理论到实践
一、线性回归的理解
线性回归假设特征与目标之间为近似的线性关系,也就是说,特征对目标的影响(系数、权重或参数)是恒定的。
1.1、字面含义
“线性回归”由“线性”和“回归”两部分组成。
“线性”表示“像直线那样”(Linear),最典型的为直线方程二元一次方程
y
=
k
x
+
b
y=kx+b
y=kx+b (“元”表示方程中未知数的个数,即变量
x
x
x 和
y
y
y;“次”则表示未知数的最高指数;
k
k
k 和
b
b
b 分别表示斜率和截距,一般为常数,
k
k
k 越大,直线与
x
x
x 轴的夹角越大,越向着
y
y
y 轴靠拢,
b
b
b 越大,直线与
y
y
y 轴的交点越靠上 )
“回归”表示“趋于平常”、“回归到本质”的类似含义。这个词来源于生物统计学家高尔顿,他研究父母和子女身高的关系时发现:身高过高的父母,他们的后代实际身高会相对于父母而矮一些,而身高过矮的父母,他们的后代实际身高会相对于父母而高一些。他认为自然界有一种约束力,使得身高的分布不会向高矮两个极端发展,而是趋于回到中心,就是后代身高会“回归”(Regression)至平均身高的倾向。(如图,相对于父母这条直线,子女这条直线会更贴近于平均身高)
以父母身高为自变量
x
x
x,以子女身高为因变量
y
y
y,通过大量父母和子女身高的数据以及更新,我们能将一条直线,通过调整 斜率
k
k
k 和 截距
b
b
b 进行旋转和平移,不断逼近各数据点去模拟出一条子女的身高关于父母身高的直线方程,通过该方程,我们仅知道父母身高便可估计出子女身高。
综上所述,“线性回归”则表示通过拟合自变量(父母身高)与因变量(子女身高)之间的最佳线性关系(父母身高与子女身高的直线方程),来预测目标变量(待估计的身高)的方法。
1.2、引申
1.2.1、简单回归
在机器学习中,对于类似于上面的直线方程,叫做简单回归,即只有一个自变量
x
x
x 的方程,截距
b
b
b 用
β
0
\beta_0
β0 表示,斜率
k
k
k用
β
1
\beta_1
β1表示,除此之外,由于直线在拟合的过程中,因为有一些没有考虑到的因素而只是接近而不完全等同于真正正确的直线,所以还引入了随机误差或误差项
ϵ
\epsilon
ϵ,当然,误差项越小越好,有时候会干脆舍弃这一项,但是为了公式完整,而将其而保留。简单线性回归模型为:
y
=
β
0
+
β
1
x
+
ϵ
y=\beta_0+\beta_1x+\epsilon
y=β0+β1x+ϵ
通常假设误差项的均值为0,且方差
σ
2
\sigma^2
σ2未知。并且误差是不相关的,即一个误差的值不取决于其它误差的值。
1.2.2、多元线性回归
然而在大部分情况向下,我们拿到的数据并不是只有单一自变量(属性)的数据集,也无法在平面直角坐标系中直观表示数据点,即有两个或两个以上的独立自变量来拟合最佳线性关系来预测因变量,称为多元线性回归(Multivariable Linear Regression)。其模型为:
y
=
β
0
+
β
1
x
1
+
β
2
x
2
+
.
.
.
+
β
n
x
n
+
ϵ
y=\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_nx_n+\epsilon
y=β0+β1x1+β2x2+...+βnxn+ϵ
称为
n
n
n 个回归变量的多元线性回归模型,这一模型描述了回归变量
x
x
x 组成的
n
n
n 维空间的一个超平面。
参数 β j ( j = 0 , 1 , . . . , n ) \beta_j(j=0, 1, ..., n) βj(j=0,1,...,n) 称为回归系数,同样也代表了各自维度的斜率,另外一个深层含义就是表示各自维度的权值(weight)。(斜率越大,对于同一个值的自变量与斜率的乘积越大,表示每个维度的权值也越大,该维度也就显得越重要)
1.2.3、矩阵的形式表示
矩阵形式相比上式,多了数据样本的个数 p p p,所以多了 p p p 行(对于 X X X和 y y y)和 p + 1 p+1 p+1 行(对于 β \beta β和 ϵ \epsilon ϵ)。
对于拥有
n
n
n 个特征值、
p
p
p 个数据样本的数据,可以用一个
p
×
(
n
+
1
)
p\times(n+1)
p×(n+1) 矩阵的形式表示(1这一列都会与
β
0
\beta_0
β0相乘,表示截距,为了表示方便,这里截距和斜率合并了成了
ϵ
\epsilon
ϵ),其中矩阵的每一行为一个数据样本,除开第一列,每一列为一个特征值,
x
i
j
x_{ij}
xij 代表第
i
i
i 个数据样本中第
j
j
j 个特征值,使用矩阵记号表示为:
y
=
X
β
+
ϵ
y=X\beta+\epsilon
y=Xβ+ϵ
或
y
=
β
T
X
+
ϵ
y=\beta^TX+\epsilon
y=βTX+ϵ
其中: y = [ y 1 y 2 ⋮ y p ] y=\begin{bmatrix} y_1&\\ y_2&\\ {\vdots}&\\ y_p&\\ \end{bmatrix} y=⎣⎢⎢⎢⎡y1y2⋮yp⎦⎥⎥⎥⎤, X = [ 1 x 11 x 12 ⋯ x 1 n 1 x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋮ ⋱ ⋮ 1 x p 1 x p 2 ⋯ x p n ] X=\begin{bmatrix} 1&{x_{11}}&{x_{12}}&{\cdots}&{x_{1n}}\\ 1&{x_{21}}&{x_{22}}&{\cdots}&{x_{2n}}\\ {\vdots}&{\vdots}&{\vdots}&{\ddots}&{\vdots}\\ 1&{x_{p1}}&{x_{p2}}&{\cdots}&{x_{pn}}\\ \end{bmatrix} X=⎣⎢⎢⎢⎡11⋮1x11x21⋮xp1x12x22⋮xp2⋯⋯⋱⋯x1nx2n⋮xpn⎦⎥⎥⎥⎤, β = [ β 0 β 1 β 2 ⋮ ϵ p ] \beta=\begin{bmatrix} \beta_0&\\ \beta_1&\\ \beta_2&\\ {\vdots}&\\ \epsilon_p&\\ \end{bmatrix} β=⎣⎢⎢⎢⎢⎢⎡β0β1β2⋮ϵp⎦⎥⎥⎥⎥⎥⎤, ϵ = [ ϵ 0 ϵ 1 ϵ 2 ⋮ ϵ p ] \epsilon=\begin{bmatrix} \epsilon_0&\\ \epsilon_1&\\ \epsilon_2&\\ {\vdots}&\\ \epsilon_p&\\ \end{bmatrix} ϵ=⎣⎢⎢⎢⎢⎢⎡ϵ0ϵ1ϵ2⋮ϵp⎦⎥⎥⎥⎥⎥⎤
1.2.4、回归系数的求解 - 最小二乘法
对于矩阵形式的方程,舍去掉无法获得的误差项 ϵ \epsilon ϵ 后, y y y 与 X X X 都可通过样本数据获得,最后还剩下回归系数 β \beta β 未知,一般使用最小二乘法来估计回归方程中的回归系数。而最小二乘法的使用涉及到残差以及残差平方和。
残差,表示因变量的实际值和回归值(预测值)的差,用来衡量模型与数据点的拟合程度。
残差平方和又称误差平方和,表示因变量的实际值和回归值(预测值)的差的平方和,同样用来衡量模型与数据点的拟合程度,它反映了回归方程以外因素的影响。
残差平方和的几何意义
每一个样本在超平面上都是一个点,而残差平方和要计算同一个自变量的值(设为x),因变量的实际值(设为y)和回归值(设为y_pre)的差距,则相当于使用欧氏距离计算两点间的距离,具有很好的几何意义。而最小二乘法就是试图找到一条直线,使所有样本到直线上的欧氏距离之和最小。
最小二乘法通过最小化残差平方和来找到最佳参数值,将其定义为损失代价函数(即定义真实值与预测值之间的差距的函数,差距越大损失代价越大):
对于非矩阵形式:
J
β
(
β
)
=
arg min
β
∑
i
=
1
p
(
y
i
−
x
i
β
i
−
β
0
)
2
J_{\beta}(\beta)=\argmin_\beta \sum^p_{i=1}(y_i-x_i\beta_i-\beta_0)^2
Jβ(β)=βargmini=1∑p(yi−xiβi−β0)2
- y i y_i yi表示真实值
- x i β i + β 0 x_i\beta_i+\beta_0 xiβi+β0表示回归值
对于矩阵形式:
J
β
(
β
)
=
arg min
β
(
y
−
X
β
)
T
(
y
−
X
β
)
\begin{aligned} J_{\beta}(\beta)=\argmin_\beta (y-X\beta)^T(y-X\beta) \end{aligned}
Jβ(β)=βargmin(y−Xβ)T(y−Xβ)
- y y y表示真实值矩阵或列向量
- X β X\beta Xβ表示回归值矩阵或列向量
矩阵的乘法性质
矩阵一般情况不可直接平方,因为,两个矩阵 A A A和 B B B相乘必须满足 A A A为 m × n m\times n m×n,那么 B B B为 n × k n\times k n×k,即 A A A的列数等于 B B B的行数,得出矩阵 C C C 为 m × k m\times k m×k的矩阵。
假设求 A 2 A^2 A2, A = [ 1 2 3 ] A=\begin{bmatrix} 1& \\ 2& \\ 3&\\ \end{bmatrix} A=⎣⎡123⎦⎤,显然 A × A A\times A A×A是不符合矩阵的乘法定义的,也就无法相乘。试求 A T × A A^T\times A AT×A 则可以得 A T × A = [ 1 2 3 ] × [ 1 2 3 ] = [ 1 × 1 + 2 × 2 + 3 × 3 ] = [ 14 ] A^T\times A=\begin{bmatrix} 1 \ 2\ 3 \end{bmatrix}\times \begin{bmatrix} 1& \\ 2& \\ 3&\\ \end{bmatrix}= \begin{bmatrix} 1\times 1+2\times 2+3\times 3 \end{bmatrix}=\begin{bmatrix}14\end{bmatrix} AT×A=[1 2 3]×⎣⎡123⎦⎤=[1×1+2×2+3×3]=[14]
对应到上述公式中, ( y − X β ) (y-X\beta) (y−Xβ)表示残差,要求残差的平方和,既然无法直接平方,就将其转置乘以其自身,最终为一个 1 × 1 1\times 1 1×1 的矩阵,且结果为内部元素(残差)的平方和。
明白了公式,如何求最小值,就变成了对 J β ( β ) J_\beta(\beta) Jβ(β)求导,即矩阵求导:
矩阵转置的基本性质
( A T ) T = A (A^T)^T=A (AT)T=A
( A + B ) T = A T + B T (A+B)^T=A^T+B^T (A+B)T=AT+BT
( k A ) T = k A T (kA)^T=kA^T (kA)T=kAT
( A B ) T = B T A T (AB)^T=B^TA^T (AB)T=BTAT
( A B C ) T = C T B T A T (ABC)^T=C^TB^TA^T (ABC)T=CTBTAT
扩展:
如果满足 A T = A A^T=A AT=A,即 a i j = a j i ( i , j = 1 , 2 , . . . , n ) a_{ij}=a{ji}(i,j=1,2,...,n) aij=aji(i,j=1,2,...,n),那么 A A A 称为对称矩阵。
设 E β = ( y − X β ) T ( y − X β ) E_\beta=(y-X\beta)^T(y-X\beta) Eβ=(y−Xβ)T(y−Xβ) ,展开得:
E β = ( y − X β ) T ( y − X β ) = ( y T − ( X β ) T ) ( y − X β ) = ( y T − β T X T ) ( y − X β ) = y T y + β T X T X β − β T X T y − y T X β \begin{aligned} E_\beta&=(y-X\beta)^T(y-X\beta) \\ &=(y^T-(X\beta)^T)(y-X\beta) \\ &=(y^T-\beta^TX^T)(y-X\beta) \\ &=y^Ty+\beta^TX^TX\beta-\beta^TX^Ty-y^TX\beta \end{aligned} Eβ=(y−Xβ)T(y−Xβ)=(yT−(Xβ)T)(y−Xβ)=(yT−βTXT)(y−Xβ)=yTy+βTXTXβ−βTXTy−yTXβ
使 E β E_\beta Eβ 对 β \beta β 求导得:
∂ E β ∂ β = ∂ y T y ∂ β + ∂ β T X T X β ∂ β − ∂ β T X T y ∂ β − ∂ y T X β ∂ β \begin{aligned} \frac{\partial E_\beta}{\partial \beta}=\frac{\partial{y^Ty}}{\partial \beta}+\frac{\partial \beta^TX^TX\beta}{\partial \beta}-\frac{\partial \beta^TX^Ty}{\partial \beta}-\frac{\partial y^TX\beta}{\partial \beta} \end{aligned} ∂β∂Eβ=∂β∂yTy+∂β∂βTXTXβ−∂β∂βTXTy−∂β∂yTXβ
由矩阵微分公式
∂
a
T
x
∂
x
=
∂
x
T
a
∂
x
=
a
\begin{aligned}\frac{\partial a^Tx}{\partial x}=\frac{\partial x^Ta}{\partial x}=a\end{aligned}
∂x∂aTx=∂x∂xTa=a,
∂
x
T
A
x
∂
x
=
(
A
+
A
T
)
x
\begin{aligned}\frac{\partial x^TAx}{\partial x}=(A+A^T)x\end{aligned}
∂x∂xTAx=(A+AT)x 可得:
∂
β
T
X
T
X
β
∂
β
=
(
X
T
X
+
(
X
T
X
)
T
)
β
=
(
X
T
X
+
X
T
X
)
β
\begin{aligned} \frac{\partial {\beta}^TX^TX{\beta}}{\partial {\beta}} &=(X^TX+(X^TX)^T)\beta \\ &=(X^TX+X^TX)\beta \end{aligned}
∂β∂βTXTXβ=(XTX+(XTX)T)β=(XTX+XTX)β
∂ β T X T y ∂ β = X T y \begin{aligned} \frac{\partial \beta^TX^Ty}{\partial \beta}=X^Ty \end{aligned} ∂β∂βTXTy=XTy
∂ y T X β ∂ β = ∂ β T ( y T X ) T ∂ β = ∂ β T X T y ∂ β = X T y \begin{aligned} \frac{\partial y^TX\beta}{\partial \beta}=\frac{\partial \beta^T(y^TX)^T}{\partial \beta}=\frac{\partial \beta^TX^Ty}{\partial \beta}=X^Ty \end{aligned} ∂β∂yTXβ=∂β∂βT(yTX)T=∂β∂βTXTy=XTy
综上:
∂
E
β
∂
β
=
0
+
(
X
T
X
+
X
T
X
)
β
−
X
T
y
−
X
T
y
=
2
X
T
X
β
−
2
X
T
y
=
2
X
T
(
X
β
−
y
)
\begin{aligned} \frac{\partial E_\beta}{\partial \beta}&=0+(X^TX+X^TX)\beta-X^Ty-X^Ty \\ &=2X^TX\beta-2X^Ty \\ &=2X^T(X\beta-y) \end{aligned}
∂β∂Eβ=0+(XTX+XTX)β−XTy−XTy=2XTXβ−2XTy=2XT(Xβ−y)
令上式为零可得 β \beta β 的最优解的闭式解(解析解),但由于涉及矩阵逆的计算,比单变量情形要复杂一些,为了简化问题,当 X T X X^TX XTX为满秩矩阵(full-rank matrix)或正定矩阵(positive definite matrix)时,令上式为零可得:
X T X β = X T y X^TX\beta=X^Ty XTXβ=XTy
由于 A A − 1 = E AA^{-1}=E AA−1=E,所以,为了独立出左边的 β \beta β,方程两边同时乘以 ( X T X ) (X^TX) (XTX) 的逆矩阵,可得:
( X T X ) − 1 X T X β = ( X T X ) − 1 X T y β = ( X T X ) X T y \begin{aligned} (X^TX)^{-1}X^TX\beta&=(X^TX)^{-1}X^Ty \\ \beta&=(X^TX)X^Ty \end{aligned} (XTX)−1XTXββ=(XTX)−1XTy=(XTX)XTy
综上,多元线性回归模型的矩阵形式为:
f
(
X
)
=
X
(
X
T
X
)
X
T
y
f(X)=X(X^TX)X^Ty
f(X)=X(XTX)XTy
然而,现实任务中 X T X X^TX XTX 往往不是满秩矩阵。例如存在许多任务中,会出现变量数(属性数)远超过样例数,导致 X X X 的列数多于行数, X T X X^TX XTX 显然不满秩。此时可解出多个 β \beta β(有用的方程组数少于未知数的个数时,没有唯一解,即有无穷多个解),它们都能使均方误差最小化。选择哪一个解作为输出,将由学习算法的归纳偏好决定,常见的做法是引入正则化(regularization)项。(后续介绍:岭回归和套索回归等回归方法,引入正则化项来解决该问题)
矩阵的秩及其求解
矩阵的每一行都代表着一个方程组,每一列都代表着一个未知数,一般情况下,想要求解未知数,有多少个方程组就能解多少个未知数,但这实际上是不正确的,因为这些方程组必须完全不同,即无论如何变换(初等变换)都会不出现相同的情况。例如:
{ x 1 − x 2 − 3 x 3 − x 4 = 1 x 1 − x 2 + 2 x 3 + x 4 = 3 4 x 1 − 4 x 2 + 3 x 3 + 2 x 4 = 10 2 x 1 − 2 x 2 − 11 x 3 − 4 x 4 = 0 \begin{cases} x_1-x_2-3x_3-x_4=1\\ x_1-x_2+2x_3+x_4=3\\ 4x_1-4x_2+3x_3+2x_4=10\\ 2x_1-2x_2-11x_3-4x_4=0\\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧x1−x2−3x3−x4=1x1−x2+2x3+x4=34x1−4x2+3x3+2x4=102x1−2x2−11x3−4x4=0
如何求矩阵的秩?
按照初等行变换原则把原来的矩阵变换成阶梯型矩阵,总行数减去全部为0的行数,即非零的行数就是矩阵的秩。也可以用初等列变换,但一般情况下,行变换足以求解秩。
第一步,第二、三、四行分别加上第一行乘以-1、-4、-2。
{ x 1 − x 2 − 3 x 3 − x 4 = 1 0 + 0 + 5 x 3 + 2 x 4 = 2 0 + 0 + 15 x 3 + 6 x 4 = 6 0 + 0 − 5 x 3 − 2 x 4 = − 2 \begin{cases} x_1-x_2-3x_3-x_4=1\\ 0\ +\ 0\ +\ 5x_3+2x_4=2\\ 0\ +\ 0\ +\ 15x_3+6x_4=6\\ 0\ +\ 0\ -\ 5x_3-2x_4=-2\\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧x1−x2−3x3−x4=10 + 0 + 5x3+2x4=20 + 0 + 15x3+6x4=60 + 0 − 5x3−2x4=−2
第二步,第三、四行分别加上第二行乘以-3、1。
{ x 1 − x 2 − 3 x 3 − x 4 = 1 0 + 0 + 5 x 3 + 2 x 4 = 2 0 + 0 + 0 + 0 = 0 0 + 0 + 0 + 0 = 0 \begin{cases} x_1-x_2-3x_3-x_4=1\\ 0\ +\ 0\ +\ 5x_3+2x_4=2\\ 0\ +\ 0\ +\ \ 0\ \ +\ \ 0\ =\ 0\\ 0\ +\ 0\ +\ \ 0\ \ +\ \ 0\ =\ 0\\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧x1−x2−3x3−x4=10 + 0 + 5x3+2x4=20 + 0 + 0 + 0 = 00 + 0 + 0 + 0 = 0
总行数为4,为零的行数为2,则非零的行数为4-2=2,所以该矩阵不是满秩(即秩为行数4),该矩阵的秩为2,rank(A)=2。
1.2.5、线性模型的变换
从前面可得知,对于样例
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi),我们构建线性回归模型
f
(
x
i
)
f(x_i)
f(xi),使其值不断逼近真实标记
y
y
y,就得到了线性回归模型。线性回归模型可写为:
y
=
β
T
X
y=\beta^TX
y=βTX
令模型预测值逼近
y
y
y 的衍生物,如某样例的输出是在指数尺度上变化,则设定线性模型不断逼近输出的对数,即:
ln
y
=
β
T
X
\ln{y}=\beta^TX
lny=βTX
这叫做“对数线性回归”(log-linear regression),它实际上是在试图让
e
β
T
X
e^{\beta^TX}
eβTX 逼近
y
y
y。
该式子在形式上仍是线性回归,但是实质上已是在求取输入空间到输出空间的非线性函数映射(即不再是类似线性函数y=kx+b那样的直线)
综上,考虑单调可微函数
g
(
⋅
)
g(\cdot)
g(⋅),扩展线性模型:
y
=
g
−
1
(
β
T
X
)
y=g^{-1}(\beta^TX)
y=g−1(βTX)
对数线性回归,
g
(
⋅
)
g(\cdot)
g(⋅)则为
ln
(
⋅
)
\ln(\cdot)
ln(⋅),而
g
−
1
(
⋅
)
g^{-1}(\cdot)
g−1(⋅)则为
e
(
⋅
)
e^{(\cdot)}
e(⋅)。
这样得到的模型称为“广义线性模型”(generalized linear model),其中函数 g ( ⋅ ) g(\cdot) g(⋅) 称为“联系函数”(link function)。显然,对数线性回归是广义线性模型的特例。
单调可微函数
单调函数表示对于整个定义域而言,函数具有单调性。而不是针对定义域的子区间而言。
可微函数是指那些在定义域中所有点都存在导数的函数。可微函数的图像在定义域内的每一点上必存在非垂直切线。因此,可微函数的图像是相对光滑的,没有间断点、尖点或任何有垂直切线的点。
二、算法的简单实现
通过Python中的Numpy库来实现算法,用多元线性回归的矩阵形式表示。自变量 X X X 已知,因变量 y y y 已知,待求出 截距和斜率 β \beta β 即可模拟出线性方程,通过该方程即可预测新的自变量的结果。
class LinearRegression:
def __init__(self):
self.beta = None
def fit(self, X, y):
"""
Fit the regression coefficients via sum of squared errors
通过误差平方和拟合回归系数
"""
# covert a column of 1 into X which adds an intercept
# 向自变量矩阵X增加一列 1,便于与截距进行计算。
X = np.c_[np.ones(X.shape[0]), X]
# 根据前面对beta的推导求得
self.beta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
def predict(self, X):
"""
Generate predictions on a new collection of data points
通过新的数据集生成预测
"""
result_pre = np.dot(X, self.beta)
return result_pre
三、sklearn的使用
线性回归算法在sklearn包中的linear_model模块中class sklearn.linear_model.LinearRegression(*, fit_intercept=True, normalize=False, copy_X=True, n_jobs=None, positive=False)
3.1、方法、参数与属性
模型对象的参数:
参数 | 取值 | 说明 |
---|---|---|
fit_intercept | bool,default=False | 是否计算此模型的截距。如果设置为False,则在计算中将不使用截距(即,数据应居中)。 |
normalize | bool,default=False | fit_intercept设置为False时,将忽略此参数。如果为True,则将在回归之前通过减去均值并除以l2-范数来对回归变量X进行归一化。如果您希望标准化,请先使用, StandardScaler然后通过调用fit 估算器normalize=False。 |
copy_X | bool,default=False | 如果为True,将复制X;否则,它可能会被覆盖。 |
n_jobs | int,default=False | 用于计算的作业数。 |
positive | bool,default=False | 设置为时True,强制系数为正。仅密集阵列支持此选项。 |
一般情况下,不对函数的参数进行设置。
模型类的方法:
将模型类通过样本数据转化成模型实例,即拟合模型。
参数 | 取值 | 说明 | 输出 |
---|---|---|---|
LinearRegression.fit(X, y) | X表示自变量X,即属性值,类似数组或稀疏矩阵;y表示因变量,即结果标签,类似数组 | 通过X和y,拟合模型 | 模型实例 model |
模型实例的方法:
参数 | 取值 | 说明 | 输出 |
---|---|---|---|
model.get_params() | bool,default=True | 获取此估计器的参数 | 各参数以字典形式 |
model.set_params(param=XXX) | 括号内指定param=XXX | 设置此估计器的参数 | 无 |
model.predict(X) | 类似数组或稀疏矩阵 | 使用线性模型进行预测 | 预测值 predictions,类似数组 |
模型实例的属性:
参数 | 说明 |
---|---|
model.coef_ | 回归系数 |
model.rank_ | 用来训练模型的X的秩,仅在矩阵密集时可用 |
model.singular_ | X的奇异值,仅在矩阵密集时可用 |
model.intercept_ | 线性模型的截距,fit_intercept = False时,值为0.0 |
预测结果的评估方法:
参数 | 取值 | 说明 | 输出 |
---|---|---|---|
predictions.score(X, y) | X为新的数据集,y为新数据集的预测结果 | 模型的评估 | R^2决定系数预测 |
3.2、实例应用
3.2.1、简单回归 - 平面坐标点预测
# 导入相关库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# 读取数据
filename = './data/regressor_data.csv'
data = np.loadtxt(open(filename, 'rb'), delimiter=',', skiprows=0)
# 把数据集分为训练集与测试集
num_training = int(0.8 * len(X))
num_test = len(X) - num_training
# X转化为矩阵,y保持为数组
X_train = X[:num_training].reshape((num_training, 1))
y_train = y[:num_training]
X_test = X[num_training:].reshape((num_test, 1))
y_test = y[num_training:]
# 建立线性回归模型,创建模型类
linear_regressor = LinearRegression()
# 根据数据拟合模型
model = linear_regressor.fit(X_train, y_train)
# 使用模型预测训练集
y_train_pred = model.predict(X_train)
# 使用模型预测测试集
y_test_pred = model.predict(X_test)
# 可视化结果
# 正常显示中文标签
plt.rcParams['font.sans-serif'] = ['STKAITI']
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False
# 显示拟合效果
fig = plt.figure(figsize=(15, 6))
plt.subplot(121)
plt.title(u'线性回归训练集结果', {'fontsize': 18})
plt.scatter(X_train, y_train)
plt.plot(X_train, y_train_pred, color='black', linewidth=1, marker='*')
plt.subplot(122)
plt.title(u'线性回归测试集结果', {'fontsize': 18})
plt.scatter(X_test, y_test)
plt.plot(X_test, y_test_pred, color='black', linewidth=2, marker='*')
plt.show()
3.2.2、多元线性回归 - 波士顿房价预测
此数据源于美国某经济学杂志上,分析研究波士顿房价( Boston House Price)(20世纪70年代)的中值的数据集。数据集中的每一行数据都是对波士顿周边或城镇房价的情况描述。
下面是数据集中每一列属性特征,值和名字被分别存放,对应字典型数据结构中的data和names中,这些特征都对房价或多或少、或有或无的有影响,而房价的也同样对应在target中。
特征 | 含义 |
---|---|
CRIM | 城镇人均犯罪率 |
ZN | 住宅用地所占比例 |
INDUS | 城镇中非住宅用地所占比例 |
CHAS | 虚拟变量,用于回归分析 |
NOX | 环保指数 |
RM | 每栋住宅的房间数 |
AGE | 1940 年以前建成的自住单位的比例 |
DIS | 距离 5 个波士顿的就业中心的加权距离 |
RAD | 距离高速公路的便利指数 |
TAX | 每一万美元的不动产税率 |
PTRATIO | 城镇中的教师学生比例 |
B | 城镇中的黑人比例 |
LSTAT | 地区中有多少房东属于低收入人群 |
MEDV | 自住房屋房价中位数(也就是均价) |
# 导入包
from sklearn.linear_model import LinearRegression
# 导入数据集
from sklearn.datasets import load_boston
# 导入自动划分数据集为训练集和测试集的函数
from sklearn.model_selection import train_test_split
# 加载boston数据
boston = load_boston()
# 查看数据结构
boston
# 字典结构,属性值,属性名称和房价分别存于字典的三个键中。
# 提取最重要的几项键值
# 数据-二维数组,每一列代表一个属性,具体在下面的names中体现
X = boston['data']
y = boston['target']
names = boston['feature_names']
print(names)
print(X)
#把数据集划分为训练集和测试集
# 训练集404,测试集102
X_train, X_test, y_train, y_test = \
train_test_split(X,y,test_size=0.2,random_state=125)
#建立线性回归模型
model = LinearRegression().fit(X_train, y_train)
# 用测试集预测房价结果
y_pred = model.predict(X_test)
print(y_pred)
# 回归结果可视化
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,6))
plt.plot(range(y_test.shape[0]), y_test, color='blue', linewidth=1.5, linestyle='-')
plt.plot(range(y_pred.shape[0]), y_pred, color='red', linewidth=1.5, linestyle='-.')
plt.xlim((0,102))
plt.ylim((0,55))
plt.legend(['true', 'predict'])
plt.show()
从图像可以看到预测值与真实值的趋势基本一致,但某些地方预测值的幅度偏小。
回归系数的含义:
# 查看测试集中,第一个住宅的房价,真实与预测的对比
display(y_test[0], y_pred[0])
"""
16.1
21.162891339751
"""
# 查看截距
model.intercept_
"""
40.44599864104647
"""
# 查看回归系数
model.coef_
"""
array([-1.14077285e-01, 4.87165173e-02, -1.20875379e-02, 1.59355488e+00,
-1.89792822e+01, 3.47313008e+00, 3.03276293e-03, -1.60090878e+00,
2.90563127e-01, -1.27238844e-02, -9.76743908e-01, 8.48566379e-03,
-4.87508387e-01])
"""
线性回归的主要优点是可解释性,因为模型的系数代表特征每单位的变化对目标向量的影响。例如,第一个特征是每个居民的犯罪次数。在该模型中,这个特征的的系数约为-0.114,如果将这个系数乘以1000(因为目标向量是以千美元计数的房价),就可以计算人均犯罪每增加一次以后房价的变化。
model.coef_[0]*1000
"""
-114.07728518734139
"""
这表示人均犯罪量每增加一次会使房屋价格降低约350美元。
从前面的概念可以知道,线性回归中的多元线性回归处理多个独立变量对目标值的影响。
于是就产生两个问题:
- 变量之间不独立怎么办?
- 直线已经不适合,需要用曲线来适应数据怎么办?
要解决这个问题,就涉及到了多项式回归。
除此之外,在现实任务中 X T X X^TX XTX 往往不是满秩矩阵或者某些列之间的线性相关性比较大,要解决这个问题,也就涉及到了岭回归、套索回归等。