线性回归原理推导与应用(五):波士顿房价预测实战

波士顿房价是一个非常经典的多元线性回归入门案例数据集。波士顿房价预测数据集包含了可能会影响房价的十三个因素,并给出了实际的房价(单位为万美元)

波士顿房价数据集数据集下载地址:https://www.kaggle.com/datasets/altavish/boston-housing-dataset?resource=download
而我们这里直接通过pandas包获取,因为这个数据集是pandas包中自带的数据集

数据处理

首先导入需要的python包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #绘图
from sklearn import datasets  #数据集
from sklearn.linear_model import LinearRegression #线性回归模型

接着导入所需要的波士顿房价数据,boston.data是所有的自变量,也就是影响因素。boston.target为实际房价,单位为万美元

# 导入数据
boston = datasets.load_boston()
# 将房价信息转成dataFrame格式
df_boston_house_data = pd.DataFrame(boston.data, columns=boston.feature_names)
df_boston_house_data['PRICE'] = boston.target
#boston.target和'PRICE'列即为房价

输出所有的变量名(在JYnotebook中可以直接打印,pycharm等中需要加上print)

#对应房价的影响因素,对应标题列
boston.feature_names#输出结果
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'])

可以看出有十三个变量,每个变量的解释与类型如下:

属变量名解释类型
CRIM该镇的人均犯罪率连续值
ZN占地面积超过25,000平方呎的住宅用地比例连续值
INDUS非零售商业用地比例连续值
CHAS是否邻近 Charles River(查尔斯河)离散值,1=邻近;0=不邻近
NOX一氧化氮浓度连续值
RM每栋房屋的平均客房数连续值
AGE1940年之前建成的自用单位比例连续值
DIS到波士顿5个就业中心的加权距离连续值
RAD到径向公路的可达性指数连续值
TAX全值财产税率连续值
PTRATIO学生与教师的比例连续值
B黑人占比 ,处理后的占比数据连续值
LSTAT低收入人群占比连续值
MEDV同类房屋价格的中位数连续值

看一下数据集的数量情况,输出结果表示这个数据集共有506行,14列(即之前说过的13个影响因素与房价列)

df_boston_house_data.shape# 输出结果(506, 14)
#打印前五列
df_boston_house_data.head(5)#查看整体的数据情况
df_boston_house_data.describe()

从结果看这一个数据集非常干净,没有缺失值,所以无需进行其他处理,可以直接建模

对于所有的数据,我们需要划分训练集与测试集。其中训练集用来训练模型,得到模型的相关参数,而测试集用来测试得到的模型的准确性。我们选取80%的数据作为训练数据,剩下的20%作为测试数据

为了随机选取数据集中的数据,首先新建一个包含506个数据的序列,然后使用shuffle函数来将序列的所有元素随机排序,然后根据打乱的序号来选取前80%的数据,这样就做到了随机选取80%数据进行训练

#拆分训练集和测试集,取80%为训练集
index=np.arange(506)
#np.random.shuffle 洗牌函数,将数据顺序打乱 
np.random.shuffle(index)
index[:10]#输出前10列,可以看到顺序已经被打乱了

之后根据随机后index切分原有的数据,得到训练数据集和测试数据集

train_index=index[:405]
test_index=index[405:]
#训练数据集
X_train = boston.data[train_index]
Y_train = boston.target[train_index]
display(X_train.shape,Y_train.shape)

两个训练数据集分别为405行13列和405行1列。

#测试数据集
X_test = boston.data[test_index]
Y_test = boston.target[test_index]
display(X_test.shape,Y_test.shape)

两个测试数据集分别为101行13列和101行1列。

建模

使用sklearn中的LinearRegression函数建模,这个函数的相关参数和解释如下:

lr = sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)

返回一个线性回归模型,损失函数为误差均方函数。

参数详解:

  • fit_intercept:默认True,是否计算模型的截距,为False时,则数据中心化处理
  • normalize:默认False,是否中心化,或者使用sklearn.preprocessing.StandardScaler()
  • copy_X:默认True,否则X会被改写
  • n_jobs:默认为1,表示使用CPU的个数。当-1时,代表使用全部CPU

调用方法:

  • coef_:训练后的输入端模型系数,如果label有两个,即y值有两列。那么是一个2D的array
  • intercept_:截距
  • predict(x):预测数据
  • score:评估
#将后面输出各参数的形式改为小数,比较好看一点
np.set_printoptions(suppress = True)model=LinearRegression(fit_intercept=True)
model.fit(X_train,Y_train)#输出所有自变量的参数值
display(model.coef_,model.intercept_)#输出得到所有自变量的参数值为
array([ -0.11773312,   0.04681254,  -0.04002632,   3.68539789,-17.97706949,   3.21418931,   0.01994593,  -1.44502271,0.33251652,  -0.01158733,  -0.89816759,   0.00669943,-0.60311895])
#当然由于是随机选取了80%的数据进行训练,所以如果你实际复现的代码得到的参数是和我得出来得参数有差别的

