本文主要是使用keras对其有的波士顿房价数据集做一个回归预测,其代码架构与之前一样(都只是使用多层感知机):数据的预处理、搭建网络框架、编译、循环训练以及测试训练的网络模型。其中除了数据预处理与之前归回模型略有不同,其他基本类似。但是在本文的回归预测代码中会提到一个数据集比较少时常用到的训练方法——交叉验证。

回归预测房价,也就是说选定影响房价的因素,将其量化,然后使用该数据和对应的房价价格训练神经网络,最后使用因素的量化值来预测房价的走势。

Keras中的波士顿房价数据集,其中一共只有506个样本,其中只有404个用来做训练。其他是用来做测试。每个样本有13个特征,也就是有13个房价影响因素(13个因素中有些是具体的数值也有的是给定的权重值)。所以训练数据集是:[404,13]。

1.数据的预处理

首先使用keras导入所需要使用的包以及数据集

from keras.datasets import boston_housing
(train_data,train_targets),(test_data,test_targets)=boston_housing.load_data()

  然后对数据进行标准化处理,得到特征平均值为0,标准差为1的数据,这样更加有利于网络的处理及其收敛。

mean = train_data.mean(axis=0)
train_data -= mean
std = train_data.std(axis=0)
train_data/=std test_data-=mean
test_data/=std

 

  第一部分代码中的train_data.mean(axis=0)表示是求train_data中每一行的特征平均值,其std所求的也是每一行的标准差,也就是对每一组数据中的13个影响因素做标注化。(使用print(train_data.shape)可以得到训练数据的形状[404,13],上述代码中的axis=0就是指的404)

第二部分代码中,我们直接使用训练集上所得到的特征平均值和标准差来对测试集进行标准化,其原因是不能使得网络提前知道了测试集的数据。

2.搭建网络架构

model=models.Sequential()
model.add(layers.Dense(32,activation='relu',input_shape=(trian_data.shape[1],)))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(1))

  网络架构的搭建与之前文章一样,但是在最后不需要进行非线性的处理,因为改网络是需要做一个预测,所以直接输出网络得到的数值即可。

3.编译

model.compile(
optimizer='rmsprop',loss='mse',metrics=['mae'] )

  编译这里采用的损失函数是mae,也就是平均绝对误差,即取预测值和真实值之间误差的平方作为网络得到的误差进行返回训练。

4.循环网络

k=4
num=len(trian_data)//k
num_epochs=60
all_list=[]
for i in range(k):
print('proccesing #',i)
val_data=trian_data[i*num:(i+1)*num]
val_target=trian_target[i*num:(i+1)*num] par_data=np.concatenate(
[trian_data[:i*num],
trian_data[(i+1)*num:]],
axis=0
)
par_target=np.concatenate(
[trian_target[:i*num],
trian_target[(i+1)*num:]],
axis=0
)
his=model.fit(par_data,par_target,epochs=num_epochs,batch_size=1,validation_data=(val_data,val_target))
history=his.history['mae']
all_list.append(history)

  因为该数据集十分稀少(404个),所以为了提升网络的性能,这里使用交叉验证来加强网络性能。交叉验证,也就是把所以的训练数据分成n分,按顺序选取从其中一份做验证集,其余做测试集,直到n份数据都做过验证集为止。如下图所示:

  在代码中,用k表示一共分成的份数,然后进行,其中一共需要进行k次验证,每次进行验证时都会运行num_epochs次。最后把每一次的的mae值保存在all_list的列表中,方便后面的画图。

  在上述代码中,因为一个训练了k(k=4)轮,每轮60次(epochs=60),所以我们求60次的均值(一共四组数据,求均值,从4*60个数值得到60个数值),然后再使用得到的均值作图,代码如下:

ave_list=[np.mean([x[i] for x in all_list]) for i in range(num_epochs)]
plt.plot(range(1,len(ave_list)+1),ave_list)
plt.xlabel('epochs')
plt.ylabel('validation mae')
plt.show()

  第一行代码是分别对4组中的数据求60个epochs的均值;剩下的代码是做mae的验证值曲线,得到的曲线如图所示:

  mae越小,表示预测越准确;其余曲线,比如说是验证集的损失值曲线,只需替换 4.循环网络中的history:

#替换前
history=his.history['mae']
#替换后
history=his.history['val_mae']

  之后修改y轴名称即可,关于能画什么曲线,因为在model.fit中,我们使用了训练集和验证集,所以最后得到训练集的loss和mae以及验证集的loss和mae。

  5.所有代码

from keras.datasets import boston_housing
from keras import layers
from keras import models
import numpy as np
import matplotlib.pyplot as plt
(train_data,train_target),(tesr_data,test_target)=boston_housing.load_data()
print(train_data[1])
mean=np.mean(train_data)
train_data-=mean
str=np.std(train_data)
train_data/=str tesr_data-=mean
tesr_data/=str
print(train_data[1]) model=models.Sequential()
model.add(layers.Dense(32,activation='relu',input_shape=(train_data.shape[1],)))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(1))
model.compile(
optimizer='rmsprop',loss='mse',metrics=['mae'] ) k=4
num=len(train_data)//k
num_epochs=60
all_list=[]
for i in range(k):
print('proccesing #',i)
val_data=train_data[i*num:(i+1)*num] #从训练集中提取出验证的数据部分
val_target=train_target[i*num:(i+1)*num] #从训练集中提取出验证的标签部分(房价) par_data=np.concatenate( #把训练数据的其他部分粘合在一起
[train_data[:i*num],
train_data[(i+1)*num:]],
axis=0
)
par_target=np.concatenate( #把训练标签的其他部分粘合在一起
[train_target[:i*num],
train_target[(i+1)*num:]],
axis=0
)
his=model.fit(par_data,par_target,epochs=num_epochs,batch_size=1,validation_data=(val_data,val_target))
history=his.history['mae']
all_list.append(history) ave_list=[np.mean([x[i] for x in all_list]) for i in range(num_epochs)]
plt.plot(range(1,len(ave_list)+1),ave_list)
plt.xlabel('epochs')
plt.ylabel('train mae')
plt.show()

   目前为之所有用到的网络层次都是使用多层感知机,也就是神经网络算法,在后面的文章中会开始介绍卷积神经网络算法。

