预测间隔为回归问题的预测提供了不确定性度量。
例如,95%的预测间隔表示100次中的95次,真实值将落在该范围的下限值和上限值之间。这不同于可能表示不确定性区间中心的简单点预测。没有用于计算深度学习神经网络关于回归预测建模问题的预测间隔的标准技术。但是,可以使用一组模型来估计快速且肮脏的预测间隔,这些模型又提供了点预测的分布,可以从中计算间隔。
在本教程中,您将发现如何计算深度学习神经网络的预测间隔。完成本教程后,您将知道:
-
预测间隔为回归预测建模问题提供了不确定性度量。
-
如何在标准回归问题上开发和评估简单的多层感知器神经网络。
-
如何使用神经网络模型集成来计算和报告预测间隔。
教程概述
本教程分为三个部分:他们是:
-
预测间隔
-
回归神经网络
-
神经网络预测间隔
预测间隔
通常,用于回归问题的预测模型(即预测数值)进行点预测。这意味着他们可以预测单个值,但不能提供任何有关该预测的不确定性的指示。根据定义,预测是估计值或近似值,并且包含一些不确定性。不确定性来自模型本身的误差和输入数据中的噪声。该模型是输入变量和输出变量之间关系的近似值。预测间隔是对预测不确定性的量化。它为结果变量的估计提供了概率上限和下限。
预测间隔是在预测数量的回归模型中进行预测或预测时最常使用的时间间隔。预测间隔围绕模型所做的预测,并希望覆盖真实结果的范围。有关一般的预测间隔的更多信息,请参见教程:
《机器学习的预测间隔》:
https://machinelearningmastery.com/prediction-intervals-for-machine-learning/
既然我们熟悉了预测间隔,那么我们可以考虑如何计算神经网络的间隔。首先定义一个回归问题和一个神经网络模型来解决这个问题。
回归神经网络
在本节中,我们将定义回归预测建模问题和神经网络模型来解决该问题。首先,让我们介绍一个标准回归数据集。我们将使用住房数据集。住房数据集是一个标准的机器学习数据集,包括506行数据,其中包含13个数字输入变量和一个数字目标变量。
使用具有三个重复的重复分层10倍交叉验证的测试工具,一个朴素的模型可以实现约6.6的平均绝对误差(MAE)。在大约1.9的相同测试工具上,性能最高的模型可以实现MAE。这为该数据集提供了预期性能的界限。该数据集包括根据美国波士顿市房屋郊区的详细信息来预测房价。
房屋数据集(housing.csv):
https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv
房屋描述(房屋名称):
https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.names
无需下载数据集;作为我们工作示例的一部分,我们将自动下载它。
下面的示例将数据集下载并加载为Pandas DataFrame,并概述了数据集的形状和数据的前五行。
# load and summarize the housing dataset
from pandas import read_csv
from matplotlib import pyplot
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'
dataframe = read_csv(url, header=None)
# summarize shape
print(dataframe.shape)
# summarize first few lines
print(dataframe.head())
运行示例将确认506行数据和13个输入变量以及一个数字目标变量(总共14个)。我们还可以看到所有输入变量都是数字。
(506, 14)
0 1 2 3 4 5 ... 8 9 10 11 12 13
0 0.00632 18.0 2.31 0 0.538 6.575 ... 1 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0 0.469 6.421 ... 2 242.0 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0 0.469 7.185 ... 2 242.0 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0 0.458 6.998 ... 3 222.0 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0 0.458 7.147 ... 3 222.0 18.7 396.90 5.33 36.2
[5 rows x 14 columns]
接下来,我们可以准备用于建模的数据集。首先,可以将数据集拆分为输入和输出列,然后可以将行拆分为训练和测试数据集。在这种情况下,我们将使用约67%的行来训练模型,而其余33%的行用于估计模型的性能。
# split into input and output values
X, y = values[:,:-1], values[:,-1]
# split into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.67)
您可以在本教程中了解有关训练测试拆分的更多信息:训练测试拆分以评估机器学习算法然后,我们将所有输入列(变量)缩放到0-1范围,称为数据归一化,这在使用神经网络模型时是一个好习惯。
# scale input data
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = scaler.transfo