建模完成后我们可以使用predict()方法来根据得出的模型和测试集变量得数据得到预测的房价结果

#根据得出的模型,输入测试集的数据,并与测试集的结果比较
y_predict=model.predict(X_test).round(2)
#输出前30个预测结果
y_predict[:30]

为了更方便的查看对应的结果,将实际值和预测值放到一起比较一下:

# 绘制预测值与真实值图# 规定字体,避免乱码import matplotlib.pyplot as plt
plt.figure(figsize=(14, 5))# 调整输出的图片大小
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(Y_test, color="r", label="实际价格")  # 颜色表示
plt.plot(y_predict, color=(0, 0, 0), label="预测价格")
plt.xlabel("测试序号")  # x轴命名表示
plt.ylabel("价格")  # y轴命名表示
plt.title("实际值与预测值折线图")
plt.legend()  # 增加图例
plt.show()  # 显示图片

从显示的图片中可以看出模型的结果似乎还不错。
在这里插入图片描述

模型评估

最后就是定量的对模型进行研究,与我们之前说的一元线性回归类似,对于多元线性回归模型好坏的判断指标一般有:

R 2 R^2 R2评价指标

sklearn在实现线性回归时默认采用 R 2 R^2 R2指标, R 2 R^2 R2越大表示模型越好,其定义如下:

R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ‾ ) 2 ∈ [ 0 , 1 ] R^2=1-\frac{\sum_{i=1}^n(y_i-\hat{y}_i)^2}{\sum_{i=1}^n(y_i-\overline{y})^2}\in[0,1] R2=1i=1n(yiy)2i=1n(yiy^i)2[0,1]
其中 y ‾ \overline{y} y表示真实值的平均值。

回到我们得到的模型中,得到的R方结果为0.74,结果还是不错的

#R方模型评估,越接近1证明模型越好
model.score(X_test,Y_test)
均方误差MAE

其实就是最小二乘法中的损失函数,计算方程预测值与实际值的距离,结果越小表示结果越好
M A E = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ , ∈ [ 0 , + ∞ ) \large{MAE=\frac{1}{n} \sum_{i=1}^n |y_i - \hat{y}_i|},\;\;\in[0,+\infty) MAE=n1i=1nyiy^i,[0,+)

#最小二乘法损失函数评估,越小模型结果越好
from sklearn.metrics import mean_squared_error
mean_squared_error(Y_test,y_predict)

这个模型得出的结果为 22.6448

波士顿房价预测是一个比较简单的建模,因为这一个数据集非常干净,没有缺失或者需要处理的数据,同时建模的变量也是筛选好的,而在实际的建模中我们会遇到非常多的变量,需要进行数据清洗和特征工程,并不断的验证优化才能得到好用的参数和模型,这些在实际的建模中会是更重要的步骤。对于初学者来说我们可以从这一个案例中了解建模的相关基础代码和流程,后续会接着介绍其他更复杂的案例。

参考文章:
https://muxiner.github.io/ml-boston-housing/
https://www.heywhale.com/mw/project/5eee291fcaa99b002d6d9dfd

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34720.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于CATIA二次开发的低音炮腔体容积精准计算技术详解

一、功能概述 本工具通过PySide6与CATIA V5深度集成,实现了低音炮上下腔体内体积的自动化测量系统。系统采用三维实体建模法进行容积计算,相较于传统手工计算方式,精度提升可达0.5%。主要功能模块包括: 壳体特征自动识别动态草图…

向量数据库原理及选型

向量数据库 什么是向量什么是向量数据库原理应用场景 向量数据库的选型主流向量数据库介绍向量数据库对比主流向量数据库对比表 选型建议 什么是向量 向量是一组有序的数值,表示在多维空间中的位置或方向。向量通常用一个列或行的数字集合来表示,这些数…

IE代理切换器v1.2免费版

虽然IE浏览器已经过时了,但很多其他浏览器,比如谷歌浏览器的代理服务器设置,都还是基于IE浏览器来进行设置的,如果你的工作场景需要切换不同的代理服务器来访问网络,那这款工具适合你,目前该工具可以实现IE…

模运算的艺术:从基础到高阶的算法竞赛应用

在算法竞赛中,模运算(取模运算)是一个非常重要的概念,尤其在处理大数、防止溢出、以及解决与周期性相关的问题时。C 中的模运算使用 % 运算符,但它的行为和使用场景需要特别注意。 1. 模运算的基本概念 模运算是指求一…

SpringBoot前后端不分离,前端如何解析后端返回html所携带的参数

有一个SpringBoot实现的前后端不分离项目,当前端跳转某个界面时,比如下面的菜单树按钮,后端在返回页面menuTree.html时,还携带了一个参数角色roleId,以便打开菜单树,还要根据这个角色查询对应的分配授权的菜…

