机器学习的预测间隔

        【翻译自 : Prediction Intervals for Machine Learning

       【说明:Jason Brownlee PhD大神的文章个人很喜欢,所以闲暇时间里会做一点翻译和学习实践的工作,这里是相应工作的实践记录,希望能帮到有需要的人!】

        从机器学习的角度来看,预测只是掩盖了该预测的不确定性的单点。

        预测间隔提供了一种量化和传达预测中不确定性的方法。它们不同于置信区间,而置信区间试图量化总体参数(例如平均值或标准偏差)中的不确定性。预测间隔描述了单个特定结果的不确定性。

         在本教程中,您将发现预测间隔以及如何为简单的线性回归模型计算预测间隔。完成本教程后,您将知道:

预测间隔量化了单点预测的不确定性。
对于简单的模型,可以预测地估计预测间隔,但对于非线性机器学习模型则更具挑战性。
如何为简单的线性回归模型计算预测间隔。

教程概述

         本教程分为5个部分。 他们是:

点估计有什么问题?
什么是预测间隔?
如何计算预测间隔
线性回归的预测间隔
工作实例

为什么要计算预测间隔?

        在预测建模中,给定某些输入变量,预测或预测是单个结果值。例如:

	
yhat = model.predict(X)

         其中yhat是训练模型针对给定输入数据X做出的估计结果或预测。这是一个点预测。根据定义,它是一个估计值或一个近似值,并且包含一些不确定性。不确定性来自模型本身的误差和输入数据中的噪声。该模型是输入变量和输出变量之间关系的近似值。给定用于选择和调整模型的过程,这将是给定可用信息的最佳近似值,但仍会出错。来自域的数据自然会掩盖输入变量和输出变量之间潜在的未知关系。这将给拟合模型带来挑战,也将给拟合模型做出预测带来挑战。

       给定这两个主要的误差源,它们从预测模型进行的点预测不足以描述预测的真实不确定性。

什么是预测间隔?

        预测间隔是对预测不确定性的量化。它为结果变量的估计提供了概率上限和下限。

        预测间隔是在预测数量的回归模型中进行预测或预测时最常使用的时间间隔。预测间隔表示的示例如下:

                                                                                      给定“ y”和“ x”的预测,则从“ a”到“ b”的范围覆盖真实结果的可能性为95%。

        预测间隔围绕模型所做的预测,并希望覆盖真实结果的范围。下图有助于直观地了解预测,预测间隔和实际结果之间的关系。

        预测间隔与置信区间不同。置信区间量化了估计的总体变量(例如均值或标准差)的不确定性。 而预测间隔量化了从总体估计的单个观测值上的不确定性。在预测建模中,置信区间可用于量化模型估计技能的不确定性,而预测区间可用于量化单个预测的不确定性。预测间隔通常大于置信区间,因为它必须考虑置信区间和要预测的输出变量的方差。

如何计算预测间隔

       将预测间隔计算为模型的估计方差和结果变量的方差的某种组合。预测间隔很容易描述,但实际上很难计算。

       在线性回归等简单情况下,我们可以直接估算预测间隔。在非线性回归算法(例如人工神经网络)的情况下,它更具挑战性,需要选择和实施专门的技术。可以使用常规技术,例如自举重采样方法,但是计算起来很昂贵。

        论文“基于神经网络的预测间隔和新进展的全面综述”提供了在神经网络环境下对非线性模型的预测间隔进行的合理研究。以下列表总结了可用于非线性机器学习模型的预测不确定性的一些方法:

Delta方法,来自非线性回归领域。
贝叶斯方法,来自贝叶斯建模和统计。
均值方差估计方法,使用估计的统计量。
Bootstrap方法,使用数据重采样并开发模型集合。

        在下一节中,我们将通过一个工作示例来具体计算预测间隔。

线性回归的预测间隔

       线性回归是描述输入的线性组合以计算输出变量的模型。例如,估计的线性回归模型可以写为:

yhat = b0 + b1 . x

        其中yhat是预测,b0和b1是从训练数据估计的模型系数,x是输入变量。

        我们不知道系数b0和b1的真实值。 我们还不知道真实的总体参数,例如x或y的均值和标准差。 所有这些元素都必须进行估算,这会给模型的使用带来不确定性,以便进行预测。

        我们可以做一些假设,例如x和y的分布以及模型造成的预测误差(称为残差)是高斯的。

        yhat周围的预测间隔可以计算如下:

yhat +/- z * sigma

        其中yhat是预测值,z是距高斯分布的标准偏差的数量(例如,在95%区间为1.96),而sigma是预测分布的标准偏差。

        在实践中我们并不为人所知。 我们可以如下计算预测标准偏差的无偏估计(摘自机器学习方法,用于估计模型输出的预测间隔):

stdev = sqrt(1 / (N - 2) * e(i)^2 for i to N)

         其中stdev是预测分布的标准偏差的无偏估计,n是进行的总预测,而e(i)是第i个预测与实际值之间的差。

工作实例

         让我们以一个实际的例子来说明线性回归预测区间的情况。首先,我们定义一个简单的二变量数据集,其中输出变量(y)取决于输入变量(x)并带有一些高斯噪声。下面的示例定义了我们将用于此示例的数据集。

