深度学习课程设计——波士顿房价预测

2023-11-08

       基于密集连接神经网络的波士顿房价预测

                               摘  

神经网络是从信息处理角度对人脑神经元网络进行抽象,建立某种模型,按不同的连接方式组成不同的网络。本文以波士顿房价这一经典数据集为基础,该数据集包含了住宅用地所占比例等13个特征,由于keras.datasets里内置了波士顿房价数据集,所以直接导入。接着对该数据集进行特征标准化,构建包含三层全连接层的网络模型,前两层有64个单元,激活函数为‘relu’,最后一层为1个单元,不加激活层,这样可以预测任意范围的值。编译网络optimizers是‘rmsprop’,loss是‘mse’。然后查看前五个房屋实际价格与预测房屋价格,发现差异较大。然后重新构建一个包含五层的网络模型,前两层是64个单元,后三层分别是32、16、1个单元的全连接层,发现模型性能有所改进,但预测结果还是不太理想。则在模型中引入K交叉折验证方法进行改进,通过调节模型训练轮数、优化器等参数,最后观察模型性能,预测房价与实际房价相差约2400美元,查看前五个预测房屋价格分别是:8.473495,20.397701,22.871258,33.599148,25.75566,与实际房屋价格比较符合。

关键词:波士顿房价;特征标准化;神经网络;K折交叉验证

                           


                           目录

基于密集连接神经网络的波士顿房价预测

                   摘  要

一、课程设计目的

二、总体思路

三、神经网络实现过程

四、总结

五、参考文献


一、课程设计目的

在现实的生活中我们经常遇到分类与预测的问题,目标变值通常会受到多个因素的影响,并且不同的因素对于目标变量的影响也不尽相同,因此权重也会不相同,有些因素权重大,有些因素权重小。我们通常会通过已知的因素来预测目标变量的值。

房价是受诸多因素影响的,如人均犯罪率、每个住宅的平均房间数、高速公路可达性等。这些都是影响房子价格的因素。房价明显是连续的取值,故房价预测问题是回归问题。于是我们将通过深度学习来预测波士顿房价。

二、总体思路

构建波士顿房价预测任务的神经网络模型步骤:

                                                                         

三、神经网络实现过程

3.1、数据预处理

首先我们需要加载波士顿房价数据,通过观察我们可以发现数据中有404个训练样本和数102个测试样本,每个样本都有13个数值特征,数值特征如下:

属性

数据类型

字段描述

CRIM

Float

城镇人均犯罪率

ZN

Float

占地面积超过2.5万平方英尺的住宅用地比例

INDUS

Float

城镇非零售业务地区的比例

CHAS

Integer

查尔斯河虚拟变量 (= 1 如果土地在河边;否则是0)

NOX

Float

一氧化氮浓度(每1000万份)

RM

Float

平均每居民房数

AGE

Float

在1940年之前建成的所有者占用单位的比例

DIS

Float

五个波士顿就业中心的加权距离

RAD

Integer

辐射状公路的可达性指数

TAX

Float

每10,000美元的全额物业税率

PTRATIO

Float

城镇师生比例

B

Float

1000(Bk - 0.63)^ 2其中Bk是城镇黑人的比例

LSTAT

Float

人口中地位较低人群的百分数

MEDV

Float

(目标变量/类别属性)以1000美元计算的自有住房的中位

我们预测的目标是房屋价格的中位数,单位是千美元。查看测试集前五个数据如下表:

CRIM

ZN

INDUS

CHAS

NOX

RM

AGE

DIS

RAD

TAX

PIRATIO

B

LSTAT

MEDV

0.00632

18.0

2.31

0

0.538

6.575

65.2

4.0900

1

296.0

15.3

396.90

4.98

24.0

0.02731

0.0

7.07

0

0.469

6.421

78.9

4.9671

2

242.0

17.8

396.90

9.14

21.6

0.02729

0.0

7.07

0

0.469

7.185

61.1

4.9671

2

242.0

17.8

392.83

4.03

34.7

0.03237

0.0

2.18

0

0.458

6.998

45.8

6.0622

3

222.0

18.7

394.63

2.94

33.4

0.06905

0.0

2.18

0

0.458

7.147

54.2

6.0622

3

222.0

18.7

396.90

5.33

36.2

从样本中数据可以见其取值范围差异较大,若直接输入网络,网络可能会自动适应这种取值范围,但学习会比较困难。因此,我们将对每个特征做标准化,即对每个输入特征减去特征平均值,再除以标准差,这样得到的特征平均值为0,标准差为1

###将特征标准化###  
mean = train_data.mean(axis=0)    #计算训练集每一列的均值  
  
std = train_data.std(axis=0)      #计算训练集每一列的方差  
train_data -= mean  
train_data /= std  
test_data -= mean  
test_data /= std 

 3.2、构建网络

