我们在建立数据模型后通常希望在外部数据验证模型的检验能力。然而当没有外部数据可以验证的时候,交叉验证也不失为一种方法。交叉验验证(交叉验证,CV)则是一种评估模型泛化能力的方法,广泛应用中于数证据采挖掘和机器学习领域,在交叉验证通常将数据集分为两部分,一部分为训练集,用于建立预测模型;另一部分为测试集,用于测试该模型的泛化能力。

在这里插入图片描述
k折交叉验证可以看成是留一交叉验证的简化版,是将原始数据据随机平均分为k个子集(通常5-10个),每个子集做测试集的同时,其余k-1个子集合并作为训练 ,进行 k 次训练,取各评价指标(灵敏度、特异度、AUC等)的平均值。 测试通过平均的评价指来降低训练集和测试集划分方式对预测结果的影响,有研究值表明k 折评估准准确性高,当k为5或10时在评估准准后性和计算复杂性下综合性能最优。
10折交叉验证是指将原始数据集随机划分为样本数近乎相等的10个子集,轮流将其中的9个合并作为训练集,其余1个作为测试试集。算正确率等评价指标,最终终通过K次试验验后取评价指标的平均值来评估该模型的泛化能力。

在这里插入图片描述
目前我在sciml包编写了scikfoldcv函数新版上线,可以轻松实现多种机器学习模型进行10折交叉验证,下面我来演示一下

先导入数据和R包

library(sciml)
library(scitable)
require(xgboost)
bc<-read.csv("E:/r/test/demo.csv",sep=',',header=TRUE)
bc <- na.omit(bc)

在这里插入图片描述
数据变量很多,我解释几个我等下要用的,HBP:是否发生高血压,结局指标,AGE:年龄,是我们的协变量,BMI肥胖指数,FEV1肺活量指标,WEIGHT体重,“SBP”,“DBP”:收缩压和舒张压。公众号回复:体检数据,可以获得数据。

有些变量用不到,我先精简一下,

bc<-bc[,c("HBP","SEX","AGE","FEV1","OCCU","COUGH","EDU")]

使用organizedata2整理数据,主要是把分类变量转因子,手动转也是一样的

out2<-organizedata2(data = bc,username=username,token=token,explore = T)

data<-out2[["data"]]
allVars<-out2[["allVars"]]
fvars<-out2[["factorvarout"]]

这里注意一下10折交叉验证不要拆分数据,10折交叉验证很简单,就是一句话代码,data填入数据,y填入结局变量,如果咱们要做随机森林的10折交叉验证,就是type=“randomForest”

cv_results <- scikfoldcv(data=data, y="HBP",type="randomForest",username = username, token = token)

生成的cv_results结果很多,咱们需要进一步把数据提取出来
在这里插入图片描述

newdata2<-cv_results[["testlist"]]
fitlist<-cv_results[["fitlist"]]

使用scitable包绘图

library(scitable)
out<-m.sciroc(fitlist,newdata = newdata2,oblist = T)
out[["p"]]

在这里插入图片描述
我们可以看到,这个图是没有AUC值得,我们提取AUC数据2次绘图,这里oblist = T一定要有,不然会报错

auc<-out[["rocauc"]]
out<-m.sciroc(fitlist,newdata = newdata2,legend.name = auc,oblist = T)
out[["p"]]

这样一个很难画的10折交叉验证的ROC图几分钟就画好啦。

在这里插入图片描述
Scikfoldcv函数除了随机森林还支持支持向量机模型和xgboost模型,换一下type就可以了,下面我就直接上代码啦

支持向量机:

cv_results <- scikfoldcv(data=data_train, y="HBP",type="svm",username = username, token = token)
newdata2<-cv_results[["testlist"]]
fitlist<-cv_results[["fitlist"]]

auc<-out[["rocauc"]]
out<-m.sciroc(fitlist,newdata = newdata2,legend.name = auc,oblist = T)
out[["p"]]

在这里插入图片描述
Xgboost模型:

cv_results <- scikfoldcv(data=data_train, y="HBP",type="xgb.Booster",username = username, token = token)
newdata2<-cv_results[["testlist"]]
fitlist<-cv_results[["fitlist"]]

auc<-out[["rocauc"]]
out<-m.sciroc(fitlist,newdata = newdata2,legend.name = auc,oblist = T)
out[["p"]]

在这里插入图片描述

总结,操作非常简单,新手上手难度0颗星

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