Machine-Learning:第1章 线性回归


本章思维导图

在这里插入图片描述


本章内容概要

1、线性回归的原理

进入一家房产网,可以看到房价、面积、厅室呈现以下数据:

面积(x1)厅室数量(x2)价格(万元)(y)
643225
593185
653208
1164508
………………

我们可以将价格和面积、厅室数量的关系习得为 f ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 f(x)=\theta_0+\theta_1x_1+\theta_2x_2 f(x)=θ0+θ1x1+θ2x2,使得 f ( x ) ≈ y f(x)\approx y f(x)y,这就是一个直观的线性回归的样式。

小练习: 这是国内一个房产网站上任意搜的数据,有兴趣可以找个网站观察一下,还可以获得哪些可能影响到房价的因素?可能会如何影响到实际房价呢?

线性回归的一般形式:
有数据集 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } \{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\} {(x1,y1),(x2,y2),...,(xn,yn)},其中, x i = ( x i 1 ; x i 2 ; x i 3 ; . . . ; x i d ) , y i ∈ R x_i = (x_{i1};x_{i2};x_{i3};...;x_{id}),y_i\in R xi=(xi1;xi2;xi3;...;xid),yiR
其中n表示变量的数量,d表示每个变量的维度。
可以用以下函数来描述 y y y x x x之间的关系:

f ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ d x d = ∑ i = 0 d θ i x i \begin{aligned} f(x) & = \theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_dx_d \\ & = \sum_{i=0}^{d}\theta_ix_i \\ \end{aligned} f(x)=θ0+θ1x1+θ2x2+...+θdxd=i=0dθixi

如何来确定 θ \theta θ的值,使得 f ( x ) f(x) f(x)尽可能接近y的值呢?均方误差是回归中常用的性能度量,即:

J ( θ ) = 1 2 ∑ j = 1 n ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac{1}{2}\sum_{j=1}^{n}(h_{\theta}(x^{(i)})-y^{(i)})^2 J(θ)=21j=1n(hθ(x(i))y(i))2

我们可以选择 θ \theta θ,试图让均方误差最小化。

极大似然估计(概率角度的诠释)
下面我们用极大似然估计,来解释为什么要用均方误差作为性能度量。

我们可以把目标值和变量写成如下等式:

y ( i ) = θ T x ( i ) + ϵ ( i ) y^{(i)} = \theta^T x^{(i)}+\epsilon^{(i)} y(i)=θTx(i)+ϵ(i)

ϵ \epsilon ϵ表示我们未观测到的变量的印象,即随机噪音。我们假定 ϵ \epsilon ϵ是独立同分布,服从高斯分布。(根据中心极限定理)

p ( ϵ ( i ) ) = 1 2 π σ e x p ( − ( ϵ ( i ) ) 2 2 σ 2 ) p(\epsilon^{(i)}) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(\epsilon^{(i)})^2}{2\sigma^2}\right) p(ϵ(i))=2π σ1exp(2σ2(ϵ(i))2)

因此,

p ( y ( i ) ∣ x ( i ) ; θ ) = 1 2 π σ e x p ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) p(y^{(i)}|x^{(i)};\theta) = \frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) p(y(i)x(i);θ)=2π σ1exp(2σ2(y(i)θTx(i))2)

我们建立极大似然函数,即描述数据遵从当前样本分布的概率分布函数。由于样本的数据集独立同分布,因此可以写成:

L ( θ ) = p ( y ⃗ ∣ X ; θ ) = ∏ i = 1 n 1 2 π σ e x p ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) L(\theta) = p(\vec y | X;\theta) = \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) L(θ)=p(y X;θ)=i=1n2π σ1exp(2σ2(y(i)θTx(i))2)

选择 θ \theta θ,使得似然函数最大化,这就是极大似然估计的思想。

为了方便计算,我们计算时通常对对数似然函数求最大值:

l ( θ ) = l o g L ( θ ) = l o g ∏ i = 1 n 1 2 π σ e x p ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = ∑ i = 1 n l o g 1 2 π σ e x p ( − ( y ( i ) − θ T x ( i ) ) 2 2 σ 2 ) = n l o g 1 2 π σ − 1 σ 2 ⋅ 1 2 ∑ i = 1 n ( ( y ( i ) − θ T x ( i ) ) 2 \begin{aligned} l(\theta) & = log L(\theta) = log \prod^n_{i=1}\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2} {2\sigma^2}\right) \\ & = \sum^n_{i=1}log\frac{1}{\sqrt{2\pi}\sigma}exp\left(-\frac{(y^{(i)}-\theta^T x^{(i)})^2}{2\sigma^2}\right) \\ & = nlog\frac{1}{{\sqrt{2\pi}\sigma}} - \frac{1}{\sigma^2} \cdot \frac{1}{2}\sum^n_{i=1}((y^{(i)}-\theta^T x^{(i)})^2 \end{aligned} l(θ)=logL(θ)=logi=1n2π σ1exp(2σ2(y(i)θTx(i))2)=i=1nlog2π σ1exp(2σ2(y(i)θTx(i))2)=nlog2π σ1σ2121i=1n((y(i)θTx(i))2

显然,最大化 l ( θ ) l(\theta) l(θ)即最小化 1 2 ∑ i = 1 n ( ( y ( i ) − θ T x ( i ) ) 2 \frac{1}{2}\sum^n_{i=1}((y^{(i)}-\theta^T x^{(i)})^2 21i=1n((y(i)θTx(i))2

这一结果即均方误差,因此用这个值作为代价函数来优化模型在统计学的角度是合理的。

2、线性回归损失函数、代价函数、目标函数

  • 损失函数(Loss Function):度量单样本预测的错误程度,损失函数值越小,模型就越好。
  • 代价函数(Cost Function):度量全部样本集的平均误差。
  • 目标函数(Object Function):代价函数和正则化函数,最终要优化的函数。

常用的损失函数包括:0-1损失函数、平方损失函数、绝对损失函数、对数损失函数等。
常用的代价函数包括:均方误差、均方根误差、平均绝对误差等。

思考题: 既然代价函数已经可以度量样本集的平均误差,为什么还要设定目标函数?

回答: 当模型复杂度增加时,有可能对训练集可以模拟的很好,但是预测测试集的效果不好,出现过拟合现象,这就出现了所谓的“结构化风险”。结构风险最小化即为了防止过拟合而提出来的策略,定义模型复杂度为 J ( F ) J(F) J(F),目标函数可表示为:

m i n f ∈ F   1 n ∑ i = 1 n L ( y i , f ( x i ) ) + λ J ( F ) \underset{f\in F}{min}\, \frac{1}{n}\sum^{n}_{i=1}L(y_i,f(x_i))+\lambda J(F) fFminn1i=1nL(yi,f(xi))+λJ(F)

在这里插入图片描述

例如有以上6个房价和面积关系的数据点,可以看到,当设定 f ( x ) = ∑ j = 0 5 θ j x j f(x)=\sum_{j=0}^{5}\theta_jx_j f(x)=j=05θjxj时,可以完美拟合训练集数据,但是,真实情况下房价和面积不可能是这样的关系,出现了过拟合现象。当训练集本身存在噪声时,拟合曲线对未知影响因素的拟合往往不是最好的。 通常,随着模型复杂度的增加,训练误差会减少;但测试误差会先增加后减小。我们的最终目的时试测试误差达到最小,这就是我们为什么需要选取适合的目标函数的原因。

3、线性回归的优化方法

1、梯度下降法
梯度是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度方向)变化最快,变化率最大(为该梯度的模)。

设定初始参数 θ \theta θ,不断迭代,使得 J ( θ ) J(\theta) J(θ)最小化:

θ j : = θ j − α ∂ J ( θ ) ∂ θ \theta_j:=\theta_j-\alpha\frac{\partial{J(\theta)}}{\partial\theta} θj:=θjαθJ(θ)

∂ J ( θ ) ∂ θ = ∂ ∂ θ j 1 2 ∑ i = 1 n ( f θ ( x ) ( i ) − y ( i ) ) 2 = 2 ∗ 1 2 ∑ i = 1 n ( f θ ( x ) ( i ) − y ( i ) ) ∗ ∂ ∂ θ j ( f θ ( x ) ( i ) − y ( i ) ) = ∑ i = 1 n ( f θ ( x ) ( i ) − y ( i ) ) ∗ ∂ ∂ θ j ( ∑ j = 0 d θ j x j ( i ) − y ( i ) ) ) = ∑ i = 1 n ( f θ ( x ) ( i ) − y ( i ) ) x j ( i ) \begin{aligned} \frac{\partial{J(\theta)}}{\partial\theta} &= \frac{\partial}{\partial\theta_j}\frac{1}{2}\sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})^2 \\ &= 2*\frac{1}{2}\sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial\theta_j}(f_\theta(x)^{(i)}-y^{(i)}) \\ &= \sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})*\frac{\partial}{\partial\theta_j}(\sum_{j=0}^{d}\theta_jx_j^{(i)}-y^{(i)}))\\ &= \sum_{i=1}^{n}(f_\theta(x)^{(i)}-y^{(i)})x_j^{(i)} \\ \end{aligned} θJ(θ)=θj21i=1n(fθ(x)(i)y(i))2=221i=1n(fθ(x)(i)y(i))θj(fθ(x)(i)y(i))=i=1n(fθ(x)(i)y(i))θj(j=0dθjxj(i)y(i)))=i=1n(fθ(x)(i)y(i))xj(i)

