Keras深度学习(4)-回归问题之预测房价

article/2025/9/27 0:18:26

在深度学习的任务中,回归问题也是一个常见的任务。
本文将要预测 20 世纪 70 年代中期波士顿郊区房屋价格的中位数,已知当时郊区的一些数据点,比如犯罪率、当地房产税率等。本节用到的数据集与前面两个例子有一个有趣的区别。它包含的数据点相对较少,只有 506 个,分为 404 个训练样本和 102 个测试样本。输入数据的每个特征(比如犯罪率)都有不同的取值范围。例如,有些特性是比例,取值范围为 0~1;有的取值范围为 1~12;还有的取值范围为 0~100,等等。

1 回归问题模型的训练

回归问题有以下几个要点:

  • 隐藏层激活函数用relu
  • 输出层只有一个值,并且不用激活函数(相当于使用恒等函数)
  • 损失函数使用均方误差mse
  • 监控指标使用平均绝对误差mae

模型的训练代码如下:

import numpy as np 
from tensorflow.keras.datasets import boston_housing
from tensorflow.keras import models
from tensorflow.keras import layers
import matplotlib.pyplot as pltdef build_model():model=models.Sequential()model.add(layers.Dense(units=64,activation='relu',input_shape=(13,)))model.add(layers.Dense(units=64,activation='relu'))#回归问题的输出问题不需要激活函数,默认就为恒等函数model.add(layers.Dense(units=1))#损失函数使用均方误差 监控指标使用平均绝对误差model.compile(optimizer='rmsprop',loss='mse',metrics=['mae'])return modelif __name__=='__main__':#准备训练数据#(404, 13) (404,)   (102, 13) (102,)#每个样本中有13个数值特征,比如人均犯罪率、每个住宅的平均房间数等#目标是房屋价格的中位数,单位是千美元(train_data,train_targets),(test_data,test_targets)=boston_housing.load_data()#将数据标准化#减去特征平均值,再除以标准差,得到特征平均值为0,标准差为1mean=train_data.mean(axis=0)train_data-=meanstd=train_data.std(axis=0)train_data/=std#测试数据必须以训练数据的均值和标准差进行变换,这样两者的变换才一致test_data-=meantest_data/=std#由于训练样本过少,采用K折交叉验证k=4num_val_samples=len(train_data)//knum_epochs=500all_val_mae_histories=[]all_scores=[]for i in range(k):print('第几折:'+str(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]#训练集x_train_data=np.concatenate([train_data[:i*num_val_samples],train_data[(i+1)*num_val_samples:]],axis=0)y_train_targers=np.concatenate([train_targets[:i*num_val_samples],train_targets[(i+1)*num_val_samples:]],axis=0)model=build_model()#verbose=0代表训练时用的是静默模式history=model.fit(x=x_train_data,y=y_train_targers,validation_data=(val_data,val_targets),epochs=num_epochs,batch_size=1,verbose=1)#保存验证的平均绝对误差val_mae_history=history.history['val_mae']all_val_mae_histories.append(val_mae_history)#计算所有轮次中K折验证分数的平均值average_mae_history=[np.mean([x[i] for x in all_val_mae_histories]) for i in range(num_epochs)]#绘制验证分数 不要绘制前10个数据点plt.plot(range(1+10,len(average_mae_history)+1),average_mae_history[10:])plt.xlabel('Epochs')plt.ylabel('Validation MAE')plt.show()#从上面的k折交叉验证得到验证损失图像中得出最佳的训练批次是80次#然后以这个次数训练得到最终的模型#在所有数据上得到训练模型model=build_model()model.fit(x=train_data,y=train_targets,epochs=80,batch_size=16)#在测试数据上评价test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)print('test_mse_score:'+str(test_mse_score))print('test_mae_score:'+str(test_mae_score))#保存模型model.save('./model/house.h5')

在这个例子中,由于训练样本非常少,只有四百多个,为了在调节网络参数(比如训练的轮数)的同时对网络进行评估,你可以将数据划分为训练集和验证集,正如前面例子中所做的那样。但由于数据点很少,验证集会非常小(比如大约100 个样本)。因此,验证分数可能会有很大波动,这取决于你所选择的验证集和训练集。也就是说,验证集的划分方式可能会造成验证分数上有很大的方差,这样就无法对模型进行可靠的评估。
在这种情况下,最佳做法是使用 K 折交叉验证(见图 3-11)。这种方法将可用数据划分为 K个分区(K 通常取 4 或 5),实例化 K 个相同的模型,将每个模型在 K-1 个分区上训练,并在剩下的一个分区上进行评估。模型的验证分数等于 K 个验证分数的平均值。这种方法的代码实现很简单。
下图为3折交叉验证。
在这里插入图片描述
交叉验证的具体代码如下:

#由于训练样本过少,采用K折交叉验证k=4num_val_samples=len(train_data)//knum_epochs=500all_val_mae_histories=[]all_scores=[]for i in range(k):print('第几折:'+str(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]#训练集x_train_data=np.concatenate([train_data[:i*num_val_samples],train_data[(i+1)*num_val_samples:]],axis=0)y_train_targers=np.concatenate([train_targets[:i*num_val_samples],train_targets[(i+1)*num_val_samples:]],axis=0)model=build_model()#verbose=0代表训练时用的是静默模式history=model.fit(x=x_train_data,y=y_train_targers,validation_data=(val_data,val_targets),epochs=num_epochs,batch_size=1,verbose=1)#保存验证的平均绝对误差val_mae_history=history.history['val_mae']all_val_mae_histories.append(val_mae_history)

从交叉样本得到的验证平均绝对误差图像中,主要为了得到模型最适合的训练次数。
在这里插入图片描述
从上图中判断出epochs的次数在80时,得到的模型效果最好,因此最终训练的模型我们以80次作为训练总批次得到最终模型。

model=build_model()model.fit(x=train_data,y=train_targets,epochs=80,batch_size=16)

最终训练得到模型文件,在测试数据上的平均绝对误差为:2.876593589782715,这表示预测的房价与真实的房价相差2876美元。
得到的模型结构图为:
在这里插入图片描述

2 回归问题模型的调用

调用代码如下:

import numpy as np
from sympy import re 
from tensorflow.keras.datasets import boston_housing
from tensorflow.keras import models
from tensorflow.keras import layersif __name__=='__main__':#准备训练数据#(404, 13) (404,)   (102, 13) (102,)#每个样本中有13个数值特征,比如人均犯罪率、每个住宅的平均房间数等#目标是房屋价格的中位数,单位是千美元(train_data,train_targets),(test_data,test_targets)=boston_housing.load_data()#将数据标准化#减去特征平均值,再除以标准差,得到特征平均值为0,标准差为1mean=train_data.mean(axis=0)train_data-=meanstd=train_data.std(axis=0)train_data/=std#测试数据必须以训练数据的均值和标准差进行变换,这样两者的变换才一致test_data-=meantest_data/=std#载入模型model=models.load_model('./model/house.h5')model.summary()#预测测试数据中的第22个数据print('这一年的真实房价为:'+str(test_targets[22])+'(千美元)')result=model.predict(test_data[22].reshape(1,-1))print('这一年的预测房价为:'+str(result[0][0])+'(千美元)')

预测结果如下:
这一年的真实房价为:20.0(千美元)
这一年的预测房价为:21.134518(千美元)

可见,预测的价格与真实价格仅仅相差1千美元,这个回归模型效果还是可以的。


http://chatgpt.dhexx.cn/article/brKXF4V3.shtml

相关文章

『迷你教程』绝对能看懂的分类问题和回归问题白话版

文章目录 内容介绍函数近似分类预测建模回归预测建模分类与回归在分类和回归问题之间转换 内容介绍 老生常谈的话题分类问题和回归问题之间有一个重要的区别。从根本上说,分类是关于预测标签,回归是关于预测数量。 我经常看到这样的问题: 如…

各类回归问题总结

回归问题的条件/前提: 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数。然后利用这个模型去预测/分类新的数据。 1. 线性回归 假设 特征 和 结果…

回归问题的评价指标和重要知识点总结

