DEBUG.WIKI
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
雨云;给项目一台云服务器
RackNerd;$21.99/年 · 1GB KVM

BayesianRidge 的不确定性在原点最小,预测方差漏了训练均值

BayesianRidge 预测方差漏减训练特征均值时会使用错误坐标,应更新修复版本并保持训练与预测的中心化一致。

训练特征集中在 80 到 100,BayesianRidge.predict(return_std=True) 却给原点附近更小的标准差。均值预测看起来合理时,这个差异容易被误认为模型自身的统计选择;scikit-learn 1.8.0 的一项故障确实会让预测方差使用错误的坐标。

默认 fit_intercept=True 的训练过程会将特征减去训练均值,再估计系数协方差 sigma_。旧预测路径计算标准差时却直接使用原始测试特征。均值预测已经考虑截距,标准差部分没有对应中心化,所以两部分使用了不同坐标。

用远离零的训练区间检查

下面的例子只检查这一坐标问题,目标带少量固定随机噪声,不需要绘图或下载数据:

import numpy as np
import sklearn
from sklearn.linear_model import BayesianRidge

X = np.linspace(80., 100., 4).reshape(-1, 1)
y = X[:, 0] + 10 * np.random.RandomState(0).standard_normal(4)
model = BayesianRidge(fit_intercept=True).fit(X, y)
mean, std = model.predict(np.array([[0.], [90.]]), return_std=True)
print(sklearn.__version__, mean, std)
assert std[1] < std[0]

scikit-learn 1.9.0 已在计算这部分预测方差前减去训练时的 X_offset_。修复同时覆盖 ARDRegression 的对应路径;后者还会按保留的特征选择协方差,所以不要从 BayesianRidge 的内部公式复制一段代码当作两者通用补丁。

暂时固定一个显式中心化流程

无法更新时,可以从训练集计算偏移,训练与预测都使用相同变换。保留一次操作的两个输出,避免拿原始输入的均值与另一次中心化输入的均值混用:

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import BayesianRidge

pipeline = make_pipeline(
    StandardScaler(with_std=False),
    BayesianRidge(fit_intercept=True),
)
pipeline.fit(X, y)
mean, std = pipeline.predict(np.array([[0.], [90.]]), return_std=True)
assert std[1] < std[0]

with_std=False 仅做中心化,不额外缩放特征。偏移由训练阶段拟合,不能给每一批测试数据各自减均值,否则同一个输入会随测试批次得到不同结果。交叉验证中也应让变换在每个训练折内拟合,避免用全量数据提前算均值。

验收既要比较标准差,也要确认原始坐标上的均值预测仍保持预期。已将特征中心化的流程可能不容易暴露该故障;选择一个明显远离零的训练区间,才有区分能力。

这项检查针对训练与预测坐标不一致,不证明模型的区间已充分校准,也不保证所有数据都在训练样本中心具有最小不确定性。多维相关特征、外推和模型假设仍需自己的统计评估;修复版本解决的是实现中的漏减偏移。