本题样本较小,网络结构不复杂,采用三层全连接层。其中密集连接网络(全连接网络)密集连接网络是Dense层的堆叠,它用来处理向量数据(向量批量)。这种网络假设输入特征中没有特定结构:之所以叫做密集连接。是因为Dense层的每个单元都和其他所有单元相连接。这种层试图映射任意两个输入特征之间的关系,它与二维卷积层不同,后者只查看局部关系。

在项目2中介绍过输入数据为向量(数组组成的数组),标签为标量(单个数组),对于这种类型的问题,带有relu激活的全连接层的简单堆叠表现较好。因此前两层的激活函数为‘relu’。最后一层使用纯线性(不加激活层),这样可以预测任意范围内的值。

第一层:全连接层,设置64个单元,激活函数为‘relu’
第二层:全连接层,设置64个单元,激活函数为‘relu’
第三层:全连接层,设置1个单元

编译网络optimizers是‘rmsprop’(),loss是‘mse’(均方误差) 

def build_model():  
model = models.Sequential()  
model.add(layers.Dense(64,activation='relu',  
input_shape=(train_data.shape[1],)))  
model.add(layers.Dense(64,activation='relu'))  
model.add(layers.Dense(1))  
model.compile(optimizer='rmsprop',loss='mse',metrics=['mae'])  
return model  

3.3、模型评测

然后评测训练模型,结果如下:

32/102 [========>.....................] - ETA: 0s
102/102 [==============================] - 0s 20us/step
2.789275459214753
[[10.174608]
 [18.987032]
 [22.46014 ]
 [35.86448 ]
 [25.396717]]
[ 7.2 18.8 19.  27.  22.2]

发现效果不是很好,于是重新构建一个网络,如下:

第一层:全连接层,设置64个单元,激活函数为‘relu’

第二层:全连接层,设置64个单元,激活函数为‘relu’

第三层:全连接层,设置32个单元,激活函数为’relu’

第四层:全连接层,设置16个单元,激活函数为’relu’

第五层:全连接层,设置1个单元

model = Sequential([  
Dense(64,activation="relu",input_shape=(13,),name="dense1"),  
Dense(64,activation="relu",name="dense2"),  
Dense(32,activation="relu",name="dense3"),  
Dense(16,activation="relu",name="dense4"),  
Dense(1,name="dense5"),  
])  
model.compile(optimizer="adam",loss="mse",metrics=['mae'])  

 运行结果如下:

32/102 [========>.....................] - ETA: 0s
102/102 [==============================] - 0s 488us/step
2.761275282093123
[[ 7.9929595]
[18.680035 ]
[22.014114 ]
[33.955776 ]
[25.633823 ]]
[ 7.2 18.8 19.  27.  22.2]

运行结果相较与之前三层的模型有所提升,但预测结果还不是特别理想,与引入K折交叉验证的方法,对模型进行改进。一般情况将K折交叉验证用于模型调优,找到使得模型泛化性能最优的超参值。

K折验证的原理:
K折验证(k-fold validation)将数据划分为大小相同的K个分区。对于每个分区i,在剩余的K-1个分区上训练模型,然后在分区i上评估模型。最终分数等于K个分数的平均值。对于不同的训练集—测试集划分,如果模型性能的变化很大,那么这种方法很有用。与留出验证一样,这种方法也需要独立的验证集进行模型校正。
K折交叉验证的示意图见图下所示:

 找到后,在全部训练集上重新训练模型,并使用独立测试集对模型性能做出最终评价。K折交叉验证使用了无重复抽样技术的好处:每次迭代过程中每个样本点只有一次被划入训练集或测试集的机会。

K折验证程序:

###K折验证###  
k = 4  
num_val_samples = len(train_data) // k  
num_epochs = 100  
all_scores = []  
for i in range(k):  
    print('processing fold #',i)  
    val_data = train_data[i*num_val_samples:(i+1)*num_val_samples]  
    val_targets = train_targets[i*num_val_samples:(i+1)*num_val_samples]  
  
    partial_train_data = np.concatenate(  
        [train_data[:i*num_val_samples],  
         train_data[(i+1)*num_val_samples:]],  
        axis=0)  
    partial_train_targets = np.concatenate(  
        [train_targets[:i * num_val_samples],  
         train_targets[(i + 1) * num_val_samples:]],  
        axis=0)  
    model = build_model()  
    model.fit(partial_train_data,partial_train_targets,  
              epochs=num_epochs,batch_size=1,verbose=0)  
    val_mse,val_mae = model.evaluate(val_data,val_targets,verbose=0)  
    all_scores.append(val_mae)  