回归分析为许多机器学习算法提供了坚实的基础。在这篇文章中,我们将总结 10 个重要的回归问题和5个重要的回归问题的评价指标。 1、线性回归的假设是什么? 线性回归有四个假设 线性:自变量(x)和因变量(y…

深度学习3:回归问题

首先不要将回归问题和logistic回归算法混为一谈,logistic回归不是回归算法,而是分类算法。 之前的分类问题的目标是预测输入数据点所对应的单一离散的标签,而这节要预测一个连续的而不是离散的标签,比如根据气象数据预测明天的气温…

回归问题评价指标

目录 平均绝对值误差(MAE) 均方误差(MSE) 均方根误差(RMSE) 平均绝对百分比误差(MAPE) 均方误差对数(MSLE) 中位绝对误差(MedAE) R Squared 总结 回归模型: 个样本,每个样本…

stacking集成模型预测回归问题

前言 关于各种集成模型,已经有很多文章做了详细的原理介绍。本文不再赘述stacking的原理,直接通过一个案例,使用stacking集成模型预测回归问题。 本文通过学习一篇stacking继承学习预测分类问题,对其代码进行了调整,以…

逻辑回归问题汇总

文章目录 1. Logistic回归与线性回归的区别与联系?2. Logistic回归有哪些基本假设?3. Logistic回归的损失函数?4. Logistic回归损失函数的求解方法?5. Logistic回归是如何进行分类的?6. Logistic回归为什么要用极大似然函数作为损失函数?7. 为什么在…

回归问题归一化总结

在用深度学习做回归问题时,对数据进行标准化处理是一个共识,将数据标准化,利用标准化后得数据进行数据分析。不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响…

分类和回归问题

前言 最近在复习一些深度学习和机器学习的基础知识,看到分类和回归,这里记录一下。 一、回归 首先,回归应用的场景是用来输出一系列连续的值,然后用于预测等任务。回归的目的是为了找到最优拟合的曲线,这个曲线可以…

回归问题一般解决方法

1. 回归问题 Given a labeled training set learn a general mapping which associates previously unseen independent test data with their correct continuous prediction. 回归问题和分类问题很相似,区别在于回归问题的输出是一个连续值。 上图是训练数据 和 对应的连续值…

对线性回归、逻辑回归、各种回归的概念学习

回归问题的条件/前提: 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数。然后利用这个模型去预测/分类新的数据。 1. 线性回归 假设 特征 和 结果 都满足线性。即不大于一次方。这个是针对 收集的数据而言。 收集的数据中…

回归问题

回归 回归(regression) 是监督学习的另一个重要问题。 回归用于预测输入变量(自变量) 和输出变量(因变量) 之间的关系, 特别是当输入变量的值发生变化时, 输出变量的值随之发生的…

回归问题原理

回归问题是一种常见的监督机器学习任务,在很多领域均有广泛应用。其典型应用包括销量预测、库存预测、股票价格预测、天气预测等。本问将讨论线性回归,包括线性回归模型的目标函数(损失函数和正则函数)、线性回归模型的优化求解、…

机器学习之回归问题

目录 前言 一、回归定义 二、回归建模步骤 1.模型假设-线性模型(Linear Model) (1)一元线性模型 (2)多元线性模型 2.模型评估-损失函数(Loss Funtion) 3.最佳模型-梯度下降&…

mac idea jrebel 激活

jrebel 官网提供注册,然后会给你一个注册码 首先 idea 安装 jrebel . 在安装完成之后,点击以下按钮 一开始 跟我的不一样,我的是注册完成之后,才会显示Change license 的这个提示, 之前好像是 Activate now 提示,点击即可 当注册完成之后,关闭弹出框 选择上图中的值,去官网注…

安装jrebel并激活

1.File-Settings-Plugins搜索jrebel,找到JRebel for IntelliJ ,点击install(我这里已经安装过了,所以显示的是更新) 2.重启idea 3.激活步骤,下载工具 ①下载激活工具 连接:https://pan.baidu.com/s/1Fh2v2zrAO2u50ZnS9LHBOQ 提取码…

JRebel激活步骤

JRebel简介: JRebel是与应用程序服务器集成的JVM Java代理,可使用现有的类加载器重新加载类。只有更改的类会重新编译并立即重新加载到正在运行的应用程序中,JRebel特别不依赖任何IDE或开发工具(除编译器外)。但是&…

关于JRebel 激活

具体JRebel安装教程参考: https://blog.csdn.net/lmdsoft/article/details/93769089 本文提供JRebel激活 Demo JRebel address was: 【http://jrebel.qekang.com:80/48dc7f8c-019f-4cb8-85d7-99b0134b69d0】, with any email.

JRebel插件激活

JRebel,一款好用的 Spring 热部署插件。 1. 安装 注意:截至到目前为止,作者只找到了 2022.4.1 的激活方式,更高版本皆未激活成功。 1.1. IDEA 中直接安装 在插件市场中直接搜索:JRebel and XRebel 注意,这…

2019.9最新JRebel激活方式

原文链接 最近JRebel离线方式到期, idea报无法激活JRebel了, 找了很多以前的方式都无法生效, ip或域名都已经失效了, 好在找到了大神有效的激活方式,以下是激活步骤: 1. 下载反向代理软件 下载地址: https://github.com/ilanyu/ReverseProxy/releases根据自己的操作系统下载…