即:

θ j = θ j + α ∑ i = 1 n ( y ( i ) − f θ ( x ) ( i ) ) x j ( i ) \theta_j = \theta_j + \alpha\sum_{i=1}^{n}(y^{(i)}-f_\theta(x)^{(i)})x_j^{(i)} θj=θj+αi=1n(y(i)fθ(x)(i))xj(i)

注:下标 j j j 表示第 j j j 个参数,上标 i i i 表示第 i i i 个数据点。

将所有的参数以向量形式表示,可得:

θ = θ + α ∑ i = 1 n ( y ( i ) − f θ ( x ) ( i ) ) x ( i ) \theta = \theta + \alpha\sum_{i=1}^{n}(y^{(i)}-f_\theta(x)^{(i)})x^{(i)} θ=θ+αi=1n(y(i)fθ(x)(i))x(i)

由于这个方法中,参数在每一个数据点上同时进行了移动,因此称为批梯度下降法,对应的,我们可以每一次让参数只针对一个数据点进行移动,即:

θ = θ + α ( y ( i ) − f θ ( x ) ( i ) ) x ( i ) \theta = \theta + \alpha(y^{(i)}-f_\theta(x)^{(i)})x^{(i)} θ=θ+α(y(i)fθ(x)(i))x(i)

这个算法成为随机梯度下降法,随机梯度下降法的好处是,当数据点很多时,运行效率更高;缺点是,因为每次只针对一个样本更新参数,未必找到最快路径达到最优值,甚至有时候会出现参数在最小值附近徘徊而不是立即收敛。但当数据量很大的时候,随机梯度下降法经常优于批梯度下降法。

在这里插入图片描述

当J为凸函数时,梯度下降法相当于让参数 θ \theta θ不断向J的最小值位置移动。

梯度下降法的缺陷:如果函数为非凸函数,有可能找到的并非全局最优值,而是局部最优值。

2、最小二乘法矩阵求解

令,

X = [ ( x ( 1 ) ) T ( x ( 2 ) ) T … ( x ( n ) ) T ] X = \left[ \begin{array} {cccc} (x^{(1)})^T\\ (x^{(2)})^T\\ \ldots \\ (x^{(n)})^T \end{array} \right] X=(x(1))T(x(2))T(x(n))T

其中,

x ( i ) = [ x 1 ( i ) x 2 ( i ) … x d ( i ) ] x^{(i)} = \left[ \begin{array} {cccc} x_1^{(i)}\\ x_2^{(i)}\\ \ldots \\ x_d^{(i)} \end{array} \right] x(i)=x1(i)x2(i)xd(i)

由于,

Y = [ y ( 1 ) y ( 2 ) … y ( n ) ] Y = \left[ \begin{array} {cccc} y^{(1)}\\ y^{(2)}\\ \ldots \\ y^{(n)} \end{array} \right] Y=y(1)y(2)y(n)

h θ ( x ) h_\theta(x) hθ(x)可以写作:

h θ ( x ) = X θ h_\theta(x)=X\theta hθ(x)=Xθ

对于向量来说,有:

z T z = ∑ i z i 2 z^Tz = \sum_i z_i^2 zTz=izi2

因此可以把损失函数写作:

J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) J(\theta)=\frac{1}{2}(X\theta-Y)^T(X\theta-Y) J(θ)=21(XθY)T(XθY)

为最小化 J ( θ ) J(\theta) J(θ),对 θ \theta θ求导可得:

∂ J ( θ ) ∂ θ = ∂ ∂ θ 1 2 ( X θ − Y ) T ( X θ − Y ) = 1 2 ∂ ∂ θ ( θ T X T X θ − Y T X θ − θ T X T Y − Y T Y ) \begin{aligned} \frac{\partial{J(\theta)}}{\partial\theta} &= \frac{\partial}{\partial\theta} \frac{1}{2}(X\theta-Y)^T(X\theta-Y) \\ &= \frac{1}{2}\frac{\partial}{\partial\theta} (\theta^TX^TX\theta - Y^TX\theta-\theta^T X^TY - Y^TY) \\ \end{aligned} θJ(θ)=θ21(XθY)T(XθY)=21θ(θTXTXθYTXθθTXTYYTY)

中间两项互为转置,由于求得的值是个标量,矩阵与转置相同,因此可以写成:

∂ J ( θ ) ∂ θ = 1 2 ∂ ∂ θ ( θ T X T X θ − 2 θ T X T Y − Y T Y ) \begin{aligned} \frac{\partial{J(\theta)}}{\partial\theta} &= \frac{1}{2}\frac{\partial}{\partial\theta} (\theta^TX^TX\theta - 2\theta^T X^TY - Y^TY) \\ \end{aligned} θJ(θ)=21θ(θTXTXθ2θTXTYYTY)

