多元线性回归——波士顿房价问题 学习笔记


多元线性回归——波士顿房价问题学习笔记

问题描述

影响波士顿房价的一共有12个参数,我们假设房价$Y=x_1\cdot w_1+x_2\cdot w_2\dots +x_{12}\cdot w_{12}+b$,要通过数据求这十二个参数的权重和$b$。

定义损失函数

损失函数$loss$越大表示预测的越不准确,$loss = (y-pred)^2$即预测值与实际值的均方误差。

对矩阵求导

这一部分参考https://zhuanlan.zhihu.com/p/137713040

类比之前的线性回归问题,我们设房价为$Y=X\beta$其中X是每个参数$x_i$组成的矩阵,$\beta$是$w_i$的矩阵

我们要求残差平方和$Q=(X\beta-Y)(X\beta-Y)^T$对$\beta$的导数,

有$\frac{\partial X^TY\beta}{\partial \beta}=Y^TX$(不会用Latex打矩阵,证明部分在知乎有,这里先不记录了)

因此$(X\beta-Y)(X\beta-Y)^T=(\beta^TX^T-Y^T)(X\beta-Y)=\beta^TX^TX\beta-\beta^TX^TY-Y^TX\beta+Y^TY$

求导后得到$2X^TX\beta-2X^TY$

参数求解

我们要找导数为0的极值点,因此设$\beta$满足$2X^TX\beta-2X^TY$

变形得到$\beta=(X^TX)^{-1}X^TY$即可得到$\beta$

但是方法有两个问题:

  • X可能没有逆矩阵,结果不够精确
  • 唯独多,矩阵求逆,矩阵相乘耗费大量时间

梯度下降法求解

用矩阵求导的方法得梯度$\frac{\partial Q}{\partial \beta}=2X^TX\beta-2X^TY$

因此带入梯度下降公式:$\theta_i+1=\theta_i-\alpha\cdot2X^T(X\beta-Y)$得到下一步的点坐标

一些概念记录

**epoch(时期):**一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个epoch。

**batch(批):**将训练样本分成多个batch,一次只选一个部分。

**随机梯度下降:**批量梯度下降的每一步都把整个数据集载入进来运算,比较小号时间和内存,随机梯度下降每次随机采样一批样本来估计当前梯度。

代码实现

代码部分看的这个视频 https://www.bilibili.com/video/BV1iJ41127cw

导入数据集

from sklearn.datasets import load_boston
Boston = load_boston()
X = Boston.data
Y = Boston.target

从sklearn里面导入波士顿房价的数据集。

划分样本数据

train_test_split函数

参考这个文章https://zhuanlan.zhihu.com/p/248634166

完整模板:

train_X,test_X,train_y,test_y = train_test_split(train_data,train_target,test_size=0.3,random_state=5)

参数解释:

train_data:样本特征集

train_target:样本标签

test_size:0.1之间的浮点数,表示测试集占总样本的占比,如果是整数就是样本数量

random_state:随机数种子

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2,random_state=865)

线性回归

参考https://zhuanlan.zhihu.com/p/71196742

我其实比较震惊,线性回归居然直接调用库函数就可以用了。

LinearRegression函数

完整模板:

LinearRegression(fit_intercept=True,normalize=False,copy_X=True,n_jobs=1)

参数解释:

fit_intercept:是否对训练数据进行中心化,默认为true(中心化:使得平均值为0)

normalize:是否对数据进行标准化处理,默认为true(标准化:将数据按比例缩放,使之落入一个小的特定区间)

copy_X:中心化,标准化后,是否把新数据覆盖到原数据上,默认为true

n_jobs:整型,默认为1

代码

lin_reg = LinearRegression()
lin_reg.fit(X_train,Y_train)
#训练过程
lin_reg.predict(X_test)
deviation = lin_reg.predict(X_test) - Y_test
deviation
#打印预测结果和真实值的差
RMSE = np.sum(np.sqrt(deviation*deviation))/102
#均方根误差,越小表示预测结果越准确

感想

以前没接触过python,之前还看了另外一个没用库的教程,里面还涉及标准化之类的好多细节,因为语言之类的都不熟悉故放弃了。跟着视频的讲解写完代码之后感觉到python有好多的库,似乎都不用了解内部的原理就可以拿过来用,而且很多语法都比较简短。


文章作者: REXWind
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 REXWind !
评论
  目录