留一法交叉验证预测逻辑及自定义相对误差实现咨询
关于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
相关产品推荐
相关产品推荐

