Deep Learning 记录:预测房价——回归问题(House Prices - Advanced Regression Techniques)

本文主要是介绍Deep Learning 记录:预测房价——回归问题(House Prices - Advanced Regression Techniques),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、环境配置说明
    • 1.使用Anaconda作为python环境管理
    • 2.虚拟环境介绍
  • 二、数据集介绍与可视化展示
    • 1.数据集介绍
    • 2.可视化展示
  • 三、数据处理与说明
    • 1.数据标准化的目的
    • 2.标准化具体实现
  • 四、网络构建与说明
    • 1.网络选择
    • 2.参数说明
    • 3.损失函数与优化器选择
  • 五、小样本的K折验证
    • 1.直接交叉验证的局限性
    • 2.K折验证说明
    • 3.代码具体实现与说明
      • (一)参数选择
      • (二)分区
      • (三)静默训练
  • 六、验证图像绘制与超参数选择
    • 1.验证图像绘制与比对
    • 2.图像分析与epochs选择
    • 3.分批次训练的目的
  • 七、训练最终模型
    • 1.运行代码展示
    • 2.运行结果展示
    • 3.适当调参
  • 八、代码


一、环境配置说明

1.使用Anaconda作为python环境管理

使用Anaconda作为python环境管理,用于配置对应的虚拟环境
在这里插入图片描述

2.虚拟环境介绍

采用2.3.1版本的Keras与2.0.0版本的tensorflow因为keras与tensorflow两者存在版本匹配,否则将因不兼容而报错。

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


二、数据集介绍与可视化展示

1.数据集介绍

采用的数据集是从keras中导入的波士顿房价数据集,共506个样本。
每个样本含13个数值特征和1个房价平均值。
load_data()默认test_split为0.2,故划分出404个训练样本和102个测试样本。

在这里插入图片描述

2.可视化展示

未说明横纵坐标的全部情况展示:
在这里插入图片描述

在13个数值特征中,我们选择第6个数值特征房间数作为横坐标,纵坐标为房屋价格(以$1000作为单位),以此进行具体展示:
在这里插入图片描述


三、数据处理与说明

1.数据标准化的目的

将取值较大的数或异质数据输入到神经网络中并不安全,可能导致较大的梯度更新,进而导致网络无法收敛。

2.标准化具体实现

为了保证测试结果的真实可靠,我们不能泄露测试集的信息,所以测试数据集的标准化依然是采用由训练数据集计算出来的均值和标准差。

在这里插入图片描述


四、网络构建与说明

在这里插入图片描述

1.网络选择

利用Sequential类定义模型,层线性堆叠
根据资料得知,带relu激活的全连接层(Dense)的简单堆叠在处理简单的向量数据上有出色的表现,所以采用Dense层堆叠

2.参数说明

以第一层为例,此时对应参数分别为隐藏单元个数、激活函数类型和输入矩阵数据第1轴要求
每个带有relu激活的Dense层都实现了:output = relu(dot(w, input) + b)
w为权重矩阵,b为偏置向量w形状为(输入矩阵第1轴,隐藏单元个数)
b为向量,故需要通过广播实现形状不同的张量相加隐藏单元数目越多,网络越能学习到更加复杂的表示,但可能导致过拟合
激活函数用于扩展假设空间,充分利用多层表示的优势
输入矩阵第1轴要求仅在第一层出现,之后添加的层都会自动匹配输入层的形状

3.损失函数与优化器选择

损失函数,衡量当前任务是否成功完成,对于回归问题,我们选择mes损失函数,即均方误差,表示预测值与目标值之差的平方。优化器,决定如何基于损失函数对网络进行更新,对于当前问题,我们选择rmsprop优化器(均方根反向传播)。评价指标,用于判断模型的性能,但不用于网络参数的更新,对于当前问题,我们选择mae,即平均绝对误差,表示预测值与目标值之差的绝对值。

五、小样本的K折验证

1.直接交叉验证的局限性

总共只有404个训练样本,如果直接依照交叉验证的思路将其划分为训练集和验证集,不同的划分方式将导致验证分数有很大的差异,
无法对模型进行可靠的评估。

2.K折验证说明

K折交叉验证,将数据划分为K个分区,总共要计算K轮,将计算出的K个验证分数的平均值作为模型的验证分数,每个分区轮流作为一个验证集,
剩下的K-1个分区作为训练集。

3.代码具体实现与说明

在这里插入图片描述

(一)参数选择

