不确定度分析:我花了一年时间研究不确定性估算
不确定度分析:我花了一年时间研究不确定性估算然而我很快发现,我给自己挖了个深坑。几个月后:而且我发现,对于几乎任何图表,量化不确定性都很有用,所以我也开始尝试。 我的新年目标:我在2018年期间绘制的每一幅图表都要包含不确定性估算为什么立下这个flag?因为我在各种大会上听腻了人们争论每个月微件(widget)的数量是上升还是下降,或者微件方法X是否比微件方法Y更有效率。
大数据文摘出品
编译:李雷、Javen、Aileen
一个半路出家的程序员,一年来学习不确定性估算的经验。
让我从年初的一个flag说起:
我的新年目标:我在2018年期间绘制的每一幅图表都要包含不确定性估算
为什么立下这个flag?因为我在各种大会上听腻了人们争论每个月微件(widget)的数量是上升还是下降,或者微件方法X是否比微件方法Y更有效率。
而且我发现,对于几乎任何图表,量化不确定性都很有用,所以我也开始尝试。
然而我很快发现,我给自己挖了个深坑。几个月后:
现在已经是今年的第4个月,我要告诉你,估算不确定性的水还挺深。
我从未学过统计学,也没有通过机器学习来逆向了解过它。所以我算是半路出家,在慢慢自学统计知识。今年早些时候,我还只了解一些关于Bootstrapping算法(拔靴法)和置信区间的基本知识,但随着时间的推移,我学会了蒙特卡罗方法和逆Hessians矩阵(黑塞矩阵)等全套把戏。
这些方法很有用,我也想把这一年的经营教训分享给大家。
从数据开始
我相信没有具体例子是无法真正学到东西的,所以让我们先制造一些数据。我们将生成一个假的时间系列,其日期范围从2017-07-01至2018-07-31,比如说这个序列是一头大象重量的观测值。
def generate_time_series(k=200 m=1000 sigma=100 n=50 start_date=datetime.date(2017 7 1)): xs = numpy.linspace(0 1 n endpoint=False) ys = [k*x m random.gauss(0 sigma) for x in xs] ts = [start_date datetime.timedelta(x)*365 for x in xs] x_scale = numpy.linspace(-1 2 500) # for plotting t_scale = [start_date datetime.timedelta(x)*365 for x in x_scale] return xs ys ts x_scale t_scale xs ys ts x_scale t_scale = generate_time_series()
在开始之前,我们需要做图来看看发生了什么!
pyplot.scatter(ts ys alpha=0.5 s=100) pyplot.xlabel('Date') pyplot.ylabel('Weight of elephant (kg)')
首先,我们不用任何花哨的模型,我们只是将其分解为几个区间(bucket)并计算每个区间的平均值。不过,让我们先停下来谈谈不确定性。
数据分布与不确定性
之前我一直搞不清“不确定性”的意思,但我认为搞清楚这一点非常重要。我们可以为多种不同的数据估算分布:
1. 数据本身。给定一定的时间范围(t ,t '),在这个时间间隔内大象体重的分布是什么?
2.某些参数的不确定性。如参数k在线性关系y = k t m里,或者某些估算器的不确定性,就像许多观测值的平均值一样。
3.预测数值的不确定性。因此,如果我们预测日期为t(可能在未来)时大象的重量是y公斤,我们想知道数量y的不确定性。
让我们从最基本的模型开始 - 只需在区间中分解问题。如果我们只是想学习一些关于分布和不确定性估计的基本概念,那么我推荐Seaborn软件包。Seaborn通常在数据帧上运行,因此我们需要进行转换:
d = pandas.DataFrame({'x': xs 't': ts 'Weight (kg)': ys}) d['Month'] = d['t'].apply(lambda t: t.strftime('%Y-%m')) seaborn.boxplot(data=d x='Month' y='Weight (kg)')