机器学习回归任务:寻求通用且模型无关的预测区间构建策略
嘿,针对你的两个问题,我来给你梳理一下实际项目里常用的解决方案,尤其是适配你这种小样本嵌套CV场景的策略:
1. 有没有通用且独立于模型的预测区间计算方法?
肯定有呀!这类方法完全不绑定特定模型的假设(比如线性回归里的正态残差要求),靠重采样或者非参数逻辑就能搞定,几乎所有监督回归模型——包括集成模型(随机森林、XGBoost这类都算)——都能用。给你列几个最靠谱的:
Bootstrap 预测区间:
这是通用方案里的主力军。思路很简单:多次从训练集里有放回抽样本,每次抽完都训练模型并对目标样本做预测,最后把这些预测值的分位数(比如2.5%和97.5%)当成区间的上下界。这里推荐用成对Bootstrap(保留输入和输出的对应关系),比残差Bootstrap更通用,不用假设残差独立。分位数回归思路:
你可以把它当成一种通用策略,而非特定模型——训练两个模型,一个专门预测目标变量的α/2分位数,另一个预测(1-α/2)分位数,这俩结果就构成了置信水平1-α的预测区间。不管你用的是树模型、神经网络还是集成模型,都能这么玩,只需要把损失函数换成分位数损失就行。保形预测(Conformal Prediction):
这几年特别火的非参数方法,核心是用校准集估计预测的“误差范围”,能严格保证在设定的置信水平下,真实值落在区间里的概率不低于这个水平。最棒的是它完全不挑模型,啥类型的监督模型都能适配,对小样本也友好,非常符合你要“通用”的需求。
2. 针对你嵌套LOOCV场景的具体实施策略
你现在是70个样本,嵌套LOOCV(内外层都是留一法),要给外层每个预测做区间,还要适配所有监督技术。这里给你量身定制的步骤,都是考虑到小样本的局限性的:
外层LOOCV循环(每个样本当测试样本)
每次把某个样本$x_{test}$拎出来当测试集,剩下69个当外层训练集:
- 先按你原来的流程,用内层LOOCV完成模型调优,得到最优模型。
- 然后用下面的方法给$x_{test}$生成预测区间:
方案1:Bootstrap+内层LOOCV残差校准
因为样本量小,直接Bootstrap可能方差偏大,结合内层LOOCV的残差来校准更高效:
- 用调优后的模型在外层训练集的69个样本上,拿到内层LOOCV每个样本的预测值$\hat{y}_i$,计算残差$r_i = y_i - \hat{y}_i$。
- 对这些残差做1000次有放回重采样,每次重采样后给$\hat{y}_{test}$加上这组残差,得到1000个预测值。
- 取这些预测值的2.5%和97.5%分位数,就是95%置信水平的预测区间。
方案2:保形预测适配嵌套LOOCV
保形预测对小样本特别友好,还不用额外拆分数据:
- 直接用内层LOOCV里每个折叠的预测残差作为非一致性得分(比如$s_i = |y_i - \hat{y}_i|$)。
- 对$x_{test}$做预测得到$\hat{y}{test}$,然后找到这些得分的$(1-\alpha) \times 100%$分位数$q$,那么预测区间就是$[\hat{y}{test} - q, \hat{y}_{test} + q]$。
- 这种方法不用再拆分外层训练集,最大化利用了有限的70个样本数据。
方案3:分位数回归模型
- 用外层训练集训练两个调优后的模型:一个以2.5%分位数为目标,另一个以97.5%分位数为目标(调优过程和你原来的内层LOOCV一致,只是把损失换成分位数损失)。
- 对$x_{test}$分别用这两个模型预测,得到的结果就是95%的预测区间。这种方法不用做重采样,直接通过建模得到区间,效率很高。
额外小贴士
- 如果你用的是集成模型(比如随机森林),还可以试试用袋外(OOB)样本的预测值生成区间:每个测试样本的OOB预测值集合的分位数就是区间,这是集成模型自带的通用方法,能和上面的方法结合着用,结果更稳定。
- 小样本场景下,尽量不要做太多的数据拆分,保形预测用内层LOOCV残差校准的方式,能最大化利用数据,避免模型过拟合。
内容的提问来源于stack exchange,提问作者Massimiliano Grassi