# print(all_scores)  
# print(np.mean(all_scores))  
##保存K折验证的结果  
num_epochs = 40  
all_mae_histories = []  
for i in range(k):  
    print('processing fold #',i)  
    val_data = train_data[i * num_val_samples:(i + 1) * num_val_samples]  
    val_targets = train_targets[i * num_val_samples:(i + 1) * num_val_samples]  
  
    partial_train_data = np.concatenate(  
        [train_data[:i * num_val_samples],  
        axis=0)  
    partial_train_targets = np.concatenate(  
        [train_targets[:i * num_val_samples],  
         train_targets[(i + 1) * num_val_samples:]],  
        axis=0)  
    model = build_model()  
    history = model.fit(partial_train_data, partial_train_targets,  
                        validation_data=(val_data,val_targets),  
                        epochs=num_epochs, batch_size=1, verbose=0)  
    mae_history = history.history['val_mean_absolute_error']  
    all_mae_histories.append(mae_history)  
#计算所有轮次中的K折验证分数平均值  
average_mae_history = [np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]  
###绘制验证分数###  
plt.plot(range(1,len(average_mae_history)+1),average_mae_history)  
plt.xlabel('Epochs')  
plt.ylabel('Validation MAE')  
plt.show()  
###绘制验证分数(删除前10个数据点)###  
def smooth_curve(points,factor=0.9):  
    smoothed_points = []  
    for point in points:  
        if smoothed_points:  
            previous = smoothed_points[-1]  
           smoothed_points.append(previous * factor + point * (1-factor))  
        else:  
            smoothed_points.append(point)  
    return smoothed_points  
smooth_mae_history = smooth_curve(average_mae_history[10:])  
plt.plot(range(1,len(smooth_mae_history)+1),smooth_mae_history)  
plt.xlabel('Epochs')  
plt.ylabel('Validation MAE')  
plt.show()  
l_scores.append(val_mae)  

加入K折交叉验证平均绝对误差在500轮模型的结果:

32/102 [========>.....................] - ETA: 0s
102/102 [==============================] - 0s 4ms/step
3.0198199421751735
[[ 9.111161]
 [19.31696 ]
 [20.284008]
 [27.230476]
 [22.588339]]
[ 7.2 18.8 19.  27.  22.2]

 由上图可知,K折交叉验证轮次在70轮左右就过拟合了,因此我们把K折交叉验证训练轮数改为80轮,模型的运行结果如下:

 由输出结果可知,预测房价与实际房价相差约2400美元,然后查看前五个预测房屋价格分别是:8.47349520.39770122.87125833.59914825.75566,与实际房屋价格比较符合。

四、总结

  1. 回归问题常用的损失函数是均方误差MSE
  2. 回归问题常用的评估指标是平均绝对误差MAE
  3. 如果输入数据特征具有不同的取值范围,应先进行预处理,对每个特征进行单独缩放
  4. 如果可用的数据量很少,可以使用k折验证以可靠地评估模型
  5. 如果可用的训练数量很少,模型训练出来的结果不是特别理想,可以适当调节网络层数,或是训练代数。

                                         

五、参考文献

[1][]弗朗索瓦.肖莱,张亮 .Python深度学习[M].北京:中国工信出版集团,201867-72.

[2]波士顿房价预测Python深度学习,CSDNhttps://blog.csdn.net/ /article/details.nonecase

[3]梁子超,李智炜,赖铿,林卓琛,李铁钢,张晋昕.10折交叉验证用于预测模型泛化能力评价及其R软件实现[J].中国医院统计,2020,27(04):289-292.

直接下载课程设计PDF

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习课程设计——波士顿房价预测 的相关文章

随机推荐

  • 探索Java8——测试Lambda表达式

    文章目录 测试Lambda表达式 测试可见Lambda行为 测试使用Lambda的方法的行为 调试 测试Lambda表达式 通常而言 好的软件工程实践一定少不了单元测试 借此保证程序的行为与预期一致 你编写测试用例 通过这些测试用例确保你代
  • FISCO BCOS(二十九)———区块链浏览器

    一 浏览器主要用途 区块链浏览器将区块链中的数据可视化 并进行实时展示 方便用户以Web页面的方式 获取当前区块链中的信息 二 一键部署 2 1 环境要求 环境 版本 Java JDK8或以上版本 MySQL MySQL 5 6或以上版本
  • UE4-VaRest客户端上传玩家得分并获取排行榜

    排行榜相关 1 上传得分 2 获取玩家排名 3 获取排行榜 1 上传得分 2 获取玩家排名 3 获取排行榜
  • 一个环境变量导致运行报错Exception in thread "main" java.lang.NoClassDefFoundError:

    昨天下午编译通过就一直报错Exception in thread main java lang NoClassDefFoundError 早上终于调通了 加油 1 安装与配置 1 在我的电脑C盘里安装了SDK 路径是这样的 C Progra
  • 如何卸载显卡驱动通过软件简单卸载法

    有时候需要卸载显卡的驱动时 可以通过下载这个软件来卸载 显卡驱动卸载工具 Display Driver Uninstaller 简称为DDU卸载工具 下载地址为 Official Display Driver Uninstaller DDU
  • Python爬虫爬取VIP网站

    一直有爱看美剧的习惯 一方面锻炼一下英语听力 一方面打发一下时间 之前是能在视频网站上面在线看的 可是自从广电总局的限制令之后 进口的美剧英剧等貌似就不在像以前一样同步更新了 但是 作为一个宅diao的我又怎甘心没剧追呢 所以网上随便查了一
  • 信息系统分析相关知识梳理

    一 企业信息化战略与实施 一 企业信息化 1 以数据处理为核心 围绕职能部门 有企业系统规划法 关键成功因素法 战略集合转化法 2 以企业内部管理信息系统为核心 围绕企业整体 有战略数据规划法 信息工程法 战略栅格法 3 以集成为核心 面向
  • AD20画板基本流程

    AD20画板流程 前言 一 AD库的选择与添加 二 画原理图 1 选择元器件 2 放置端口和放置线 3 标注 4 分离模块 5 将原理图更新到PCB中 1 元器件未封装 2 网络标签的网络属性没有放在放置线上 3 网络标签没有对应上 三 P
  • ESP系列模组PCB设计及天线摆放

    ESP8266 8285系列可以焊接到PCB板上 为了使模组获得最佳的射频性能 要合理设计模组和天线在底板上的摆放位置 一 布局 1 天线布局 二 电路设计 三 地层
  • JAVA开发运维(web场景漏洞与修复)

    漏洞一 fastjson lt 1 2 80 反序列化任意代码执行漏洞 修复建议 1 升级到最新版本1 2 83 https github com alibaba fastjson releases tag 1 2 83 该版本涉及auto
  • 做了一个directshow的filter,把RGB视频流变成黑白的 .

    转自 http blog csdn net mengaim cn article details 241449 做的这个directshow的filter属于transform filter 在其间 参考了 directshow的帮助文档
  • vt 在ubuntu交叉编译windows的执行文件

    参考文档 见官网 系统 ubuntu18 04 编译步骤 1 安装 goclang 下载 https golang org doc install 解压命令 tar C usr local xzf go1 14 2 linux amd64
  • Connection is read-only. Queries leading to data modification are not allowed

    看了下mysql connector 5 1 40版本中 如果设置failoverReadOnly true 即默认值 参考 链接 当mysql连接failover时 会根据jdbc连接串将当前连接的readOnly值设置为true 第8行
  • Matlab之行列向量的赋值

    在别人的matlab代码中看到 将列向量赋值给行向量 最初还以为是别人的代码有bug 实际上运行后才发现是由自己的无知造成的 因此 将如下一小段测试的代码贴出来 向量的维度由左值 被赋值的变量 决定 column 1 2 3 row 0 0
  • python程序设计报告-20191206 实验二《Python程序设计》实验报告

    学号 2019 2020 2 Python程序设计 实验二报告 课程 Python程序设计 班级 1912 姓名 陈发强 学号 20191206 实验教师 王志强 实验日期 2020年4月19日 必修 选修 公选课 1 实验内容 设计并完成
  • 7-7 12-24小时制 (15 分)

    编写一个程序 要求用户输入24小时制的时间 然后显示12小时制的时间 输入格式 输入在一行中给出带有中间的 符号 半角的冒号 的24小时制的时间 如12 34表示12点34分 当小时或分钟数小于10时 均没有前导的零 如5 6表示5点零6分
  • 雷达系统与信号处理概述(一)

    第一章 雷达系统与信号处理概述 一 目录 第一章 雷达系统与信号处理概述 一 1 1 雷达的基本功能 1 2 检测 跟踪 成像概述 1 3 检测概率和虚警概率 1 3 1检测概率 1 3 2虚警概率 1 4 雷达分辨率 1 4 1 雷达距离
  • 静态对象、全局对象与程序的运行机制

    静态对象 全局对象与程序的运行机制 1 在介绍静态对象 全局对象与程序的运行机制之间的关系之前 我们首先看一下atexit函数 atexit函数的声明为 int atexit void cdecl func void 参数为函数指针 返回值
  • vue面试题+答案,2021前端面试

    vue面试题 答案 2022前端面试 前端进阶面试题详细解答 MVC 和 MVVM 区别 MVC MVC 全名是 Model View Controller 是模型 model 视图 view 控制器 controller 的缩写 一种软件
  • 深度学习课程设计——波士顿房价预测

    基于密集连接神经网络的波士顿房价预测 摘 要 神经网络是从信息处理角度对人脑神经元网络进行抽象 建立某种模型 按不同的连接方式组成不同的网络 本文以波士顿房价这一经典数据集为基础 该数据集包含了住宅用地所占比例等13个特征 由于keras