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

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

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

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

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

推荐文章

  • 有人把吴恩达老师的机器学习和深度学习做成了中文版

  • 上瘾了,最近又给公司撸了一个可视化大屏(附源码)

  • 如此优雅,4款 Python 自动数据分析神器真香啊

  • 梳理半月有余,精心准备了17张知识思维导图,这次要讲清统计学

  • 年终汇总:20份可视化大屏模板,直接套用真香(文末附源码)

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

下面我们就介绍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()

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

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

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

小结

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

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

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

参考文献

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

技术交流

欢迎转载、收藏、有所收获点赞支持一下!
在这里插入图片描述

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

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

长按关注

你可能感兴趣的:(python,算法,机器学习,人工智能,python)