《Python 深度学习》刷书笔记 Chapter 3 预测房价:回归问题
文章目录
- 波士顿房价数据集
- 3-24 加载波士顿房价数据
- 3-25 数据标准化
- 3-26 模型定义
- 3-27 K折验证
- 3-28 训练500轮,保存每折的验证结果
- 3-29 计算所有轮次茨种的K折验证分数平均值
- 3-30 绘制验证分数
- 3-31 重新绘制验证分数
- 3-32 绘制最终模型
- 写在最后
波士顿房价数据集
在Chapter3的前面两个例子中我们都是使用深度学习算法来解决分类问题,而另一种在机器学习领域经常遇到的是回归问题
- 回归问题: 预测一个连续值(用于预测功能居多)
- 分类问题: 将输入的预测数据点贴上一个单一的离散标签(例如:是、不是,是A类物品,是D类物品)
在本例中将要根据数据预测20实际70年代中期的波士顿郊区房屋价格的中位数,可能影响的因素有犯罪率、房产税率等等
数据特征
- 数据样本点较少,只有506个(404个训练样本、102个测试样本)
- 每个样本点有不同的取值范围(0~1(百分比,如0.87、0.21等)、1~12(等级))
3-24 加载波士顿房价数据
# 加载数据from keras.datasets import boston_housing(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()# 数据观察print(train_data.shape) # 对应影响房子价格的因素有13种
print(train_data[0])
print(test_data.shape)
print(train_targets) # 房子价格,单位:千美元
(404, 13)
[ 1.23247 0. 8.14 0. 0.538 6.142 91.73.9769 4. 307. 21. 396.9 18.72 ]
(102, 13)
[15.2 42.3 50. 21.1 17.7 18.5 11.3 15.6 15.6 14.4 12.1 17.9 23.1 19.915.7 8.8 50. 22.5 24.1 27.5 10.9 30.8 32.9 24. 18.5 13.3 22.9 34.716.6 17.5 22.3 16.1 14.9 23.1 34.9 25. 13.9 13.1 20.4 20. 15.2 24.722.2 16.7 12.7 15.6 18.4 21. 30.1 15.1 18.7 9.6 31.5 24.8 19.1 22.14.5 11. 32. 29.4 20.3 24.4 14.6 19.5 14.1 14.3 15.6 10.5 6.3 19.319.3 13.4 36.4 17.8 13.5 16.5 8.3 14.3 16. 13.4 28.6 43.5 20.2 22.23. 20.7 12.5 48.5 14.6 13.4 23.7 50. 21.7 39.8 38.7 22.2 34.9 22.531.1 28.7 46. 41.7 21. 26.6 15. 24.4 13.3 21.2 11.7 21.7 19.4 50.22.8 19.7 24.7 36.2 14.2 18.9 18.3 20.6 24.6 18.2 8.7 44. 10.4 13.221.2 37. 30.7 22.9 20. 19.3 31.7 32. 23.1 18.8 10.9 50. 19.6 5.14.4 19.8 13.8 19.6 23.9 24.5 25. 19.9 17.2 24.6 13.5 26.6 21.4 11.922.6 19.6 8.5 23.7 23.1 22.4 20.5 23.6 18.4 35.2 23.1 27.9 20.6 23.728. 13.6 27.1 23.6 20.6 18.2 21.7 17.1 8.4 25.3 13.8 22.2 18.4 20.731.6 30.5 20.3 8.8 19.2 19.4 23.1 23. 14.8 48.8 22.6 33.4 21.1 13.632.2 13.1 23.4 18.9 23.9 11.8 23.3 22.8 19.6 16.7 13.4 22.2 20.4 21.826.4 14.9 24.1 23.8 12.3 29.1 21. 19.5 23.3 23.8 17.8 11.5 21.7 19.925. 33.4 28.5 21.4 24.3 27.5 33.1 16.2 23.3 48.3 22.9 22.8 13.1 12.722.6 15. 15.3 10.5 24. 18.5 21.7 19.5 33.2 23.2 5. 19.1 12.7 22.310.2 13.9 16.3 17. 20.1 29.9 17.2 37.3 45.4 17.8 23.2 29. 22. 18.17.4 34.6 20.1 25. 15.6 24.8 28.2 21.2 21.4 23.8 31. 26.2 17.4 37.917.5 20. 8.3 23.9 8.4 13.8 7.2 11.7 17.1 21.6 50. 16.1 20.4 20.621.4 20.6 36.5 8.5 24.8 10.8 21.9 17.3 18.9 36.2 14.9 18.2 33.3 21.819.7 31.6 24.8 19.4 22.8 7.5 44.8 16.8 18.7 50. 50. 19.5 20.1 50.17.2 20.8 19.3 41.3 20.4 20.5 13.8 16.5 23.9 20.6 31.5 23.3 16.8 14.33.8 36.1 12.8 18.3 18.7 19.1 29. 30.1 50. 50. 22. 11.9 37.6 50.22.7 20.8 23.5 27.9 50. 19.3 23.9 22.6 15.2 21.7 19.2 43.8 20.3 33.219.9 22.5 32.7 22. 17.1 19. 15. 16.1 25.1 23.7 28.7 37.2 22.6 16.425. 29.8 22.1 17.4 18.1 30.3 17.5 24.7 12.6 26.5 28.7 13.3 10.4 24.423. 20. 17.8 7. 11.8 24.4 13.8 19.4 25.2 19.4 19.4 29.1]
3-25 数据标准化
将不同取值范围的数据直接塞进网络中的做法是有问题的,为此我们应对所有的输入数据进行标准化:减去样本平均值,再除以标准差(所得的数据特征平均值 = 0, 标准差 = 1)
X^ij=Xij−Xˉi∑j=1N(Xij−Xˉi)2\hat{X}_{i j}=\frac{X_{i j}-\bar{X}_{i}}{\sqrt{\sum_{j=1}^{N}\left(X_{i j}-\bar{X}_{i}\right)^{2}}} X^ij=∑j=1N(Xij−Xˉi)2Xij−Xˉi
# 数据标准化# 样本数据标准化
mean = train_data.mean(axis = 0) # 对数据按列求均值(即按指标求均值)
train_data -= mean
std = train_data.std(axis = 0) # 对数据按列求标准差(即按指标求标准差)
train_data /= std# 测试数据标准化
# 注意:这里对测试数据求得标准差都是除以训练数据的,
# 因为在实际测试中我们不能使用任何通过测试数据计算的结果
test_data -= mean
test_data /= std
3-26 模型定义
# 定义模型
from keras import models
from keras import layersdef 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))# 网络的最后一层只有一个单元,没有激活层# 目的是为了直接输出一个预测的数值,而不是一个0~1之间的概率model.compile(optimizer = 'rmsprop', loss = 'mse', metrics = ['mae']) # mse:均方误差(mean squared error)...# mae:平均绝对误差(mean absloute error):如MAE = 0.5 表示你的房价与实际的价格相差500美元return model
3-27 K折验证
由于训练的样本过小,如果单单将数据分为验证集和测试集,则会使得最终得分有较大的分差,我们使用K验证方法对样本进行验证
# K折验证
import numpy as npk = 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] # 准备验证集数据:第K个val_targets = train_targets[i * num_val_samples:(i + 1) * num_val_samples] # i从0开始# 将数据按行分段,进行K划分,详见书P69页图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() # 构建Keras模型# 训练模型 (静默模式 verbose = 0) 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)# 记录mae数据all_scores.append(val_mae)# 显示训练结果
print(all_scores)
print("各折最终训练分数:%f" % np.mean(all_scores))
processing fold # 0
processing fold # 1
processing fold # 2
processing fold # 3
[2.043470859527588, 2.728513479232788, 2.582028865814209, 2.374497175216675]
各折最终训练分数:2.432128
3-28 训练500轮,保存每折的验证结果
我们将训练的时间再拉长,并且将每一轮的结果都记录在一个向量中
# K折验证
import numpy as npk = 4
num_val_samples = len(train_data) // k
num_epochs = 100
all_scores = []# 训练500轮
num_epochs = 500
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] # 准备验证集数据:第K个val_targets = train_targets[i * num_val_samples:(i + 1) * num_val_samples] # i从0开始# 准备训练数据# 将数据按行分段,进行K划分,详见书P69页图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() # 构建Keras模型# 训练模型 (静默模式 verbose = 0) # 记录训练历史history = model.fit(partial_train_data, partial_train_targets,validation_data = (val_data, val_targets),epochs = num_epochs, batch_size = 1, verbose = 0)# mae# mae_history = history.history['val_mean_absolute_error']mae_history = history.history['val_mae'] # 作者本版本的键值已修改,仅供参考all_mae_histories.append(mae_history)
processing fold # 0
processing fold # 1
processing fold # 2
processing fold # 3
3-29 计算所有轮次茨种的K折验证分数平均值
average_mae_history = [np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)
]
3-30 绘制验证分数
# 绘图
import matplotlib.pyplot as pltplt.plot(range(1, len(average_mae_history) + 1), average_mae_history)
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
plt.show()
3-31 重新绘制验证分数
由于前10个数据点的缘故,使得纵轴的数据范围较大,所以难以看清楚该图的规律,为此,我们重新绘制一张数据图
def smooth_cruve(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_pointssmooth_mae_history = smooth_cruve(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()
3-32 绘制最终模型
model_f = build_model()
model_f.fit(train_data, train_targets, epochs = 80, batch_size = 16, verbose = 0)
test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)# 打印结果
print(test_mae_score)
102/102 [==============================] - 0s 29us/step
2.8328466415405273
写在最后
注:本文代码来自《Python 深度学习》,做成电子笔记的方式上传,仅供学习参考,作者均已运行成功,如有遗漏请练习本文作者
各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟!
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知
《Python 深度学习》刷书笔记 Chapter 3 预测房价:回归问题相关推荐
- Python深度学习一书中: 8.4代码VAE在tensorflow2.0错误‘lambda_1/random_normal/shape‘的解决方案
Python深度学习一书中: 8.4代码VAE在tensorflow2.0下会有Duplicate node name in graph: 'lambda_1/random_normal/shape' ...
- 《Python 深度学习》刷书笔记 Chapter 8 Part-1 生成式深度学习
文章目录 生成式深度学习 8-1 对于不同的softmax温度,对概率进行重新加权 实现字符级的LSTM文本生成 8-2 下载并解析初始文本文件 8-3 将字符序列向量化 8-4 用于预测下一个字符的 ...
- 《Python 深度学习》刷书笔记 Chapter 4 关于电影评论模型的进一步探讨
文章目录 电影评论模型的进一步改进 4-3 原始模型 4-4 容量更小的模型 4-5 容量更大的模型 4-6 向模型中添加L2权重正则化 写在最后 电影评论模型的进一步改进 我们将在这一节使用实验的方 ...
- 《Python 深度学习》刷书笔记 Chapter 5 Part-4 卷积神经网络的可视化(Fillter)
文章目录 可视化卷积神经网络 2-25 读入模组 5-26 观察图像 观察卷积层特征提取 5-27 建立多输出模型观察输出 5-28 显示图像 5-29 打印全部的识别图 5-32 为过滤器的可视化定 ...
- 《Python深度学习》读书笔记:第1章 什么是深度学习
目录 第1章 什么是深度学习 1.1 人工智能.机器学习与深度学习 1.1.1 人工智能 1.1.2 机器学习 1.1.3 从数据中学习表示 1.1.4 深度学习之"深度" 1.1 ...
- 《Python深度学习》读书笔记
第一章 1. 人工智能.机器学习.深度学习之间的关系 2. 人工智能:将通常由人类完成的智力任务自动化. 3. 机器学习 第二章 keras实现mnist识别 from keras.datasets ...
- Auto MPG 汽车油耗预测(tensorflow深度学习龙书笔记)
利用全连接网络模型来完成汽车的效能指标 MPG(Mile Per Gallon,每加仑燃油英里数)的预测问题实战 数据集 我们采用 Auto MPG 数据集,它记录了各种汽车效能指标与气缸数.重量.马 ...
- 《Python深度学习》第五章-5(可视化过滤器)读书笔记
5.4 卷积神经网络的可视化 卷积神经网络学到的表示非常适合可视化,很大程度上是因为它们是视觉概念的表示\color{red}视觉概念的表示视觉概念的表示.接下来介绍3种可视化方法. 事中\color ...
- 《Python深度学习》Chapter 2——神经网络的数学基础
<Deep Learning with Python >由Keras之父.现任Google人工智能研究员的弗朗索瓦•肖莱(François Chollet)执笔,详尽介绍了用Python和 ...
最新文章
- 避免35岁现象,我给技术人的建议永远是架构师!
- 李彦宏:人工智能会让这个世界变得更美好吗?YES AI DO!
- BASIS--如何删除开发用户的开发Key
- 在给定约束下可以使用a,b和c形成的字符串数
- mysql binlog 备份_MySQL的binlog知识梳理
- Curator操作ZooKeeper
- 无法搜索到电脑模拟热点的可以尝试一下(adhoc补丁)
- Linux系统使用GPT分区表方案推荐
- 宏基平板电脑_2020年推荐:蒲城二手笔记本电脑回收价格联想戴尔华硕上门回-老友网...
- Android-Studio 缓存文件夹配置
- 区块链技术之P2P网络(一)
- 【转】Oracle知识点汇总
- python pcm 静音_使用静音检测分割音频文件
- 在前端中清除IE浏览器缓存问题
- linux内核基本模型,Linux设备模型(1)_基本概念
- 计算机网络与应用初稿,计算机网络原理与应用(第2版)
- 移动web开发--移动端常见布局+流式布局和flex布局+携程网首页案例
- 极客大挑战2019php,[极客大挑战 2019]PHP
- 魔镜VR位置切换和自动漫游
- 齐鲁医药学院计算机考试,齐鲁医药学院2020年单独招生和综合评价招生考试时间及考试科目...
热门文章
- 实验一 stm32F407VETx点亮流水灯
- 【转】很有哲理的句子,每天都值得看一遍
- OA系统是把无所不能的“万能钥匙”?
- 红帽认证工程师(RHCE)的发展前景
- 一、量子信息基本概念
- 【数学建模】2022亚太赛A题 结晶器熔炼结晶过程序列图像特征提取与建模分析
- 【java算法】排序算法大合集
- 【RFC6405 IP 电话 (VoIP) SIP 对等互连用例 VoIP SIP Peering Use Cases】(翻译)
- Google Earth上划定矢量范围并导出为KMZ文件
- 洛谷日报索引(2020、2019、2018)