多元线性回归——波士顿房价问题学习笔记
问题描述
影响波士顿房价的一共有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有好多的库,似乎都不用了解内部的原理就可以拿过来用,而且很多语法都比较简短。