预测房价:回归问题

回归问题预测结果为连续值,而不是离散的类别。

波士顿房价数据集

通过20世纪70年代波士顿郊区房价数据集,预测平均房价;数据集的特征包括犯罪率、税率等信息。数据集只有506条记录,划分成404的训练集和102的测试集。每个记录的特征取值范围各不相同。比如,有01,112以及0~100的等等。

加载数据集

from keras.datasets import boston_housing

(train_data,train_targets),(test_data,test_targets) = boston_housing.load_data()

训练集形状:

>>> train_data.shape
(404, 13)

测试集形状:

>>> test_data.shape
(102, 13)

训练集404条,测试集102条;每条记录13个数值特征。

房价单位为1000美元。

>>> train_targets
[ 15.2, 42.3, 50. ...19.4,19.4,29.1]

房价范围在$10,000到$50,000。

准备数据

因为数据各个特征取值范围各不相同,不能直接送到神经网络模型中进行处理。尽管网络模型能适应数据的多样性,但是相应的学习过程变得非常困难。一种常见的数据处理方法是特征归一化normalization---减均值除以标准差;数据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

模型构建

由于数据集数据量过小,模型也不能太复杂,否则容易发生过拟合。

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

模型的最后一层只有一个神经元,没有激活函数--相当于一个线性层。这种处理方法常用在单标量回归问题中。使用激活函数将会限制输出结果的范围,比如使用sigmoid激活函数,输出结果在0~1之间。这里,因为最后一层只是一个线性层,模型的输出结果可能是任意值。

模型的损失函数为mse均方误差。监测的指标为mean absolute error(MAE)平均绝对误差---两个结果之间差的绝对值。

K折交叉验证

当调整模型参数时,为了评估模型,我们通常将数据集分成训练集和验证集。但是当数据量过小时,验证集数目也变得很小,导致验证集上的评估结果相互之间差异性很大---与训练集和测试集的划分结果相关。评估结果可信度不高。

最好的评估方式是采用K折交叉验证--将数据集分成K份(K=4或5),实例化K个模型,每个模型在K-1份数据上进行训练,在1份数据上进行评估,最后用K次评估分数的平均值做最后的评估结果。

import numpy as np

k = 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] # 划分出验证集部分
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()
model.fit(partial_train_data,partial_train_targets,epochs=num_epochs,batch_size=16,verbose=0)#模型训练silent模型
val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0) # 验证集上评估
all_scores.append(val_mae)

模型训练

model = build_model()
model.fit(train_data, train_targets,epochs=80, batch_size=16, verbose=0) test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)# score 2.5532484335057877

小结

  • 回归问题:损失函数通常为MSE均方误差;
  • 模型评估监测指标通常为MAE(mean absolute error);
  • 当数据取值范围不一致时,需要对特征进行预处理;
  • 数据量小时,可以采用K折验证来衡量模型;
  • 数据量小时,模型复杂度也应该相应的简单,可以避免模型过拟合。

[Deep-Learning-with-Python]基于Keras的房价预测的更多相关文章

  1. Deep learning with Python 学习笔记(10)

    生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...

  2. Deep learning with Python 学习笔记(9)

    神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...

  3. Deep learning with Python 学习笔记(8)

    Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...

  4. Deep learning with Python 学习笔记(6)

    本节介绍循环神经网络及其优化 循环神经网络(RNN,recurrent neural network)处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息. ...

  5. Deep learning with Python 学习笔记(3)

    本节介绍基于Keras的使用预训练模型方法 想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络.预训练网络(pretrained network)是一个保存好的网络,之前已在 ...

  6. Deep learning with Python 学习笔记(2)

    本节介绍基于Keras的CNN 卷积神经网络接收形状为 (image_height, image_width, image_channels)的输入张量(不包括批量维度),宽度和高度两个维度的尺寸通常 ...

  7. Deep learning with Python 学习笔记(1)

    深度学习基础 Python 的 Keras 库来学习手写数字分类,将手写数字的灰度图像(28 像素 ×28 像素)划分到 10 个类别 中(0~9) 神经网络的核心组件是层(layer),它是一种数据 ...

  8. [Udemy] Recommender Systems and Deep Learning in Python

    1. Welcome 主要讲四部分内容: non-personized systems popularity: 基于流行度或者最大利益化的推荐. 缺点也明显:你可能在特殊地方有些特殊需求, 或者你本来 ...

  9. Machine and Deep Learning with Python

    Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...

随机推荐

  1. Python实现屏幕截图的两种方式

    Python实现屏幕截图的两种方式 使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处 ...

  2. MySQL缓存机制详解(一)

    本文章拿来学习用||参考资料:http://www.2cto.com/database/201308/236361.html 对MySql查询缓存及SQL Server过程缓存的理解及总结   一.M ...

  3. SQLSERVER群集故障转移笔记

    SQLSERVER群集故障转移笔记 出自<SQLSERVER2012实施与管理实战指南> SQLSERVER故障转移 P41 事实上,从sqlserver2000到sqlserver200 ...

  4. 【转】Java学习---解析Java Servlet工作过程

    [原文]https://www.toutiao.com/i6594316694657696264/ 解析Java Servlet工作过程 Servlet简介 Servlet是sun公司提供的一门用于开 ...

  5. 用户不再sudoers文件中

    1.修改/etc/sudoers文件权限 # chmod 777 /etc/sudoers 2.编辑/etc/sudoers文件,添加要提升权限的用户: 在文件中找到root ALL=(ALL) AL ...

  6. 修改win下ras/pppoe/l2tp等连接数限制

    最近宽带重新拔号一直不换ip,拔了十几分钟IP仍然不变,想起几年前的pppoe多拔,多拔几个PPPOE占着老IP,再拔新的IP出来用 注册表路径,子项中查看MatchingDeviceId判断协议类型 ...

  7. October 17th 2017 Week 42nd Tuesday

    We execuse our sloth under the pretext of difficulty. 我们常以困难为由,作为懒惰的借口. The process of my system-tra ...

  8. JAVA-最常用的A题语法

    输出 System.out.println(""); if 语句 if(布尔表达式) { //如果布尔表达式为true将执行的语句 } if...else... 语句 if(布尔表 ...

  9. jQuery UI dialog插件出错信息:$(this).dialog is not a function

    使用jQuery UI 1.7.2 dialog插件,遇到这样的错误: [img]http://dl.iteye.com/upload/attachment/308166/97c428e4-2ce2- ...

  10. python第四十五课——继承性之多重继承

    演示多重继承的结构和使用 子类:Dog 直接父类:Animal 间接父类:Creature #生物类 class Creature: def __init__(self,age): print('我是 ...