自我学习与理解:keras框架下的深度学习(三)回归问题的更多相关文章

  1. keras框架下的深度学习(一)手写体识别

    这个系列文章主要记录使用keras框架来搭建深度学习模型的学习过程,其中有一些自己的想法和体会,主要学习的书籍是:Deep Learning with Python,使用的IDE是pycharm. 在 ...

  2. keras框架下的深度学习(二)二分类和多分类问题

    本文第一部分是对数据处理中one-hot编码的讲解,第二部分是对二分类模型的代码讲解,其模型的建立以及训练过程与上篇文章一样:在最后我们将训练好的模型保存下来,再用自己的数据放入保存下来的模型中进行分 ...

  3. Keras框架下的保存模型和加载模型

    在Keras框架下训练深度学习模型时,一般思路是在训练环境下训练出模型,然后拿训练好的模型(即保存模型相应信息的文件)到生产环境下去部署.在训练过程中我们可能会遇到以下情况: 需要运行很长时间的程序在 ...

  4. win10下搭建深度学习--总结【学习笔记】

    win10 下搭建深度学习开发环境总结: 1.本人环境如下:win10,GTX1050TI.i7,anaconda3,vs2015,cuda9.0,cudnn7.1.4,tensorflow-gpu= ...

  5. ubuntu18.04下搭建深度学习环境anaconda2+ cuda9.0+cudnn7.0.5+tensorflow1.7【原创】【学习笔记】

    PC:ubuntu18.04.i5.七彩虹GTX1060显卡.固态硬盘.机械硬盘 作者:庄泽彬(欢迎转载,请注明作者) 说明:记录在ubuntu18.04环境下搭建深度学习的环境,之前安装了cuda9 ...

  6. Ubuntu18.04下配置深度学习开发环境

    在Ubuntu18.04下配置深度学习/机器学习开发环境 1.下载并安装Anaconda 下载地址:https://www.anaconda.com/distribution/#linux 安装步骤: ...

  7. 深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全

    深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全 原文地址:Image Completion with Deep Learning in TensorFlow by Bra ...

  8. 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF

    随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...

  9. 3.keras实现-->高级的深度学习最佳实践

    一.不用Sequential模型的解决方案:keras函数式API 1.多输入模型 简单的问答模型 输入:问题 + 文本片段 输出:回答(一个词) from keras.models import M ...

随机推荐

  1. mvc中常见的属性验证

    客户端验证逻辑会对用户向表单输入的数据给出一个即时反馈.而之所以需要服务器端验证,是因为来自网络的信息都是不能被信任的. 当在ASP.NET MVC设计模式上下文中谈论验证时,主要关注的是验证模型的值 ...

  2. CPU如何同时运行多个进程?

    1 # -*- coding: utf-8 -*- 2 import re 3 mem = [x for x in re.split('[\r|\n]', ''' 4 store a 1 5 add ...

  3. Celery进阶

    Celery进阶 在你的应用中使用Celery 我们的项目 proj/__init__.py   /celery.py   /tasks.py 1 # celery.py 2 from celery ...

  4. Flink(三)【核心编程】

    目录 一.Environment 二.Source 从集合读取数据 从文件读取数据 从kakfa读取数据(常用) 自定义数据源 三.Transform map Rich版本函数 flatMap key ...

  5. 【Linux】【Shell】【Basic】条件测试

    1. 数值测试:数值比较 -eq:是否等于: [ $num1 -eq $num2 ] -ne:是否不等于: -gt:是否大于: -ge:是否大于等于: -lt:是否小于: -le:是否小于等于: 2. ...

  6. MyEclipse配置Hibernate框架(基础篇)

    一.创建java project项目 二.项目右键Configure Facets -- Install Hibernate Facet 三.项目添加对应数据库的jar包 四.编写实体类 packag ...

  7. 【科研工具】MathType7.2的安装破解与使用

    亲测可用,可以嵌入word. [我们为什么要用MathType] tex不香嘛,但是学校给的模板只有word,word输入公式点起来实在是太麻烦了. 有了这个就可以直接输入公式转换啦. [安装破解教程 ...

  8. uni-app使用腾讯地图注意点

    地图map组件使用腾讯地图自定义样式: 1:在使用地图map组件腾讯地图时,获取本地定位,经纬度转地址与地址转经纬度解析时,小程序可以直接使用.但是h5版本会报跨域问题,目前前端没有找到更好的解决方法 ...

  9. 车载以太网第二弹|测试之实锤-1000BASE-T1 IOP测试实践

    背景 车载以太网通信技术在汽车行业的应用速度远超预期,去年本土OEM已经上市了应用100BASE -T1的车型.今年,应用1000BASE -T1的车型预计也将会量产上市.针对测试而言,带来另外一个难 ...

  10. Android App加固原理与技术历程

    App为什么会被破解入侵 随着黑客技术的普及化平民化,App,这个承载我们移动数字工作和生活的重要工具,不仅是黑客眼中的肥肉,也获得更多网友的关注.百度一下"App破解"就有529 ...