Skip to main content

保形回归器和预测系统(可丽饼)

项目描述

crepes: 保形回归器和预测系统

crepes是一个用于生成保形回归量的 Python 包,它将任何基础回归模型的点预测转换为指定置信水平的预测区间。该软件包还实现了保形预测系统,将点预测转换为累积分布函数。

crepes软件包实现了标准、标准化和蒙德里安保形回归器和预测系统。虽然该软件包允许您使用自己的难度估计和蒙德里安类别,但还有一个单独的模块,称为crepes.fillings,它为这些提供了一些标准选项。

安装

安装:pip install crepes

快速开始

保形回归器

我们首先导入主类和两个辅助函数:

from crepes import ConformalRegressor
from crepes.fillings import sigma_knn, binning

我们将使用来自www.openml.org的数据集和RandomForestRegressor来自sklearn

from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor

dataset = fetch_openml(name="house_sales", version=3)
X = dataset.data.values.astype(float)
y = dataset.target.values.astype(float)

我们现在首先将数据集拆分为训练集和测试集,然后将训练集进一步拆分为适当的训练集和校准集。最后,我们将随机森林拟合到正确的训练集,并将其应用于测试集的点预测(这里没有什么新鲜事)。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)
X_prop_train, X_cal, y_prop_train, y_cal = train_test_split(X_train, y_train,
                                                            test_size=0.25)

learner = RandomForestRegressor() 
learner.fit(X_prop_train, y_prop_train)
y_hat_test = learner.predict(X_test)

现在,我们将使用校准集。我们还将模型应用于校准对象并计算残差。

y_hat_cal = learner.predict(X_cal)
residuals_cal = y_cal - y_hat_cal

后者正是我们拟合标准保形回归器所需的:

cr_std = ConformalRegressor()
cr_std.fit(residuals=residuals_cal)

我们现在可以应用保形回归器来获得测试对象的预测区间,使用点预测作为输入,其中在区间中不包括正确目标的概率是 1-confidence:

std_intervals = cr_std.predict(y_hat=y_hat_test, confidence=0.99)

输出是一个 NumPy 数组,指定每个区间的下限和上限:

array([[-353379.  ,  939231.  ],
       [-251874.3 , 1040735.7 ],
       [-138329.5 , 1154280.5 ],
       ...,
       [-389128.68,  903481.32],
       [-313003.  ,  979607.  ],
       [ -90551.53, 1202058.47]])

我们可能会要求对区间进行切割以排除不可能的值,在本例中低于 0,如果我们还依赖默认置信水平 (0.95),则输出区间会更紧一点:

intervals_std = cr_std.predict(y_hat=y_hat_test, y_min=0)
array([[  7576.18, 578275.82],
       [109080.88, 679780.52],
       [222625.68, 793325.32],
       ...,
       [     0.  , 542526.14],
       [ 47952.18, 618651.82],
       [270403.65, 841103.29]])

上述区间没有标准化,即它们都是相同的大小(至少在它们被切割之前)。我们可以通过使用难度估计的归一化来使间隔更具信息性;更困难的实例将被分配更宽的间隔。

sigma_knn为此,我们将在这里使用辅助函数。k=5它通过校准集中每个实例的 k 个(默认)最近邻的平均绝对误差来估计难度。估计值中添加了一个小值(beta),可以通过函数的(命名)参数给出;下面我们只使用默认值,即beta=0.01.

sigmas_cal = sigma_knn(X=X_cal, residuals=residuals_cal)

现在可以使用校准示例的难度估计和残差来形成归一化的保形回归器:

cr_norm = ConformalRegressor()
cr_norm.fit(residuals=residuals_cal, sigmas=sigmas_cal)

为了使用归一化保形回归器生成测试集的预测区间,我们还需要测试集的难度估计,我们使用校准对象和残差来获得。

sigmas_test = sigma_knn(X=X_cal, residuals=residuals_cal, X_test=X_test)

现在我们可以使用测试集的点预测和难度估计来获得预测区间:

intervals_norm = cr_norm.predict(y_hat=y_hat_test, sigmas=sigmas_test, 
                                 y_min=0)
array([[     0.        , 645527.3140099 ],
       [100552.5573358 , 688308.8426642 ],
       [206605.7263972 , 809345.2736028 ],
       ...,
       [ 55388.60029434, 458964.03970566],
       [252094.62400964, 414509.37599036],
       [305546.225071  , 805960.714929  ]])

根据所采用的难度估计器,归一化间隔有时可能会大得不合理,从某种意义上说,它们可能比任何先前观察到的误差大几倍。此外,如果难度估计的信息量不是很大,例如,完全随机,则不同的间隔大小可能会给人一种错误的印象,即我们可以预期对于具有更紧密间隔的实例具有更低的预测误差。理想情况下,提供很少或不提供有关预期误差的信息的难度估计器应该导致更均匀分布的间隔大小。

蒙德里安保形回归器可用于解决这些问题,方法是将对象空间划分为不重叠的所谓蒙德里安类别,并为每个类别形成(标准)保形回归器。对象的类别成员资格可以作为方法的附加参数提供,bins名为fit

在这里,我们将使用辅助函数binning通过难度估计的等大小分箱来形成蒙德里安类别;该函数将返回校准对象的标签以及箱的阈值,稍后将在对测试对象进行分箱时使用:

bins_cal, bin_thresholds = binning(values=sigmas_cal, bins=20)

蒙德里安保形回归量是从残差和蒙德里安类别标签中获得的:

cr_mond = ConformalRegressor()
cr_mond.fit(residuals=residuals_cal, bins=bins_cal)

为了在测试对象上使用蒙德里安保形回归器,我们需要为这些对象获取蒙德里安类别的标签:

bins_test = binning(values=sigmas_test, bins=bin_thresholds)

现在我们拥有了获取预测区间所需的一切:

intervals_mond = cr_mond.predict(y_hat=y_hat_test, bins=bins_test, y_min=0)
array([[     0.  , 592782.5 ],
       [146648.15, 642213.25],
       [260192.95, 755758.05],
       ...,
       [ 38332.66, 476019.98],
       [198148.5 , 468455.5 ],
       [329931.17, 781575.77]])

适形预测系统

a 的接口ConformalPredictiveSystem与保形回归器的接口非常相似;通过仅提供残差,我们得到一个标准的保形预测系统,通过还提供难度估计,我们得到一个归一化的保形预测系统,通过为蒙德里安类别(箱)提供标签,我们得到一个蒙德里安保形预测系统。

保形回归量的主要区别在于输出;保形预测系统不是预测区间,而是产生完整的累积分布函数(保形预测分布)。从这些我们可以生成预测区间,但我们也可以获得校准点预测,以及给定目标值的 p 值。

让我们使用上述残差和难度估计(sigmas)拟合一个蒙德里安归一化保形预测系统,其中蒙德里安类别(箱)是使用校准集的点预测形成的:

from crepes import ConformalPredictiveSystem

bins_cal, bin_thresholds = binning(values=y_hat_cal, bins=5)

cps_mond_norm = ConformalPredictiveSystem().fit(residuals=residuals_cal,
                                                sigmas=sigmas_cal,
                                                bins=bins_cal)

我们已经有了测试对象的点预测和难度估计,所以我们只需要根据新的 bin 阈值的类别标签:

bins_test = binning(values=y_hat_test, bins=bin_thresholds)

我们现在可以从测试对象的共形预测分布中提取预测区间:

intervals = cps_mond_norm.predict(y_hat=y_hat_test,
                                  sigmas=sigmas_test,
                                  bins=bins_test,
                                  lower_percentiles=2.5,
                                  higher_percentiles=97.5,
                                  y_min=0)
array([[     0.        , 537757.93618585],
       [177348.62535049, 655015.98985999],
       [253618.31669927, 783707.98804461],
       ...,
       [ 73466.09003216, 397289.46238233],
       [273315.68901744, 405309.55870912],
       [274035.55188125, 789701.43635318]])

