You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

留一法交叉验证预测逻辑及自定义相对误差实现咨询

关于LOOCV预测逻辑的说明

LOOCV只是一种数据集切分的模型评估策略,不会修改你传入模型的原有逻辑,你这段代码里的预测全程使用标准线性回归:

  • 每一轮迭代仅留出1个样本作为测试集,剩余所有样本作为训练集
  • 用训练集的n-1个样本拟合你定义的LinearRegression多元线性模型,即通过最小化训练集残差平方和计算回归系数
  • 用拟合完成的线性模型对那1个留出样本计算预测值
    没有任何特殊预测规则,如果你传入其他模型(比如随机森林、逻辑回归),LOOCV会自动对应使用该模型的原生训练、预测逻辑。

自定义平方相对误差计算方法

你需要的sum( ((真实值-预测值)/真实值)^2 )指标没有内置在sklearn默认评分参数中,最稳妥的实现方式是手动遍历LOOCV的切分索引逐轮计算,不需要绕自定义scorer的符号规则,直接替换原代码里交叉验证计算部分即可:

from sklearn.model_selection import LeaveOneOut
from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np

df = pd.DataFrame({'y': [6, 8, 12, 14, 14, 15, 17, 22, 24, 23],
                   'x1': [2, 5, 4, 3, 4, 6, 7, 5, 8, 9],
                   'x2': [14, 12, 12, 13, 7, 8, 7, 4, 6, 5]})

X = df[['x1', 'x2']]
y = df['y']

cv = LeaveOneOut()
model = LinearRegression()

total_squared_relerr = 0
for train_idx, test_idx in cv.split(X):
    # 拆分当前轮次的训练、测试集
    X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
    y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
    # 在训练集上拟合模型
    model.fit(X_train, y_train)
    # 对留出样本做预测
    y_pred = model.predict(X_test)
    # 累加当前样本的平方相对误差
    single_err = (y_test.values[0] - y_pred[0]) / y_test.values[0]
    total_squared_relerr += single_err ** 2

# 输出平方相对误差总和
print(total_squared_relerr)

如果需要计算平均平方相对误差,直接用total_squared_relerr / len(y)即可。

注意:如果你的真实值列y存在取值为0的样本,需要提前做数值平滑或者过滤,否则会触发除以0的运行错误。


内容的提问来源于stack exchange,提问作者Ryan Hendricks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:39:19