Keras 是一个深度学习库,它封装了高效的数学运算库 Theano 和 TensorFlow。
在这篇文章中,你将会了解到如何使用 Keras 开发和评估神经网络模型来解决回归问题。
在完成这个循序渐进的教程后,你将知道:
- 如何加载 CSV 数据集并将其作为 Keras 库算法的输入。
- 如何使用 Keras 建立一个回归问题的神经网络模型。
- 如何使用 Keras 和 scikit-learn 交叉验证来评估模型。
- 如何进行数据处理,以提高 Keras 模型的性能。
- 如何调整 Keras 模型的网络拓扑结构。
现在就让我们开始吧。
- 2017 年 3 月 更新:基于 Keras 2.0.2,TensorFlow 1.0.1 和 Theano 0.9.0 版本的示例
1.问题描述
我们在本教程中要解决问题基于波士顿房价数据集。
你可以通过这个链接下载这个数据集,并将其保存到当前工作目录,命名为 housing.csv。
该数据集描述了波士顿郊区房屋的13个数字量化属性,并以每十万美元的平方数为单位模拟郊区房屋的价格。因此,这是一个回归预测建模问题。输入属性包括犯罪率,非零售商业面积,化学污染浓度等等。
这是机器学习研究中一个很好的问题。因为所有的输入和输出属性都是量化的,并且有多达506个实例可以使用,所以这个问题研究起来很方便。
使用均方误差(MSE)评估的模型的合理性能约为20平方每十万美元(也就是每平方米4500美元)。这个数字对于我们的神经网络来说是一个很好的训练目标。
2.开发基准神经网络模型
在本节中,我们将为回归问题创建一个基准神经网络模型。
首先介绍本教程所需的所有函数和对象(所需的Python库)。
import numpy import pandas from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline
在引入所需的库后,我们现在可以从本地目录中的文件加载我们的数据集。
UCI机器学习库中的数据集实际上不是 CSV 格式,而是用空格分隔两个属性。我们可以使用pandas库轻松加载这个数据集。然后,分离输入(X)和输出(Y)属性,以便更容易使用 Keras 和 scikit-learn 进行建模。
# load dataset dataframe = pandas.read_csv("housing.csv", delim_whitespace=True, header=None) dataset = dataframe.values # split into input (X) and output (Y) variables X = dataset[:,0:13] Y = dataset[:,13]
我们可以使用 scikit-learn 来创建,并通过其易用的包装对象来评估 Keras模型。这样的方式是很理想的,因为 scikit-learn 擅长评估模型,并允许我们通过寥寥数行代码,就能使用强大的数据预处理和模型评估方案。
Keras 包装函数需要一个函数作为参数。这个必须被定义的函数负责创建要评估的神经网络模型。
下面我们来定义创建待评估的基准模型的函数。这是一个简单的模型,只有一个完全连接的隐藏层,具有与输入属性相同数量的神经元(13个)。网络使用隐藏层 relu 激活函数。没有激活函数用于输出层,因为这是一个回归问题,我们希望直接预测数值,而不需要采用激活函数进行变换。
我们会使用高效的 ADAM 优化算法以及优化的最小均方误差损失函数。这将是我们用来评估多个模型性能时的统一度量。这是一个可取的指标,因为通过平方根计算输出一个错误值,我们可以直接在问题的背景下(十万美元为单位)理解。
# define base model def baseline_model(): # create model model =