深度学习-回归问题
时间:2022-07-25
本文章向大家介绍深度学习-回归问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
深度学习-回归问题
概述
- 数据:波士顿房价数据集(类似的数据集在R中也存在)
- 已知当时郊区的一些数据点,比如犯罪率、当地房产税率等
- 包含404个训练样本,102个测试样本
- 目标:预测房价中位数
代码
from tensorflow.keras.datasets.boston_housing import load_data
from keras.datasets import boston_housing
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
Using TensorFlow backend.
# 查看数据
train_data.shape
# 包含404个样本13个特征
(404, 13)
# 数据标准化
# 将数据处理为均数为0,标准差为1的数据,也就是正态化
mean = train_data.mean(axis=0)#按照列取均值
train_data -= mean#相当于train_data=train_data-mean
std = train_data.std(axis=0)#按照列取标准差
train_data /= std#除以标准差
test_data -= mean
test_data /= std
# 构建网络
# 模型定义
from keras import models
from keras import layers
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#返回模型参数
#k折验证
import numpy as np#导入numpy包
k = 4# 四折
num_val_samples = len(train_data) // k
num_epochs = 100
all_scores = []#用于保存结果
for i in range(k):# 循环实现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]
# 准备训练集
#concatenate函数为拼接函数,目的是拼接出去验证集的所有数据
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)#追加验证结果
# 验证的val_mae取均值
np.mean(all_scores)
processing fold # 0
processing fold # 1
processing fold # 2
processing fold # 3
2.4407541155815125
结果显示平均房价差2.553,相当于2553美元
# 对模型参数进行调整
num_epochs = 500# 这次迭代次数选择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]
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()
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)# 每次运算追加结果
processing fold # 0
processing fold # 1
processing fold # 2
processing fold # 3
# 计算每个轮次中所有折MAE的平均值
# 这里是列表循环式,相当于循环,对MAE群均值
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()
# 可以看出随着迭代的次数的增加,MAE是减小的
# 为了找到最佳的迭代点,我们将上述的图进行调整放大
#寻找最小值
# 这个函数为了平滑曲线
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
# 从上图看出前10个点范围太大,这里去掉前10个
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()
从上图看出迭代次数选择45会好点
# 重新建模
model = build_model()
# 试了45 不如50好,可能每次随机不一样吧,不知道怎么设置种子
model.fit(train_data, train_targets,
epochs=50, batch_size=16, verbose=0)
test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)
test_mae_score
# 最终在测试集上,与实际价格差2826元
102/102 [==============================] - 0s 122us/step
2.837068557739258
结束语
三次的深度学习基本涵盖了神经网络的基础内容 蛇咬着自己的尾巴,结束也是开始,后续继续深入
peace&love
- 【深度学习】谷歌deepdream原理及tensorflow实现
- 【深度学习】写诗机器人tensorflow实现
- PyTorch还是TensorFlow?这有一份新手指南
- Leetcode 300. Longest Increasing Subsequence
- Leetcode 299. Bulls and Cows
- Leetcode 297. Serialize and Deserialize Binary Tree
- Leetcode 295. Find Median from Data Stream
- 投入大见效慢,还要做AI?
- Leetcode 292. Nim Game
- Leetcode 290. Word Pattern
- 【深度学习】使用tensorflow实现VGG19网络
- Leetcode 289. Game of Life
- Leetcode 287. Find the Duplicate Number
- Leetcode 284. Peeking Iterator
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 聊聊java中的哪些Map:(二)HashMap中的TreeNode
- 用innodb_ruby分析InnoDB的页管理
- react获取运行环境是开发还是生产环境。
- 函数节流与函数防抖
- antd3.x中的form
- 使用RAP2模拟假数据实现前后端分离
- Redis 事件驱动分析
- JDK1.8 新特性 (八):还在重复写空指针检查代码?
- 使用Angular HTTP client对数据模型进行update操作
- Nodejs中OS模块
- 使用Angular HTTP client对数据模型进行创建操作
- 使用Angular HTTP client对数据模型进行删除操作
- Angular开发文档中一些常用的词汇
- Angular应用里child Component如何向parent Component发送事件
- 如何在SAP WebClient UI里使用jChartFX