令偏导数等于零,由于最后一项和 θ \theta θ无关,偏导数为0。

因此,

∂ J ( θ ) ∂ θ = 1 2 ∂ ∂ θ θ T X T X θ − ∂ ∂ θ θ T X T Y \frac{\partial{J(\theta)}}{\partial\theta} = \frac{1}{2}\frac{\partial}{\partial\theta} \theta^TX^TX\theta - \frac{\partial}{\partial\theta} \theta^T X^TY θJ(θ)=21θθTXTXθθθTXTY

利用矩阵求导性质,

∂ x ⃗ T α ∂ x ⃗ = α \frac{\partial \vec x^T\alpha}{\partial \vec x} =\alpha x x Tα=α

∂ A T B ∂ x ⃗ = ∂ A T ∂ x ⃗ B + ∂ B T ∂ x ⃗ A \frac{\partial A^TB}{\partial \vec x} = \frac{\partial A^T}{\partial \vec x}B + \frac{\partial B^T}{\partial \vec x}A x ATB=x ATB+x BTA

∂ ∂ θ θ T X T X θ = ∂ ∂ θ ( X θ ) T X θ = ∂ ( X θ ) T ∂ θ X θ + ∂ ( X θ ) T ∂ θ X θ = 2 X T X θ \begin{aligned} \frac{\partial}{\partial\theta} \theta^TX^TX\theta & = \frac{\partial}{\partial\theta}{(X\theta)^TX\theta}\\ & = \frac{\partial (X\theta)^T}{\partial\theta}X\theta + \frac{\partial (X\theta)^T}{\partial\theta}X\theta \\ & = 2X^TX\theta \end{aligned} θθTXTXθ=θ(Xθ)TXθ=θ(Xθ)TXθ+θ(Xθ)TXθ=2XTXθ

∂ J ( θ ) ∂ θ = X T X θ − X T Y \frac{\partial{J(\theta)}}{\partial\theta} = X^TX\theta - X^TY θJ(θ)=XTXθXTY

令导数等于零,

X T X θ = X T Y X^TX\theta = X^TY XTXθ=XTY

θ = ( X T X ) ( − 1 ) X T Y \theta = (X^TX)^{(-1)}X^TY θ=(XTX)(1)XTY

注: CS229视频中吴恩达的推导利用了矩阵迹的性质,可自行参考学习。

3、牛顿法

在这里插入图片描述

f ( θ ) ′ = f ( θ ) Δ , Δ = θ 0 − θ 1 f(\theta)' = \frac{f(\theta)}{\Delta},\Delta = \theta_0 - \theta_1 f(θ)=Δf(θ),Δ=θ0θ1

可求得,

