线性回归

痞子三分冷 提交于 2020-01-26 09:53:43

1.线性回归的原理

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

面积(x1) 厅室数量(x2) 价格(万元)(y)
64 3 225
59 3 185
65 3 208
116 4 508
…… …… ……

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

线性回归的一般形式:

有数据集{(x1,y1),(x2,y2),...,(xn,yn)}\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\},其中,xi=(xi1;xi2;xi3;...;xid),yiRx_i = (x_{i1};x_{i2};x_{i3};...;x_{id}),y_i\in R
其中n表示变量的数量,d表示每个变量的维度。
可以用以下函数来描述y和x之间的关系:hθ(x)=θ0+θ1x1+θ2x2+...+θdxd=i=0dθixi{h_\theta}(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_dx_d = \sum_{i=0}^{d}\theta_ix_i
如何来确定 𝜃 的值,使得 𝑓(𝑥) 尽可能接近y的值呢?均方误差是回归中常用的性能度量,即:
J(θ)=12i=1n(hθ(x(i))y(i))2J(\theta)=\frac{1}{2}\sum_{i=1}^{n}(h_{\theta}(x^{(i)})-y^{(i)})^2
我们可以选择 𝜃 ,试图让均方误差最小化.

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

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

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

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

回答:
当模型复杂度增加时,有可能对训练集可以模拟的很好,但是预测测试集的效果不好,出现过拟合现象,这就出现了所谓的“结构化风险”。结构风险最小化即为了防止过拟合而提出来的策略,定义模型复杂度为J(F),目标函数可表示为:
minfF1ni=1nL(yi,f(xi))+λJ(F)\underset{f\in F}{min}\, \frac{1}{n}\sum^{n}_{i=1}L(y_i,f(x_i))+\lambda J(F)

3.线性回归的优化方法

1.梯度下降法

设定初始参数θ\theta,不断迭代,使得J(θ)J(\theta)最小化:
θj:=θjαJ(θ)θ\theta_j:=\theta_j-\alpha\frac{\partial{J(\theta)}}{\partial\theta}
即:
θj=θj+αi=1n(y(i)hθ(x(i)))xj(i) \theta_j = \theta_j + \alpha\sum_{i=1}^{n}(y^{(i)}-h_\theta(x^{(i)}))x_j^{(i)} 注:下标j表示第j个参数,上标i表示第i个数据点。
将所有的参数以向量形式表示,可得:
θ=θ+αi=1n(y(i)hθ(x(i)))x(i) \theta = \theta + \alpha\sum_{i=1}^{n}(y^{(i)}-h_\theta(x^{(i)}))x^{(i)}
由于这个方法中,参数在每一个数据点上同时进行了移动,因此称为批梯度下降法,对应的,我们可以每一次让参数只针对一个数据点进行移动,即:
θ=θ+α(y(i)hθ(x(i)))x(i)\theta = \theta + \alpha(y^{(i)}-h_\theta(x^{(i)}))x^{(i)}这个算法称为随机梯度下降法,随机梯度下降法的好处是,当数据点很多时,运行效率更高;缺点是,因为每次只针对一个样本更新参数,未必找到最快路径达到最优值,甚至有时候会出现参数在最小值附近徘徊而不是立即收敛。但当数据量很大的时候,随机梯度下降法经常优于批梯度下降法。
在这里插入图片描述
当J为凸函数时,梯度下降法相当于让参数 𝜃 不断向J的最小值位置移动
梯度下降法的缺陷:如果函数为非凸函数,有可能找到的并非全局最优值,而是局部最优值。

2.最小二乘法求解

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

3.牛顿法

θ1=θ0f(θ0)f(θ0)\theta_1 = \theta_0 - \frac {f(\theta_0)}{f(\theta_0)'}
重复迭代,可以逼近取到 𝑓(𝜃) 的最小值
当我们对损失函数 𝑙(𝜃) 进行优化的时候,实际上是想要取到 𝑙′(𝜃) 的最小值,因此迭代公式为:
θ:=θl(θ)l(θ) \theta :=\theta-\frac{l'(\theta)}{l''(\theta)}
θ\theta是向量值的时候:
θ:=θH1Δθl(θ) \theta :=\theta - H^{-1}\Delta_{\theta}l(\theta)
其中,Δθl(θ)\Delta_{\theta}l(\theta)l(θ)l(\theta)θi\theta_i的偏导数,HHJ(θ)J(\theta)的海森矩阵,

Hij=2l(θ)θiθjH_{ij} = \frac{\partial ^2l(\theta)}{\partial\theta_i\partial\theta_j}

4.线性回归的评价指标

均方误差(MSE):1mi=1m(y(i)y^(i))2\frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2
均方根误差(RMSE):MSE=1mi=1m(y(i)y^(i))2\sqrt{MSE} = \sqrt{\frac{1}{m}\sum^{m}_{i=1}(y^{(i)} - \hat y^{(i)})^2}
平均绝对误差(MAE):1mi=1m(y(i)y^(i)\frac{1}{m}\sum^{m}_{i=1} | (y^{(i)} - \hat y^{(i)} |
但以上评价指标都无法消除量纲不一致而导致的误差值差别大的问题,最常用的指标是R2R^2 ,可以避免量纲不一致问题
R2:=1i=1m(y(i)y^(i))2i=1m(yˉy^(i))2=11mi=1m(y(i)y^(i))21mi=1m(yˉy^(i))2=1MSEVARR^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}
我们可以把R2R^2理解为,回归模型可以成功解释的数据方差部分在数据固有方差中所占的比例,R2R^2越接近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_: 截距

可用的methods:

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: 评估

参考https://blog.csdn.net/weixin_39175124/article/details/79465558

练习题

放假回家再更新这部分,最近太忙,还没有学习代码。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!