在这里插入图片描述

 K选择4,即将划分为4个分区,并计算出4个验证分数以其平均值作为验证分数。num_val_samples表示分区大小num_epochs表示训练的轮数all_mae_histories存储每一轮的验证分数

(二)分区

在这里插入图片描述

 根据参数i选择分区担任验证集,其余的k-1个分区作为训练集np.concatenate(),功能是根据给定的axis参数,将两个张量进行合并,但要求剩下的部分要可以对应,否则不能合并。在当前划分中,就是将两个训练集合并为一个训练集。

(三)静默训练

在这里插入图片描述

history是调用model.fit()后返回的一个History对象,是一个字典,包含着训练过程中的所有数据
model.fit()是拟合,值得注意的是此时verbose为0,静默模式,也就是不标准输出流中输出日志信息

以下为verbose参数为1时的运行截图:
在这里插入图片描述


六、验证图像绘制与超参数选择

1.验证图像绘制与比对

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

2.图像分析与epochs选择

第一版中epochs选择为80,第二版中为130,在本地运行中,我测试了多次,但测试的验证mae在35轮与68轮均出现了相近的最低点,
由于两者相差较大,取35可能导致训练不够,取68可能导致过拟合,所以我折中选择了52作为最终的epochs

3.分批次训练的目的

批次大小是一个超参数,表示在更新内部模型参数之前要处理的样本数分批次可以更好地概括学习,如果不分批次,网络将一次性传播,会使网络对每个样本过于敏感,也就降低了模型的泛化能力

七、训练最终模型

1.运行代码展示

在这里插入图片描述

2.运行结果展示

在这里插入图片描述
第一版结果:
在这里插入图片描述
第二版结果:
在这里插入图片描述
所得结果与课本示例仍有着1000$左右的差距

3.适当调参

将epochs修改为130,所得结果与第二版课本相差不大
在这里插入图片描述


八、代码

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
boston_housing = tf.keras.datasets.boston_housing
(train_x,train_y),(test_x,test_y) = boston_housing.load_data(test_split=0.2)#数据标准化
mean = train_x.mean(axis=0)
train_x -= mean
std = train_x.std(axis=0)
train_x/=stdtest_x-=mean
test_x/=std#构建网络
from keras import models
from keras import layersdef build_model():model = models.Sequential()model.add(layers.Dense(64, activation='relu',input_shape=(train_x.shape[1],)))model.add(layers.Dense(64, activation='relu'))model.add(layers.Dense(1))model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])return model#训练
model = build_model()
model.fit(train_x, train_y,
epochs=130, batch_size=16, verbose=0)
test_mse_score, test_mae_score = model.evaluate(test_x, test_y)print(test_mae_score)#K折验证
# import numpy as np
# k = 4
# num_val_samples = len(train_x) // k
# # num_epochs = 100
# all_scores = []
# for i in range(k):
#  print('processing fold #', i)
#  val_data = train_x[i * num_val_samples: (i + 1) * num_val_samples]
#  val_targets = train_y[i * num_val_samples: (i + 1) * num_val_samples]
#  partial_train_data = np.concatenate(
#  [train_x[:i * num_val_samples],
#  train_x[(i + 1) * num_val_samples:]],
#  axis=0)
#  partial_train_targets = np.concatenate(
#  [train_y[:i * num_val_samples],
#  train_y[(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)# 保存每折的验证结果
# import numpy as np
# k = 4
# num_val_samples = len(train_x) // k
# num_epochs = 500
# all_mae_histories = []
# for i in range(k):
#     print('processing fold #', i)
#     val_data = train_x[i * num_val_samples: (i + 1) * num_val_samples]
#     val_targets = train_y[i * num_val_samples: (i + 1) * num_val_samples]
#     partial_train_data = np.concatenate(
#         [train_x[:i * num_val_samples],
#         train_x
#         [(i + 1) * num_val_samples:]],
#         axis=0)
#     partial_train_targets = np.concatenate(
#          [train_y[:i * num_val_samples],
#           train_y[(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_mae']
#     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)]#绘制验证分数
# import matplotlib.pyplot as plt
# plt.plot(range(1, len(average_mae_history) + 1), average_mae_history)
# plt.xlabel('Epochs')
# plt.ylabel('Validation MAE')
# plt.show()#删除前十个数据点后绘制验证分数
# 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()

这篇关于Deep Learning 记录:预测房价——回归问题(House Prices - Advanced Regression Techniques)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175952

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