我们还可以获得真实目标值的 p 值;如果测试对象来自与校准示例相同的基础分布,则它们应该是均匀分布的。

p_values = cps_mond_norm.predict(y_hat=y_hat_test,
                                 sigmas=sigmas_test,
                                 bins=bins_test,
                                 y=y_test)
array([[0.3262945 ],
       [0.12184386],
       [0.82948135],
       ...,
       [0.75042278],
       [0.61815831],
       [0.70252814]])

return_cpds=True我们可以要求 predict 方法返回每个测试实例的完全共形预测分布 (CPD),如阈值所定义,通过设置 分布的格式因保形预测系统的类型而异;对于标准和归一化 CPS,输出是一个数组,其中每个测试实例有一行,每个校准实例(残差)有一个列,而对于 Mondrian CPS,默认输出是一个向量,每个测试实例包含一个 CPD,因为值的数量可能因类别而异。

cpds = cps_mond_norm.predict(y_hat=y_hat_test,
                             sigmas=sigmas_test,
                             bins=bins_test,
                             return_cpds=True)

此处未显示得到的数组向量,但我们提供了一个随机测试实例的 CPD 图:

cpd

例子

有关如何使用包和模块的其他示例,包括如何使用袋外预测,而不必依赖将训练集划分为适当的训练和校准集,请参阅此 Jupyter 笔记本

文档

有关crepes软件包的文档,请参见此处

有关crepes.fillings模块的文档,请参见此处

引用可丽饼

如果您crepes用于科学出版物,您可以引用以下论文:

Boström, H.,2022. crepes:用于生成保形回归器和预测系统的 Python 包。在保形和概率预测和应用中。第 179 页。

中文条目:

@InProceedings{crepes,
  title = 	 {crepes: a Python Package for Generating Conformal Regressors and Predictive Systems},
  author =       {Bostr\"om, Henrik},
  booktitle = 	 {Proceedings of the Eleventh Symposium on Conformal and Probabilistic Prediction and Applications},
  year = 	 {2022},
  editor = 	 {Johansson, Ulf and Boström, Henrik and An Nguyen, Khuong and Luo, Zhiyuan and Carlsson, Lars},
  volume = 	 {179},
  series = 	 {Proceedings of Machine Learning Research},
  publisher =    {PMLR}
}

参考

[1] Vovk, V.、Gammerman, A. 和 Shafer, G.,2005 年。随机世界中的算法学习。施普林格链接

[2] Papadopoulos, H.、Proedrou, K.、Vovk, V. 和 Gammerman, A.,2002 年。回归的归纳置信机。欧洲机器学习会议,第 345-356 页。关联

[3] Johansson, U.、Boström, H.、Löfström, T. 和 Linusson, H.,2014 年。随机森林的回归保形预测。机器学习,97(1-2),第 155-176 页。关联

[4] Boström, H.、Linusson, H.、Löfström, T. 和 Johansson, U.,2017 年。加速保形回归森林的难度估计。数学和人工智能年鉴,81(1-2),pp.125-144。关联

[5] Boström, H. 和 Johansson, U.,2020 年。蒙德里安保形回归器。在保形和概率预测和应用中。PMLR,128,第 114-133 页。关联

[6] Vovk, V.、Petej, I.、Nouretdinov, I.、Manokhin, V. 和 Gammerman, A.,2020 年。保形预测分布的计算高效版本。神经计算,397,第 292-308 页。关联

[7] Boström, H.、Johansson, U. 和 Löfström, T.,2021 年。蒙德里安保形预测分布。在保形和概率预测和应用中。PMLR,152,第 24-38 页。关联


作者:Henrik Boström ( bostromh@kth.se ) 版权所有 2022 Henrik Boström 许可证:BSD 3 条款

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

crepes-0.1.0.tar.gz (18.0 kB 查看哈希)

已上传 source

内置分布

crepes-0.1.0-py3-none-any.whl (13.8 kB 查看哈希)

已上传 py3