操作系统八股文整理(一)

操作系统八股文整理 一、进程和线程的区别二、进程与线程的切换过程一、进程切换进程切换的步骤: 二、线程切换线程切换的步骤: 三、进程切换与线程切换的对比四、上下文切换的优化 三、系统调用一、系统调用的触发二、从用户空间切换到内核空间三、执行…

卷积神经网络(CNN)之 EfficientNet

在深度学习领域,模型的计算效率与性能之间的平衡一直是一个核心挑战。随着卷积神经网络(CNN)在图像分类、目标检测等任务中取得显著成果,模型的复杂度和计算需求也急剧增加。2019年,Google Research 提出的 EfficientN…

leetcode0031 下一个排列-medium

1 题目: 下一个排列 官方标定难度:中等 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一…

Suno的对手Luno:AI音乐开发「上传参考音频 - 方式二:通过URL的方式」 —— 「Luno Api系列|AI音乐API」第12篇

导读 今天来看下Luno Api的上传参考音频 - 方式一:通过二进制流的方式。 参考文件,主要是用于在创作的过程中,希望AI参考这个音乐的曲风和声音来进行创作, 这一节看看如何直接使用url的方式进行实现。 申请和使用 「已经有API…

【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search

大语言模型(LLMs)在处理复杂推理和实时信息检索时面临两大挑战:知识局限性(无法获取最新外部知识)和检索灵活性不足(传统方法依赖固定检索流程)。现有方法如检索增强生成(RAG)和工具调用(Tool-Use)存在以下问题: RAG:单轮检索导致上下文不足,无法适应多轮交互场景…

Blender-MCP服务源码2-依赖分析

Blender-MCP服务源码2-依赖分析 有个大佬做了一个Blender-MCP源码,第一次提交代码是【2025年3月7号】今天是【2025年月15日】也就是刚过去一周的时间,所以想从0开始学习这个代码,了解一下大佬们的开发思路 1-核心知识点 from mcp.server.fas…

【孟德尔随机化】Leave-one-out analysis的异常点,判断

下面Leave-one-out analysis的结果,第一条线代表去掉rs174564的结果,一些文献把这种情况判断为异常点/离群点,我们接下来看看其他结果 散点图的结果,最旁边的就是rs174564,这个SNP的点 在看下RadialMR的结果&#xff0…

【计算机网络】2物理层

物理层任务:实现相邻节点之间比特(或)的传输 1.通信基础 1.1.基本概念 1.1.1.信源,信宿,信道,数据,信号 数据通信系统主要划分为信源、信道、信宿三部分。 信源:产生和发送数据的源头。 信宿:接收数据的终点。 信道:信号的传输介质。 数据和信号都有模拟或数字…

kubernetes|云原生|部署单master的kubernetes 1.25.5版本集群完全记录(使用contained 运行时)

一、 部署目标: kubernetes版本1.19,1.23的前后差异还是比较巨大的,到1.25版本,为了追求高性能,自然还是需要使用containerd,本文将主要讲述在centos7虚拟机下部署kubernetes 1.25.5集群,使用…

DeepSeek+Dify本地部署私有化知识库

1.Windows安装docker Windows安装Docker-CSDN博客 2.安装olloma https://ollama.com/ 安装完成,可以在桌面右下角看到olloma图标 3.安装deepseekR1模型 ollama官网(deepseek-r1),找到deepseek模型 选择合适大小的模型&#xff…

[Linux][经验总结]Ubuntu6.11.0 docker更换镜像源(实操可用的正确方法)

一、前言 关于Ubuntu更换docker镜像源,网上有很多的教程,但在实操中发现,更换的源无法生效——原因是我的docker是在系统安装时,选择附加安装的package的方式安装的。 现将处理过程记录如下。 二、获取镜像源 在网上随便找个几…

NHANES指标推荐:BRI!

文章题目:Association of body roundness index with cardiovascular disease in patients with cardiometabolic syndrome: a cross-sectional study based on NHANES 2009-2018 DOI:10.3389/fendo.2025.1524352 中文标题:心脏代谢综合征患者…

3.水中看月

前言 这篇文章讲解套接字分配IP地址和端口号。这部分内容也相对有些枯燥,但并不难,而 且是学习后续那些有趣内容必备的基础知识(计算机网络基础)。 一、分配给套接字的IP地址与端口号 IP是InternetProtocol(网络协议…

Linux驱动开发-①pinctrl 和 gpio 子系统②并发和竞争③内核定时器

Linux驱动开发-①pinctrl 和 gpio 子系统②并发和竞争③内核定时器 一,pinctrl 和 gpio 子系统1.pinctrl子系统2.GPIO子系统 二,并发和竞争1.原子操作2.自旋锁3.信号量4.互斥体 三,按键实验四,内核定时器1.关于定时器的有关概念1.…

奇安信二面

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…