首页 > 其他分享 >手把手教你用线性回归预测二手房房价

手把手教你用线性回归预测二手房房价

时间:2023-06-25 13:01:35浏览次数:41  
标签:代码 模型 手把手 教你用 清单 参数 线性 回归



导读

在机器学习中,线性模型是一种形式简单但包含机器学习主要建模思想的模型。

线性回归是线性模型的一种典型方法,比如“双十一”中某款产品的销量预测、某数据岗位的薪资水平预测、二手房房价的预测都可以用线性回归来拟合模型。

今天我们就以杭州的二手房的房屋单价为例,看看如何用线性回归进行预测。

2021年杭州二手房挂牌数量累计超过16万套,在新房数量少和排队摇号的限制下,购买二手房已成为杭州人买房更重要的方式。下图是某二手房网站公开的杭州部分地区的二手房房价。

手把手教你用线性回归预测二手房房价_python

图 | 链家

二手房的市场价格是多种因素综合作用的结果,主要因素有:面积、户型、朝向、是否精装、楼层、建筑形态、所属地段、所属城区和附近是否有地铁等

我们的目标是预测二手房的均价,输入自变量包括上述特征,因为二手房房屋单价是一个连续数值,所以可以直接建立起由自变量到因变量的线性回归模型

线性回归的原理推导

给定一组由输入x和输出y构成的数据集D={(x₁,y₁),(x₂,y₂),…,(xₘ,yₘ)},其中xᵢ=(xᵢ1,xᵢ2,…,xᵢd),yᵢ∈R。

线性回归就是通过训练学习得到一个线性模型来最大限度地根据输入x拟合输出y

线性回归试图用上文提到的对房价的影响因素作为输入xᵢ,以房屋单价yᵢ作为输出,学习得到y=wxᵢ+b。

线性回归学习的关键问题在于确定参数w和b,使得拟合输出y与真实输出yᵢ尽可能接近。

在回归任务中,我们通常使用均方误差来度量预测与标签之间的损失,所以回归任务的优化目标就是使得拟合输出和真实输出之间的均方误差最小化,所以有:

手把手教你用线性回归预测二手房房价_算法_02

为求得w和b的最小化参数w*和b*,可基于式(2-1)分别对w和b求一阶导数并令其为0,对w求导的推导过程如式(2-2)所示:

手把手教你用线性回归预测二手房房价_人工智能_03

同理,对参数b求导的推导过程如式(2-3)所示:

手把手教你用线性回归预测二手房房价_机器学习_04

基于式(2-2)和式(2-3),分别令其为0,可解得w和b的最优解表达式为:

手把手教你用线性回归预测二手房房价_机器学习_05

手把手教你用线性回归预测二手房房价_机器学习_06

这种基于均方误差最小化求解线性回归参数的方法就是著名的最小二乘法。最小二乘法的简单图示如下所示。

手把手教你用线性回归预测二手房房价_python_07

下面我们将上述推导过程进行矩阵化以适应多元线性回归问题。

所谓多元问题,就是输入有多个变量,如前述影响薪资水平的因素包括城市、学历、年龄和经验等。为方便矩阵化的最小二乘法的推导,可将参数w和b合并为向量表达形式:

手把手教你用线性回归预测二手房房价_机器学习_08

训练集D的输入部分可表示为一个m×d 维的矩阵X,其中d为输入变量的个数。则矩阵X可表示为式(2-6):

手把手教你用线性回归预测二手房房价_python_09

输出y的向量表达式为y=(y1,y2,…,ym),类似于式(2-1),参数优化目标函数的矩阵化表达式(2-7)为:

手把手教你用线性回归预测二手房房价_python_10

手把手教你用线性回归预测二手房房价_算法_11

根据矩阵微分公式:

手把手教你用线性回归预测二手房房价_算法_12

可得:

手把手教你用线性回归预测二手房房价_机器学习_13

令矩阵XᐪX为满秩矩阵或者正定矩阵,令式(2-13)等于0,可解得参数为:

手把手教你用线性回归预测二手房房价_机器学习_14

但有些时候,矩阵XᐪX并不是满秩矩阵,我们通过对XᐪX添加正则化项来使得该矩阵可逆。一个典型的表达式如下:

手把手教你用线性回归预测二手房房价_深度学习_15

其中λΙ即为添加的正则化项。在线性回归模型的迭代训练时,基于式(14)直接求解参数的方法并不常用,通常可以使用梯度下降之类的优化算法来求得的最优估计。

线性回归的代码实现

基于一个完整机器学习模型实现的视角,我们从整体编写思路到具体分步实现,使用NumPy实现一个线性回归模型。

按照机器学习三要素——模型、策略和算法的原则,逐步搭建线性回归代码框架。

一、编写思路

