前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >回归-线性回归算法(房价预测项目)

回归-线性回归算法(房价预测项目)

作者头像
唔仄lo咚锵
发布2022-10-04 17:59:54
1.6K0
发布2022-10-04 17:59:54
举报

文章目录

简介


线性回归(Linear Regression)是回归任务中最常见的算法,利用回归方程对自变量和因变量进行建模,且因变量和自变量之间是线性关系而得名,从而可以根据已知数据预测未来数据,如房价预测、PM2.5预测等。

其中,只有一个自变量则称为一元线性回归,包含多个自变量则成为多元线性回归。

如下图,根据已知数据点(蓝色),建模得到红色的回归方程,表示自变量和因变量关系,从而可以输入新的自变量,得到预测值(因变量)。

在这里插入图片描述
在这里插入图片描述

预测函数定义为:

h(w)=w_1x_1+w_2x_2+···+w_dx_d+b

向量形式为:

尽可能贴近目标函数。那又要如何评价当前构建出来的模型怎么样,评价两个模型的优劣,并如何向目标函数不断靠近呢?

即使用损失函数和优化算法。

损失函数


损失函数就是定义当前函数和目标函数之间的差异,并且我们期望这个差异(损失)越小越好。

使用误差平方和SSE来表示损失,即预测值和真实值差的平方求和,该方法也称为最小二乘法,二乘即平方的意思,求最小的损失。

总损失定义为:

也就是使下图中黄色长度之和最小。

在这里插入图片描述
在这里插入图片描述

优化算法

正规方程


利用高中知识,求一个函数的最小值,我们可以求导,在导数为0处取得最小值。

使用numpy和scipy提供的矩阵运算,可以得到代码实现:

代码语言:javascript
复制
def Regres(X, Y):
    x = mat(X)  # 创建矩阵
    y = mat(Y).T  # 处理y为一列
    if linalg.det(x.T * x) == 0.0:  # 不可逆
        return 0
    else:
        return (x.T * x).I * (x.T * y)

梯度下降


如果可逆,通过正规方程可以一步到位求得最优模型的参数w。但如果不可逆,就不能使用该方法了。

使用梯度下降可以求得最小的损失值,其主要思想是求偏导按照梯度上升最快的方向进行求解,取其梯度反方向,即梯度下降。

比如三维特征中,其平面图可以像是山峰和谷底,那我们就是要从山峰出发,从最陡(梯度最大)的方向进行下山,从而到达谷底取最小值,但往往可能陷入其它谷底,只取到了极小值,可以修改步长(学习率)。

梯度下降算法内容较多,另起一篇博客介绍,挖个坑。

在这里插入图片描述
在这里插入图片描述

上图摘自网络。

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

项目实战


使用波士顿房价数据集,sklearn内置了该数据集,也是Kaggle中的一个入门练习。共506条数据,13个特征。

在这里插入图片描述
在这里插入图片描述

sklearn库提供了两个线性模型API:

  1. LinearRegression()正规方程

fit_intercept:默认True,是否计算偏置 normalize:默认False,是否中心化 copy_X:默认True,否则X会被改写 n_jobs:默认为1,表示使用CPU的个数。当-1时,代表使用全部CPU

LinearRegression.coef_:回归系数 LinearRegression.intercept_:偏置

代码语言:javascript
复制
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 正规方程
# 获取数据
boston = load_boston()
# 划分训练集测试集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=20221001)
# 特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 训练模型
model = LinearRegression()
model.fit(x_train, y_train)
# 测试模型
y_pre = model.predict(x_test)
print("预测值:", y_pre)
# 评估模型
print("准确率:", model.score(x_test, y_test))
print("均方误差:", mean_squared_error(y_test, y_pre))
在这里插入图片描述
在这里插入图片描述
  1. SGDRegressor()随机梯度下降

loss:损失函数,squared_loss最小二乘法 fit_intercept:是否计算偏置 learning_rate:学习率,“constant”:eta = eta0;“optimal”:eta = 1.0 / (alpha * (t + t0));“invscaling”:eta = eta0 / pow(t, power_t)

SGDRegressor.coef_:回归系数 SGDRegressor.intercept_:偏置

代码语言:javascript
复制
from sklearn.datasets import load_boston
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 随机梯度下降
# 获取数据
boston = load_boston()
# 划分训练集测试集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=20221001)
# 特征工程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 训练模型
model = SGDRegressor()
model.fit(x_train, y_train)
# 测试模型
y_pre = model.predict(x_test)
print("预测值:", y_pre)
# 评估模型
print("准确率:", model.score(x_test, y_test))
print("均方误差:", mean_squared_error(y_test, y_pre))
在这里插入图片描述
在这里插入图片描述

原创不易,请勿转载本不富裕的访问量雪上加霜 ) 博主首页:https://wzlodq.blog.csdn.net/ 来都来了,不评论两句吗👀 如果文章对你有帮助,记得一键三连❤

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 简介
  • 损失函数
  • 优化算法
    • 正规方程
      • 梯度下降
      • 项目实战
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档