热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DeepLearning记录:预测房价——回归问题(HousePricesAdvancedRegressionTechniques)

文章目录一、环境配置说明1.使用Anaconda作为python环境管理2.虚拟环境介绍二、数据集介绍与可视化展示1.数据集介绍2.可视化展示三、数据处理与说明1.数据标准化的目的

文章目录

  • 一、环境配置说明
    • 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()


推荐阅读
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • ①页面初始化----------收到客户端的请求,产生相应页面的Page对象,通过Page_Init事件进行page对象及其控件的初始化.②加载视图状态-------ViewSta ... [详细]
  • plt python 画直线_机器学习干货,一步一步通过Python实现梯度下降的学习
    GradientDescent-梯度下降梯度下降法(英语:Gradientdescent)是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找 ... [详细]
author-avatar
_Terr1鄭x宜_F
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有