线性回归模型的主体较为简单,即y=wTx+b,在具体编写过程中,基于均方损失最小化的优化策略和梯度下降的寻优算法非常关键。一个线性回归模型代码的编写思路如图2-3所示。

手把手教你用线性回归预测二手房房价_人工智能_16

图2-3 线性回归模型代码的编写思路

可以看到,图3提供了两种实现方式。一种是基于Numpy的手动实现,也是本文的重点所在。另一种是调用sklearn机器学习库的实现方式,旨在提供对比参考。

二、基于Numpy的代码实现

首先尝试实现线性回归模型的主体部分,包括回归模型公式、均方损失函数和参数求偏导。线性回归模型主体部分的实现如代码清单2-1所示。

手把手教你用线性回归预测二手房房价_深度学习_17

在代码清单2-1中,我们尝试将线性回归模型的主体部分定义为linear_loss函数。该函数的输入参数包括训练数据和权重系数,输出为线性回归模型预测值、均方损失、权重参数一阶偏导和偏置一阶偏导。

在给定模型初始参数的情况下,线性回归模型根据训练数据和参数计算出当前均方损失和参数一阶梯度

然后在linear_loss函数的基础上,定义线性回归模型的训练过程。主要包括参数初始化、迭代训练和梯度下降寻优。

我们可以先定义一个参数初始化函数initialize_params,再基于linear_loss函数和initialize_params函数来定义包含迭代训练和梯度下降寻优的线性回归拟合过程。

参数初始化函数initialize_params如代码清单2-2所示。

手把手教你用线性回归预测二手房房价_机器学习_18

在代码清单2-2中,我们输入训练数据的变量维度,即对于线性回归而言,每一个变量都有一个权重系数。输出为初始化为零向量的权重系数和初始化为零的偏置参数。

最后,我们尝试结合linear_loss和initialize_params函数定义线性回归模型训练过程的函数linear_train,如代码清单2-3所示。

手把手教你用线性回归预测二手房房价_算法_19

手把手教你用线性回归预测二手房房价_深度学习_20

在代码清单2-3中,我们首先初始化模型参数,然后对遍历设置训练迭代过程。在每一次迭代过程中,基于linear_loss函数计算当前迭代的预测值、均方损失和梯度,并根据梯度下降法不断更新系数。

在训练过程中记录每一步的损失、每10000次迭代打印当前损失信息、保存更新后的模型参数字典和梯度字典。这样,一个完整的线性回归模型就基本完成了。

基于上述代码实现,我们使用sklearn的diabetes数据集进行测试,其具体信息如表2-1所示。

手把手教你用线性回归预测二手房房价_python_21

从sklearn中导入该数据集并将其划分为训练集和测试集,如代码清单2-4所示。

手把手教你用线性回归预测二手房房价_机器学习_22

手把手教你用线性回归预测二手房房价_算法_23

代码清单2-4首先导入sklearn的diabetes公开数据集,获取数据输入和标签并打乱顺序后划分数据集,输出为:

手把手教你用线性回归预测二手房房价_深度学习_24

然后我们使用代码清单2-3定义的linear_train函数训练划分后的数据集,如代码清单2-5所示。

手把手教你用线性回归预测二手房房价_算法_25

在学习率为0.01、迭代次数为200000的条件下,我们得到上述训练参数。训练中的均方损失下降过程如图2-4所示。

手把手教你用线性回归预测二手房房价_人工智能_26

图2-4  训练中的均方损失下降过程

基于前述训练参数,我们可以定义一个预测函数对测试集进行预测,如代码清单2-6所示。

手把手教你用线性回归预测二手房房价_深度学习_27

代码清单2-6定义了回归模型的预测函数,输入参数为测试集和模型训练参数,然后通过回归表达式即可进行回归预测。

如何衡量预测结果的好坏呢?

除均方损失外,回归模型的一个重要评估指标是R2系数,用来判断模型拟合水平。我们尝试自定义一个R2系数计算方法,并基于该系数计算代码清单2-6预测结果的拟合水平,具体如代码清单2-7所示。

手把手教你用线性回归预测二手房房价_算法_28

手把手教你用线性回归预测二手房房价_机器学习_29

代码清单2-7给出了回归模型R2系数的计算方式。根据总离差平方和、残差平方和以及R2计算公式,我们计算测试集的R2系数。代码清单2-7的输出如下:

0.5334188457463576

可以看到,我们自定义并训练的线性回归模型在该测试集上的R2系数为0.53,结果并不算太好,除了模型的一些超参数需要做一些调整和优化外,可能线性回归模型本身对该数据集拟合效果有限

三、基于sklearn的模型实现

作为参考对比,这里同样基于sklearn的LinearRegression类给出对于该数据集的拟合效果。LinearRegression函数位于sklearn的linear_model模块下,定义该类的一个线性回归实例后,直接调用其fit方法拟合训练集即可。

参考实现如代码清单2-8所示。

