LOOCV交叉验证题

这篇博客介绍了LOOCV(Leave-One-Out Cross-Validation)交叉验证方法,并通过R语言展示了如何应用于线性回归模型。文章通过生成数据、设定种子数,然后用LOOCV计算MSE,比较不同阶数多项式模型的性能,寻找最佳模型参数。

#p是多少个变量x,p=1;n是100,记录了n行数据
set.seed(1)
y=rnorm(100)
x=rnorm(100)
y=x-2x^2+rnorm(100)
plot(x,y)
##############
set.seed(1)
y=rnorm(100)
x=rnorm(100)
y=x-2
x^2+rnorm(100)

error=c() #因为循环里出现了error[i]
d=cbind(x,y) #c是竖着合并 r是横着合并
d=as.data.frame(d)
#前两步可合并为 d= data.frame(x,y)

for(i in 1:100)
{
m1=glm(y~x,data = d[-i,]) #去掉第i行的线性方程,此时一横行就是一个x+y了
pred_m1=predict(m1,newdata=d[i,])
error[i]=d[i,2]-pred_m1 #第i行第二列即y:真实值-预测值
}
sum(error^2)/dim(d)[1] #MSE LOOCV 1代表行,2代表列,即100

###################
library(boot)
ml=glm(y~x,data=d)
mlr=cv.glm(data=d,glmfit=ml,K=100) #k=n=100 #广义线性模型的交叉验证:估算K折交叉验证的预计误差
mlr$delta

ml2=glm(y~poly(x,2),data=d)
mlr2=cv.glm(data=d,glmfit=ml2,K=100)
mlr2$delta

ml3=glm(y~poly(x,3),data=d)
mlr3=cv.glm(data=d,glmfit=ml3,K=100)
mlr3$delta

ml4=glm(y~poly(x,4),data=d)
mlr4=cv.glm(data=d,glmfit=ml4,K=100

### 留一交叉验证 (LOOCV) 的概念 留一交叉验证(Leave-One-Out Cross-Validation, LOOCV)是一种特殊的交叉验证方法,在这种方法中,数据集中的每一个观测值依次被选作测试集,而剩下的所有其他观测值构成训练集。对于拥有 \( K \) 个样本的数据集来说,这意味着要进行 \( K \) 次独立的建模过程,每次留下不同的单一观测作为验证对象[^3]。 这种技术确保了几乎所有的数据都被用来训练模型,并且每个样本都有机会成为测试集的一部分,从而提供了对模型性能更为严格的评估。然而,由于其高度依赖于特定的数据分割方式以及可能产生的高方差估计,LOOCV 并不总是最优的选择,尤其是在处理大规模数据集时可能会非常耗时[^5]。 ### 使用方法 为了应用 LOOCV 方法来评价某个机器学习算法的表现,可以遵循如下流程: 1. 对于每一轮循环: - 将当前轮次外的一个观察点设为测试集; - 剩余的所有观察点组成新的训练集; 2. 利用新构建出来的训练集去拟合选定的学习器; 3. 应用已训练好的模型到之前预留的那个单独的测试样本来获得预测结果; 4. 记录这次预测的结果并继续下一回合直到遍历整个原始数据集合; 5. 统计所有这些单一样本上的表现情况以得出最终的整体评分标准,如均方根误差 (RMSE)[^4] 或者准确率等分类指标。 以下是 Python 中实现线性回归模型基于 LOOCV 进行评估的例子: ```python from sklearn.model_selection import LeaveOneOut, cross_val_score from sklearn.linear_model import LinearRegression import numpy as np #define predictor and response variables X = df[['x1', 'x2']] y = df['y'] #define cross-validation method to use cv = LeaveOneOut() #build multiple linear regression model model = LinearRegression() #use LOOCV to evaluate model using negative mean squared error scores = cross_val_score(model, X, y, scoring='neg_mean_squared_error', cv=cv) #calculate RMSE from the scores obtained through LOOCV rmse = np.sqrt(np.mean(np.abs(scores))) print(f'Root Mean Squared Error via LOOCV: {rmse}') ``` 这段代码展示了如何利用 `scikit-learn` 库来进行一次完整的 LOOCV 测试,并计算出相应的 RMSE 来衡量模型的好坏程度。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值