Python中如何使用Scikit-learn 1.0中的MAPIE进行预测区间估计?

雨婷小哥_5441

雨婷小哥_5441

2026-07-04

328人浏览

原创

mapie是独立于scikit-learn的模型无关预测区间估计库,不能直接用sklearn原生模型生成预测区间,因其仅输出点估计;mapie通过包装兼容sklearn接口的模型(如randomforestregressor),结合jackknife+、cv+、分位数回归等保形预测策略,为其补全不确定性量化能力,需单独安装pip install mapie。

python中如何使用scikit-learn 1.0中的mapie进行预测区间估计?

MAPIE是什么,为什么不能直接用sklearn自带的模型

MAPIE(Model Agnostic Prediction Intervals with Ensembles)不是scikit-learn原生模块,而是独立包,从scikit-learn 1.0起才被广泛适配——但它本身不随sklearn安装。直接调用sklearn里的LinearRegression或RandomForestRegressor得不到预测区间,因为这些模型只输出点估计。

MAPIE的作用是“套在已有模型外面”,通过分位数回归、分位数残差重采样或jackknife+等策略,为任意兼容sklearn接口的回归器补上不确定性量化能力。

常见错误现象:ModuleNotFoundError: No module named 'mapie';或者误以为sklearn.model_selection.cross_val_predict能返回区间——它不能。

  • 必须显式安装:pip install mapie(注意不是scikit-learn子模块)
  • MAPIE 0.7+ 才完全支持sklearn 1.0+ 的set_params和get_params规范,旧版可能报AttributeError: 'XXX' object has no attribute 'n_features_in_'
  • 它不修改底层模型,只是包装器,所以训练耗时≈原模型×2~3倍(取决于method和n_bootstraps)

用MapieRegressor套住一个RandomForestRegressor并计算95%区间

这是最常用场景:已有成熟回归模型,想快速加上预测区间。关键在于选对method参数,不同方法对数据分布假设不同,直接影响区间宽度和覆盖率。

示例中用method="quantile"(分位数回归森林),它对异方差数据更鲁棒,比"base"(普通残差重采样)更推荐:

from mapie.regression import MapieRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
<p>X, y = make_regression(n_samples=1000, n_features=10, noise=10, random_state=42)
model = RandomForestRegressor(random_state=42)
mapie = MapieRegressor(
estimator=model,
method="quantile",
alpha=0.05,  # 对应95%置信水平
cv=5,        # 使用5折交叉验证生成校准集
random_state=42
)
mapie.fit(X, y)
y_pred, y_pis = mapie.predict(X, return_intervals=True)</p><h1>y_pis.shape == (n_samples, 2),分别是下界和上界</h1><p></p>
  • alpha=0.05 表示单侧误差率,对应整体覆盖概率≈95%,不是“每个点都95%落在区间内”的强保证,而是渐近频率意义下的平均覆盖率
  • cv="split"可换成LeaveOneOut(),但小样本下慢且不稳定;默认cv=5已足够
  • 如果y_pis出现nan或上下界倒置,大概率是method="base"遇到训练集残差为0的极端情况,换"quantile"或"enbpi"即可

如何验证预测区间的实际覆盖率是否达标

MAPIE不保证理论覆盖率严格等于1-alpha,尤其在小样本或分布偏斜时。必须做后验校验,否则区间只是“看起来像95%”,实际可能是80%或110%。

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载

核心是用未参与拟合的测试集(不是fit时的交叉验证折),计算真实标签落在预测区间内的比例:

from sklearn.model_selection import train_test_split
<p>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
mapie.fit(X_train, y_train)
y_pred_test, y_pis_test = mapie.predict(X_test, return_intervals=True)</p><p>covered = ((y_test >= y_pis_test[:, 0]) & (y_test </p>
  • 若coverage ,说明区间太窄,可尝试增大<code>alpha(如0.1)、换method="enbpi"(更保守)、或增加n_bootstrap(默认100)
  • 若coverage > 0.98,区间过宽,浪费信息,可减小alpha或改用method="plus"(更紧凑)
  • 不要在训练集上算覆盖率——那会严重高估,因模型已见过这些点

多输出回归(y是二维数组)时怎么处理

MAPIE默认只支持单输出(y.shape = (n_samples,))。若目标变量是多个(比如同时预测温度和湿度),不能直接传入y形状为(n_samples, 2)的数组,否则报错ValueError: y must be 1-dimensional。

正确做法是:对每个输出维度单独建模,用MultiOutputRegressor包装MapieRegressor——但注意,MapieRegressor本身不支持MultiOutputRegressor作为estimator,得反着来:

  • 先用MultiOutputRegressor套住基础模型(如RandomForestRegressor)
  • 再把整个MultiOutputRegressor作为estimator传给MapieRegressor
  • 此时method只能选"base"或"plus","quantile"不支持多输出

代码片段:

from sklearn.multioutput import MultiOutputRegressor
<p>multi_model = MultiOutputRegressor(RandomForestRegressor(random_state=42))
mapie_multi = MapieRegressor(
estimator=multi_model,
method="plus",  # 注意这里不能用"quantile"
alpha=0.05,
cv=3
)
mapie_multi.fit(X, y_2d)  # y_2d.shape == (n_samples, 2)
y_pred_multi, y_pis_multi = mapie_multi.predict(X, return_intervals=True)</p><h1>y_pis_multi.shape == (n_samples, 2, 2) → [样本, 输出维, 区间端点]</h1><p></p>

多输出场景下,每个维度的覆盖率需分别验证,且区间宽度往往差异很大——湿度预测区间可能比温度宽3倍,这是正常现象,别强行统一缩放。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1771

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4584

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1729

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

27017

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3267

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3287

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2543

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习