手把手教你用线性回归预测二手房房价_深度学习_30

输出如下:

手把手教你用线性回归预测二手房房价_人工智能_31

可以看到,在不做任何特征处理的情况下,基于sklearn的线性回归模型在同样的数据集上与我们基于NumPy手写的模型表现差异并不大,这也验证了手写算法的有效性。

本文摘编自《机器学习:公式推导与代码实现》


标签:代码,模型,手把手,教你用,清单,参数,线性,回归
From: https://blog.51cto.com/u_15767091/6545020

相关文章

  • 手把手教你用Python构建自己的「王二狗」
    导读在人手N部智能手机的时代,我们对聊天机器人早已不陌生。这两年很火的游戏群聊天机器人「王二狗」更是用它的机智幽默征服了很多人。今天,我们将手把手教你用Python从头开始创建一个聊天机器人,这种机器人能够理解用户的话,并给出适当的回应。闲话不多说,让我们开始从头开始做出自己......
  • 二阶常系数线性非齐次微分方程的解
    目录一、定义二、齐次通解三、非齐次特解1.α不是特征根2.α是特征单重根3.α是特征二重根4.α±iβ不是特征根5.α±iβ是特征根一、定义LaTeX在线编辑器:EquationEditor二阶常系数线性齐次微分方程:\[y^{''}(x)+py^{'}(x)+qy(x)=0\]二阶常系数线性非齐次微分方程:\[y^{......
  • 机器学习十大算法---1.线性回归
    1.线性回归的模型函数和损失函数线性回归遇到的问题一般是这样的。我们有m个样本,每个样本对应于n维特征和一个结果输出,如下:我们的问题是,对于一个新的,他所对应的是多少呢?如果这个问题里面的y是连续的,则是一个回归问题,否则是一个分类问题。对于n维特征的样......
  • 多项式模复合的几乎线性算法, 支持多元多项式在线求值的数据结构
    本文简要介绍对于有限域\(\mathbbF_q\),如何快速计算多项式模复合\(f(g(X))\bmodh(X)\),其中\(f,g,h\)均是次数不超过\(n\)的多项式.介绍的思想汇总于2022年Bhargava,Ghosh,Guo,Kumar和Umans的工作:FastMultivariateMultipointEvaluationOverAllFinit......
  • 电脑上最好的电子书批注阅读器Calibre、非线性阅读神器SumatraPDF
    Calibre:PC端的优秀电子书阅读器和管理工具在信息化的时代,我们对电子书阅读器的需求比以往任何时候都要强烈。在寻找理想的阅读器时,我发现了Calibre,一个PC端的电子书管理工具,不仅支持各种电子书格式,包括EPUB,还具备了强大的阅读功能。最让我兴奋的是Calibre新添加的批注功能。这个......
  • Android 线性布局平分宽度item的隐藏问题
    原文:Android线性布局平分宽度item的隐藏问题-Stars-One的杂货小窝一直只使用layout_weight来平分布局,但是如果隐藏了某个item,会导致其他item宽高有所变化于是询问了ChatGpt后,才是了解到LinearLayout的weightSum这个属性的使用需求一行有3个item平分线性布局,宽度都是......
  • 线性表
    1、线性表线性表是具有相同数据类型的n个数据元素的有限序列。2、线性表的顺序表示特点:逻辑和物理顺序都相同。表中的任意数据元素都可以随机存取。静态分配方式实现#include<stdio.h>//顺序表,静态分配#defineMaxSize10//定义线性表最大长度typedefstruct{......
  • 手把手教你在Windows下搭建Vue开发环境
    一、下载Note.js下载地址:https://nodejs.org/zh-cn/download 二、点击安装包无脑下一步即可(建议修改下路径)三、在选择的安装路径下创建两个文件夹node_cache和node_global 四、打开CMD,设置缓存路径和全局模块存放路径4.1 缓存路径npmconfigsetcache"D:\So......
  • 20230303 2.1. 线性表及其实现
    如何表示多项式?\[f(x)=a_0+a_1x+...+a_{n-1}x^{n-1}+a_nx^n\]方法1:顺序存储结构直接表示\(a[i]\):项\(x^i\)的系数\(a_i\)例如:\[f(x)=4x^5-3x^2+1\]下标i012345a[i]10-3004问题:浪费空间,例如\(x+3x^{2000}\)方法2:顺序存储结构表示非零项......
  • 直接线性变换法DLT(张正友标定法)
    相机2D坐标到3D坐标的变换是一个SLAM、三维重建、相机标定的经典问题,这个过程必定要求解相机的内参矩阵、外参矩阵。虽然这是一个slam最基础的入门问题,似乎只要调一个函数就能完成,但实际上,该问题是一个涉及最优化、矩阵论、代数等多个领域的较复杂数学问题。参考资料:PnP算法详......