# generate related variables
from numpy import mean
from numpy import std
from numpy.random import randn
from numpy.random import seed
from matplotlib import pyplot
# seed random number generator
seed(1)
# prepare data
x = 20 * randn(1000) + 100
y = x + (10 * randn(1000) + 50)
# summarize
print('x: mean=%.3f stdv=%.3f' % (mean(x), std(x)))
print('y: mean=%.3f stdv=%.3f' % (mean(y), std(y)))
# plot
pyplot.scatter(x, y)
pyplot.show()

        首先运行示例,将打印两个变量的平均值和标准偏差。

x: mean=100.776 stdv=19.620
y: mean=151.050 stdv=22.358

         然后创建数据集图。我们可以看到变量之间清晰的线性关系,点的分布突出了关系中的噪声或随机误差。

        接下来,我们可以开发一个简单的线性回归,该线性回归在给定输入变量x的情况下将预测y变量。 我们可以使用linregress()SciPy函数拟合模型,并返回模型的b0和b1系数。

# fit linear regression model
b1, b0, r_value, p_value, std_err = linregress(x, y)

        我们可以使用系数来计算每个输入变量的y预测值。 结果点将形成代表学习关系的线。

# make prediction
yhat = b0 + b1 * x

       完整实例如下:

# simple linear regression model
from numpy.random import randn
from numpy.random import seed
from scipy.stats import linregress
from matplotlib import pyplot
# seed random number generator
seed(1)
# prepare data
x = 20 * randn(1000) + 100
y = x + (10 * randn(1000) + 50)
# fit linear regression model
b1, b0, r_value, p_value, std_err = linregress(x, y)
print('b0=%.3f, b1=%.3f' % (b1, b0))
# make prediction
yhat = b0 + b1 * x
# plot data and predictions
pyplot.scatter(x, y)
pyplot.plot(x, yhat, color='r')
pyplot.show()

        运行示例可拟合模型并打印系数

b0=1.011, b1=49.117

        然后,将系数与来自数据集的输入一起使用以进行预测。 所得的输入和预测的y值在数据集散点图的顶部以一条线绘制。

        我们可以清楚地看到,该模型已经了解了数据集中的基础关系。

       现在,我们准备使用简单的线性回归模型进行预测并添加预测间隔。我们将像以前一样拟合模型。 这次,我们将从数据集中抽取一个样本来演示预测间隔。 我们将使用输入进行预测,计算预测的预测间隔,并将预测和间隔与已知期望值进行比较。首先,让我们定义输入,预测和期望值。

x_in = x[0]
y_out = y[0]
yhat_out = yhat[0]

       接下来,我们可以估计预测方向上的标准偏差。

SE = sqrt(1 / (N - 2) * e(i)^2 for i to N)

       我们可以使用NumPy数组直接计算此值,如下所示:

# estimate stdev of yhat
sum_errs = arraysum((y - yhat)**2)
stdev = sqrt(1/(len(y)-2) * sum_errs)

       接下来,我们可以计算所选输入的预测间隔:

interval = z . stdev

         我们将使用95%的显着性水平,即1.96标准偏差。一旦计算出间隔,我们就可以向用户总结预测的范围。

# calculate prediction interval
interval = 1.96 * stdev
lower, upper = yhat_out - interval, yhat_out + interval

        我们可以将所有这些结合在一起。 下面列出了完整的示例。

# linear regression prediction with prediction interval
from numpy.random import randn
from numpy.random import seed
from numpy import power
from numpy import sqrt
from numpy import mean
from numpy import std
from numpy import sum as arraysum
from scipy.stats import linregress
from matplotlib import pyplot
# seed random number generator
seed(1)
# prepare data
x = 20 * randn(1000) + 100
y = x + (10 * randn(1000) + 50)
# fit linear regression model
b1, b0, r_value, p_value, std_err = linregress(x, y)
# make predictions
yhat = b0 + b1 * x
# define new input, expected value and prediction
x_in = x[0]
y_out = y[0]
yhat_out = yhat[0]
# estimate stdev of yhat
sum_errs = arraysum((y - yhat)**2)
stdev = sqrt(1/(len(y)-2) * sum_errs)
# calculate prediction interval
interval = 1.96 * stdev
print('Prediction Interval: %.3f' % interval)
lower, upper = yhat_out - interval, yhat_out + interval
print('95%% likelihood that the true value is between %.3f and %.3f' % (lower, upper))
print('True value: %.3f' % y_out)
# plot dataset and prediction with interval
pyplot.scatter(x, y)
pyplot.plot(x, yhat, color='red')
pyplot.errorbar(x_in, yhat_out, yerr=interval, color='black', fmt='o')
pyplot.show()

          运行示例将估算yhat标准偏差,然后计算预测间隔。一旦计算出,就将给定输入变量的预测间隔呈现给用户。 因为我们设计了这个示例,所以我们知道了真实的结果,并且也将其显示出来。 我们可以看到,在这种情况下,95%的预测间隔确实覆盖了真实的期望值。

Prediction Interval: 20.204
95% likelihood that the true value is between 160.750 and 201.159
True value: 183.124

        还创建了一个图,将原始数据集显示为散点图,将数据集的预测显示为红线,将预测和预测间隔显示为黑点和线。

扩展名

        本节列出了一些扩展您可能希望探索的教程的想法。总结公差,置信度和预测间隔之间的差异。为标准机器学习数据集开发线性回归模型,并为小型测试集计算预测间隔。详细描述一种非线性预测间隔方法的工作方式。如果您探索这些扩展中的任何一个,我很想知道。

进一步阅读

       如果您想更深入,本节提供了有关该主题的更多资源。

Posts

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值