单点预测过时了?MAPIE:区间预测算法,实际场景中更合理。

Posted Python学习与数据挖掘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单点预测过时了?MAPIE:区间预测算法,实际场景中更合理。相关的知识,希望对你有一定的参考价值。

当我们使用当前流行的机器学习库,例如XGB,LGB等为数值目标变量构建预测模型时,通常会预测一个点值,而实际中,该值往往是错的。

例如我们对某个地区的房子价格进行预测的时候,模型的预测结果往往是一个固定的值,还会带有小数,这个预测往往是错误的,此时一个更为合理的区间,例如有95%+的信心是在80万-85万之间,则听起来更为合理。我们称后者为区间预测,那如何进行区间预测呢?

就是本文介绍的MAPIE,它是一个用于获取间隔预测的 Python 库。该名称代表“Model Agnostic Prediction Interval Estimator”,其中重要部分是“Model Agnostic”。事实上,与分位数回归或贝叶斯推理等更传统的方法相反,MAPIE允许我们保留最喜欢的、高度精确的模型。

【注】文末提供技术交流群

推荐文章

下面我们就介绍MAPIE的基础原理细节,更多内容可以参考引文。

MAPIE原理

MAPIE背后的想法是从模型对一组称为校准数据的数据所产生的错误中学习。一旦我们知道了我们应该期望的误差(对于给定的公差),就可以在点预测的两侧添加误差,以获得区间预测。

MAPIE算法由6个步骤组成:

  1. 使用训练数据拟合模型;

  2. 对校准数据进行预测;

  3. 计算模型对校准数据产生的绝对误差;

  4. 从上一点获得的绝对误差分布中获得1-α分位数;

  5. 对测试数据进行预测;

  6. 通过将在第4点获得的分位数减去(添加)在第5点获得的预测,计算区间的左(右)端。

# 1. Fit model on training data
model = RandomForestRegressor().fit(X_train, y_train)
# 2. Make prediction on calibration data
y_cal_pred = model.predict(X_cal)
# 3. Compute absolute errors made by the model on calibration data
y_cal_error = np.abs(y_cal - y_cal_pred)
# 4. Get 1-alpha quantile from the distribution of absolute errors
#    Note: this is a single number
quantile = y_cal_error.quantile(q=.95, interpolation='higher')
# 5. Make prediction on test data
y_test_pred = model.predict(X_test)
# 6. Compute left (right) end of the interval by
#    subtracting (adding) the quantile to the predictions
y_test_interval_pred_left = y_test_pred - quantile
y_test_interval_pred_right = y_test_pred + quantile

代码

  • 代码摘自:https://medium.com/towards-data-science/mapie-explained-exactly-how-you-wished-someone-explained-to-you-78fb8ce81ff3

import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestRegressor
# !pip install mapie
from mapie.regression import MapieRegressor 

# Get California housing dataset, and split it in 3 sets
X, y = fetch_california_housing(return_X_y=True, as_frame=True)
X_train_and_cal, X_test, y_train_and_cal, y_test =train_test_split(X, y, test_size=1/3)
X_train, X_cal, y_train, y_cal = train_test_split(X_train_and_cal, y_train_and_cal, test_size=1/2)

model = RandomForestRegressor().fit(X_train, y_train) 
mapie = MapieRegressor(estimator=model, cv="prefit").fit(X_cal, y_cal)

# Get interval predictions on test data, with alpha=5%
y_test_pred_interval = pd.DataFrame(mapie.predict(X_test, alpha=.05)[1].reshape(-1,2), index=X_test.index, columns=["left", "right"])
y_test_pred_interval.head()

  • 上面Alpha是容忍度。它回答了这个问题:“我们愿意接受多少‘错误’?”,我们调整Alpha的大小,
out_of_interval = ((y_test < y_test_pred_interval["left"]) | (y_test > y_test_pred_interval["right"])).sum() / len(y_test)

小结

区间预测的问题都可以使用MAPIE,但是MAPIE也有较大的问题:

  1. 对于某些预测更难的问题,MAPIE的预测间隔宽度会较大,也就是说,预测越不确定,间隔越大。

  2. MAPIE基础模型为了获得时间间隔,我们在预测中加入并减去了校准误差的分位数。因为分位数是一个数字,因此所有观测的间隔宽度都是相同的;(使用method=“plus”或method=“minmax”,输出间隔的确切宽度将不同。但这只是一种“扰动”,最终的间隔不会有实质性的不同。)

参考文献

  1. https://github.com/scikit-learn-contrib/MAPIE

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

以上是关于单点预测过时了?MAPIE:区间预测算法,实际场景中更合理。的主要内容,如果未能解决你的问题,请参考以下文章

R语言混合时间模型预测对时间序列进行点估计

如何理解逻辑回归?原理应用场景癌症分类预测

来了来了!趋势预测算法大PK!

老白聊数据-关于销售预测的那些事

高斯过程预测置信区间奇数

B.特定领域知识图谱知识推理方案[一]:基于表示学习的知识感知推理算法[对抗负采样Logic Rule,链接预测任务]在关系预测推荐场景下应用