θ 1 = θ 0 − f ( θ 0 ) f ( θ 0 ) ′ \theta_1 = \theta_0 - \frac {f(\theta_0)}{f(\theta_0)'} θ1=θ0f(θ0)f(θ0)

重复迭代,可以让逼近取到 f ( θ ) f(\theta) f(θ)的最小值。

当我们对损失函数 l ( θ ) l(\theta) l(θ)进行优化的时候,实际上是想要取到 l ′ ( θ ) l'(\theta) l(θ)的最小值,因此迭代公式为:

θ : = θ − l ′ ( θ ) l ′ ′ ( θ ) \theta :=\theta-\frac{l'(\theta)}{l''(\theta)} θ:=θl(θ)l(θ)

当\theta是向量值的时候,

θ : = θ − H − 1 Δ θ l ( θ ) \theta :=\theta - H^{-1}\Delta_{\theta}l(\theta) θ:=θH1Δθl(θ)

其中, Δ θ l ( θ ) \Delta_{\theta}l(\theta) Δθl(θ) l ( θ ) l(\theta) l(θ) θ i \theta_i θi的偏导数, H H H J ( θ ) J(\theta) J(θ)的海森矩阵,
H i j = ∂ 2 l ( θ ) ∂ θ i ∂ θ j H_{ij} = \frac{\partial ^2l(\theta)}{\partial\theta_i\partial\theta_j} Hij=θiθj2l(θ)

问题: 请用泰勒展开法推导牛顿法公式。

答案: f ( x ) f(x) f(x)用泰勒公式展开到第二阶,

f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 f ′ ′ ( x 0 ) ( x − x 0 ) 2 f(x) = f(x_0) + f'(x_0)(x - x_0)+\frac{1}{2}f''(x_0)(x - x_0)^2 f(x)=f(x0)+f(x0)(xx0)+21f(x0)(xx0)2

对上式求导,并令导数等于0,求得x值

f ′ ( x ) = f ′ ( x 0 ) + f ′ ′ ( x 0 ) x − f ′ ′ ( x 0 ) x 0 = 0 f'(x) = f'(x_0) + f''(x_0)x -f''(x_0)x_0 = 0 f(x)=f(x0)+f(x0)xf(x0)x0=0

可以求得,

x = x 0 − f ′ ( x 0 ) f ′ ′ ( x 0 ) x = x_0 - \frac{f'(x_0)}{f''(x_0)} x=x0f(x0)f(x0)

牛顿法的收敛速度非常快,但海森矩阵的计算较为复杂,尤其当参数的维度很多时,会耗费大量计算成本。我们可以用其他矩阵替代海森矩阵,用拟牛顿法进行估计。

4、拟牛顿法
拟牛顿法的思路是用一个矩阵替代计算复杂的海森矩阵H,因此要找到符合H性质的矩阵。

要求得海森矩阵符合的条件,同样对泰勒公式求导 f ′ ( x ) = f ′ ( x 0 ) + f ′ ′ ( x 0 ) x − f ′ ′ ( x 0 ) x 0 f'(x) = f'(x_0) + f''(x_0)x -f''(x_0)x_0 f(x)=f(x0)+f(x0)xf(x0)x0

x = x 1 x = x_1 x=x1,即迭代后的值,代入可得:

f ′ ( x 1 ) = f ′ ( x 0 ) + f ′ ′ ( x 0 ) x 1 − f ′ ′ ( x 0 ) x 0 f'(x_1) = f'(x_0) + f''(x_0)x_1 - f''(x_0)x_0 f(x1)=f(x0)+f(x0)x1f(x0)x0

更一般的,

f ′ ( x k + 1 ) = f ′ ( x k ) + f ′ ′ ( x k ) x k + 1 − f ′ ′ ( x k ) x k f'(x_{k+1}) = f'(x_k) + f''(x_k)x_{k+1} - f''(x_k)x_k f(xk+1)=f(xk)+f(xk)xk+1f(xk)xk

f ′ ( x k + 1 ) − f ′ ( x k ) = f ′ ′ ( x k ) ( x k + 1 − x k ) = H ( x k + 1 − x k ) f'(x_{k+1}) - f'(x_k) = f''(x_k)(x_{k+1}- x_k)= H(x_{k+1}- x_k) f(xk+1)f(xk)=f(xk)(xk+1xk)=H(xk+1xk)

x k x_k xk为第k个迭代值。即找到矩阵G,使得它符合上式。 常用的拟牛顿法的算法包括DFP,BFGS等,作为选学内容,有兴趣者可自行查询材料学习。

4、线性回归的评价指标

  • 均方误差(MSE): 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2 m1i=1m(y(i)y^(i))2

  • 均方根误差(RMSE): M S E = 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 \sqrt{MSE} = \sqrt{\frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2} MSE =m1i=1m(y(i)y^(i))2

  • 平均绝对误差(MAE): 1 m ∑ i = 1 m ∣ ( y ( i ) − y ^ ( i ) ∣ \frac{1}{m}{\sum^{m}_{i=1}|(y^{(i)} - \hat y^{(i)}|} m1i=1m(y(i)y^(i)

但以上评价指标都无法消除量纲不一致而导致的误差值差别大的问题,最常用的指标是 R 2 R^2 R2,可以避免量纲不一致问题。

R 2 : = 1 − ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 ∑ i = 1 m ( y ˉ − y ^ ( i ) ) 2 = 1 − 1 m ∑ i = 1 m ( y ( i ) − y ^ ( i ) ) 2 1 m ∑ i = 1 m ( y ˉ − y ^ ( i ) ) 2 = 1 − M S E V A R R^2: = 1-\frac{\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2}{\sum^{m}_{i=1}(\bar y - \hat y^{(i)})^2} =1-\frac{\frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2}{\frac{1}{m}\sum^{m}_{i=1}(\bar y - \hat y^{(i)})^2} = 1-\frac{MSE}{VAR} R2:=1i=1m(yˉy^(i))2i=1m(y(i)y^(i))2=1m1i=1m(yˉy^(i))2m1i=1m(y(i)y^(i))2=1VARMSE

我们可以把 R 2 R^2 R2理解为,回归模型可以成功解释的数据方差部分在数据固有方差中所占的比例, R 2 R^2 R2越接近1,表示可解释力度越大,模型拟合的效果越好。

5、sklearn.linear_model参数详解:

fit_intercept : 默认为True,是否计算该模型的截距。如果使用中心化的数据,可以考虑设置为False,不考虑截距。注意这里是考虑,一般还是要考虑截距。

normalize: 默认为False,当fit_intercept设置为False的时候,这个参数会被自动忽略。如果为True,回归器会标准化输入参数:减去平均值,并且除以相应的二范数。建议将标准化的工作放在训练模型之前。通过设置sklearn.preprocessing.StandardScaler来实现,而在此处设置为False。

copy_X : 默认为True,否则X会被改写。

n_jobs: int 默认为1,当-1时默认使用全部CPUs。

可用属性:

coef_:训练后的输入端模型系数,如果label有两个,即y值有两列。那么是一个2D的array。

intercept_: 截距。

可用方法:

fit(X,y,sample_weight=None):
X: array, 稀疏矩阵 [n_samples,n_features];
y: array [n_samples, n_targets];
sample_weight: 权重 array [n_samples] 在版本0.17后添加了sample_weight

get_params(deep=True): 返回对regressor 的设置值

predict(X): 预测 基于 R^2值

score: 评估

练习题: 请用以下数据(可自行生成尝试,或用其他已有数据集)
1、首先尝试调用sklearn的线性回归函数进行训练;
2、用最小二乘法的矩阵求解法训练数据;
3、用梯度下降法训练数据;
4、比较各方法得出的结果是否一致。


代码实现

#生成数据
import numpy as np
#生成随机数
np.random.seed(1234)
x = np.random.rand(500,3)
print(x.shape)
#构建映射关系,模拟真实的数据待预测值,映射关系为y = 4.2 + 5.7*x1 + 10.8*x2,可自行设置值进行尝试
y = x.dot(np.array([4.2,5.7,10.8]))
print(y.shape)


# 1、先尝试调用sklearn的线性回归模型训练数据
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib inline

# 调用模型
lr = LinearRegression(fit_intercept=True)
# 训练模型
lr.fit(x,y)
print("估计的参数值为:%s" %(lr.coef_))
# 计算R平方
print('R2:%s' %(lr.score(x,y)))
# 任意设定变量,预测目标值
x_test = np.array([2,4,5]).reshape(1,-1)
y_hat = lr.predict(x_test)
print("预测值为: %s" %(y_hat))

# 估计的参数值为:[ 4.2  5.7 10.8]
# R2:1.0
# 预测值为: [85.2]


# 2、最小二乘法的矩阵求解法
class LR_LS():
    def __init__(self):
        self.w = None      
    def fit(self, X, y):
        # 最小二乘法矩阵求解
        self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
    def predict(self, X):
        # 用已经拟合的参数值预测新自变量
        y_pred = X.dot(self.w)
        return y_pred

if __name__ == "__main__":
    lr_ls = LR_LS()
    lr_ls.fit(x,y)
    print("估计的参数值:%s" %(lr_ls.w))
    x_test = np.array([2,4,5]).reshape(1,-1)
    print("预测值为: %s" %(lr_ls.predict(x_test)))

# 估计的参数值:[ 4.2  5.7 10.8]
# 预测值为: [85.2]


# 3、梯度下降法
class LR_GD():
    def __init__(self):
        self.w = None     
    def fit(self,X,y,alpha=0.02,loss = 1e-10): # 设定步长为0.002,判断是否收敛的条件为1e-10
        y = y.reshape(-1,1) #重塑y值的维度以便矩阵运算
        [m,d] = np.shape(X) #自变量的维度
        self.w = np.zeros((d)) #将参数的初始值定为0
        tol = 1e5
        while tol > loss:
            h_f = X.dot(self.w).reshape(-1,1) 
            theta = self.w + alpha*np.mean(X*(y - h_f),axis=0) #计算迭代的参数值
            tol = np.sum(np.abs(theta - self.w))
            self.w = theta
    def predict(self, X):
        # 用已经拟合的参数值预测新自变量
        y_pred = X.dot(self.w)
        return y_pred  

if __name__ == "__main__":
    lr_gd = LR_GD()
    lr_gd.fit(x,y)
    print("估计的参数值为:%s" %(lr_gd.w))
    x_test = np.array([2,4,5]).reshape(1,-1)
    print("预测值为:%s" %(lr_gd.predict(x_test)))

# 估计的参数值为:[ 4.20000001  5.70000003 10.79999997]
# 预测值为:[85.19999995]

参考:Machine-Learning:第1章 线性回归

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
7个回归分析方法 什么是回归分析? 回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。 这种技术通常用于 预测分析、 时间序列模型 以及发现变量之间的因果关系。 例如,司机的鲁莽驾驶与道路交通事故数量之间的关系,最好的研究方法就是回归。 回归分析是建模和分析数据的重要工具。 在这里,我们使用曲线/线来拟合这些数据点, 在这种方式下,从曲线或线到数据点的距离差异最小。 我会在接下来的部分详细解释这一点。 我们为什么使用回归分析? 如上所述,回归分析估计了两个或多个变量之间的关系。 下面,让我们举一个简单的例子来理解它: 比如说,在当前的经济条件下,你要估计一家公司的销售额增长情况。 现在,你有公司最新的数据,这些数据显示出销售额增长大约是经济增长的2.5倍。 那么使用回归分析,我们就可以根据当前和过去的信息来预测未来公司的销售情况。 使用回归分析的好处良多。 具体如下: • 它表明自变量和因变量之间的显著关系 它表明多个自变量对一个因变量的影响强度 回归分析也允许我们去比较那些衡量不同尺度的变量之间的相互影响,如价格变动与促销活动数量之间联系。 这些有利于帮助市场研究人员,数据分析人员以及数据科学家排除并估计出一组最佳的变量,用来构建预测模型。 我们有多少种回归技术? 有各种各样的回归技术用于预测。 这些技术主要有三个度量 (自变量的个数, 因变量的类型 回归线的形状)。 对于那些有创意的人,如果你觉得有必要使用上面这些参数的一个组合,你甚至可以创造出一个没有被使用过的回归模型。 但在你开始之前,先了解如下最常用的回归方法: 1. 线性回归(Linear Regression) 线性回归通常是人们在学习预测模型时首选的技术之一。 在这种技术中, 因变量是连续的, 自变量可以是连续的也可以是离散的, 回归线的性质是线性的。 线性回归使用最佳的拟合直线(也就是回归线) 在因变量(Y)和一个或多个自变量(X)之间建立一种关系。 用一个方程式来表示它,即 Y=a+b*X + e, 其中a表示截距, b表示直线的斜率, e是误差项。 这个方程可以根据给定的预测变量(s)来预测目标变量的值。 现在的问题是:我们如何得到一个最佳的拟合线呢? 这个问题可以使用最小二乘法轻松地完成。 一元线性回归和多元线性回归的区别在于, 多元线性回归有(>1)个自变量, 而一元线性回归通常只有1个自变量。 最小二乘法也是用于拟合回归线最常用的方法。 对于观测数据,它通过最小化每个数据点到线的垂直偏差平方和来计算最佳拟合线。 因为在相加时,偏差先平方,所以正值和负值没有抵消。 我们可以使用R-square指标来评估模型性能。 要点: • 自变量与因变量之间必须有线性关系 • 多元回归存在多重共线性,自相关性和异方差性 线性回归对异常值非常敏感。它会严重影响回归线,最终影响预测值 多重共线性会增加系数估计值的方差,使得在模型轻微变化下,估计非常敏感。 结果就是系数估计值不稳定, 在多个自变量的情况下,我们可以使用向前选择法,向后剔除法和逐步筛选法来选择最重要的自变量。 2. 逻辑回归(Logistic Regression) 逻辑回归是用来计算“事件=Success”和“事件=Failure”的概率。 当因变量的类型属于二元(1 / 0,真/假,是/否)变量时,我们就应该使用逻辑回归。 这里,Y的值从0到1,它可以用下方程表示。 odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence ln(odds) = ln(p/(1-p)) logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk 概要 上述式子中,p表述具有某个特征的概率。 你应该会问这样一个问题:我们为什么要在公式中使用对数log呢? 因为在这里我们使用的是的二项分布(因变量),我们需要选择一个对于这个分布最佳的连结函数。 它就是Logit函数。 在上述方程中,通过观测样本的极大似然估计值来选择参数, 而不是最小化平方和误差(如在普通回归使用的)。 要点: • 它广泛的用于分类问题。 逻辑回归不要求自变量和因变量是线性关系。 它可以处理各种类型的关系,因为它对预测的相对风险指数OR使用了一个非线性的log转换。 逻辑回归是用于分类的~这个得记住 为了避免过拟合和欠拟合,我们应该包括所有重要的变量。 有一个很好的方法来确保这种情况, 就是使用逐步筛选方法来估计逻辑回归。 它需要大的样本量,因为在样本数量较少的情况下,极大似然估计的效果比普通的最小二乘法差。 自变量不应该相互关联的,即不具有多重共线性。 然而,在分析和建模中,我们可以选择包含分类变量相互作用的影响。 • 如果因变量的值是定序变量,则称它为序逻辑回归 • 如果因变量是多类的话,则称它为多元逻辑回归 3. 多项式回归(Polynomial Regression) 对于一个回归方程,如果自变量的指数大于1,那么它就是多项式回归方程。 如下方程所示:y=a+b*x^2 在这种回归技术中,最佳拟合线不是直线。 而是一个用于拟合数据点的曲线。 重点: 虽然会有一个诱导可以拟合一个高次多项式并得到较低的错误,但这可能会导致过拟合。 你需要经常画出关系图来查看拟合情况,并且专注于保证拟合合理,既没有过拟合又没有欠拟合。 下面是一个图例,可以帮助理解: 明显地向两端寻找曲线点,看看这些形状和趋势是否有意义。 更高次的多项式最后可能产生怪异的推断结果。 4. 逐步回归(Stepwise Regression) 在处理多个自变量时,我们可以使用这种形式的回归。 在这种技术中,自变量的选择是在一个自动的过程中完成的,其中包括非人为操作。 这一壮举是通过观察统计的值,如R-square,t-stats和AIC指标,来识别重要的变量。 逐步回归通过同时添加/删除基于指定标准的协变量来拟合模型。 下面列出了一些最常用的逐步回归方法: • 标准逐步回归法做两件事情。即增加和删除每个步骤所需的预测。 • 向前选择法从模型中最显著的预测开始,然后为每一步添加变量。 • 向后剔除法与模型的所有预测同时开始,然后在每一步消除最小显着性的变量。 这种建模技术的目的是使用最少的预测变量数来最大化预测能力。 这也是处理高维数据集的方法之一。 5. 岭回归(Ridge Regression) 岭回归分析是一种用于存在多重共线性(自变量高度相关)数据的技术。 在多重共线性情况下,尽管最小二乘法(OLS)对每个变量很公平,但它们的差异很大,使得观测值偏移并远离真实值。 岭回归通过给回归估计上增加一个偏差度,来降低标准误差。 上面,我们看到了线性回归方程。还记得吗? 它可以表示为:y=a+ b*x 这个方程也有一个误差项。完整的方程是: y=a+b*x+e (error term) , [error term is the value needed to correct for a prediction error between the observed and predicted value] => y=a+y= a+ b1x1+ b2x2+....+e, for multiple independent variables. 在一个线性方程中,预测误差可以分解为2个子分量。 一个是偏差, 一个是方差。 预测错误可能会由这两个分量或者这两个中的任何一个造成。 在这里,我们将讨论由方差所造成的有关误差。 岭回归通过收缩参数λ(lambda)解决多重共线性问题。 看下面的公式: 在这个公式中,有两个组成部分。 第一个是最小二乘项, 另一个是β2(β-平方)的λ倍,其中β是相关系数。 为了收缩参数把它添加到最小二乘项中以得到一个非常低的方差。 要点: 除常数项以外,这种回归的假设与最小二乘回归类似; 它收缩了相关系数的值,但没有达到零,这表明它没有特征选择功能,这是一个正则化方法,并且使用的是L2正则化。 6. 套索回归(Lasso Regression) 它类似于岭回归。 Lasso (Least Absolute Shrinkage and Selection Operator)也会惩罚回归系数的绝对值大小。 此外,它能够减少变化程度并提高线性回归模型的精度。 看看下面的公式: Lasso 回归与Ridge回归有一点不同,它使用的惩罚函数是绝对值,而不是平方。 这导致惩罚(或等于约束估计的绝对值之和)值使一些参数估计结果等于零。 使用惩罚值越大,进一步估计会使得缩小值趋近于零。 这将导致我们要从给定的n个变量中选择变量。 要点: • 除常数项以外,这种回归的假设与最小二乘回归类似 • 它收缩系数接近零(等于零),确实有助于特征选择 这是一个正则化方法,使用的是L1正则化 7. 回归(ElasticNet) ElasticNet是Lasso和Ridge回归技术的混合体。 它使用L1来训练并且L2优先作为正则化矩阵。 当有多个相关的特征时,ElasticNet是很有用的。 Lasso 会随机挑选他们其中的一个,而ElasticNet则会选择两个。 Lasso和Ridge之间的实际的优点是,它允许ElasticNet继承循环状态下Ridge的一些稳定性。 要点: 它可以承受双重收缩 • 选择变量的数目没有限制 • 在高度相关变量的情况下,它会产生群体效应 除了这7个最常用的回归技术,你也可以看看其他模型,如Bayesian、Ecological和Robust回归。 如何正确选择回归模型? 当你只知道一个或两个技术时,生活往往很简单。 我的老师曾告诉我,如果结果是连续的,就使用线性回归。 如果是二元的,就使用逻辑回归! 然而,在我们的处理中,可选择的越多,选择正确的一个就越难。 类似的情况下也发生在回归模型中。 在多类回归模型中,基于自变量和因变量的类型,数据的维数以及数据的其它基本特征的情况下,选择最合适的技术非常重要。 以下是你要选择正确的回归模型的关键因素: 1. 数据探索是构建预测模型的必然组成部分 在选择合适的模型时,比如识别变量的关系和影响时,它应该首选的一步。 2. 比较适合于不同模型的优点,我们可以分析不同的指标参数 如统计意义的参数,R-square,Adjusted R-square,AIC,BIC以及误差项,另一个是Mallows' Cp准则。 这个主要是通过将模型与所有可能的子模型进行对比(或谨慎选择他们),检查在你的模型中可能出现的偏差。 3. 交叉验证是评估预测模型最好额方法 在这里,将你的数据集分成两份(一份做训练和一份做验证)。 使用观测值和预测值之间的一个简单均方差来衡量你的预
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值