R语言机器学习与临床预测模型76--预测模型验证方法
R小盐准备介绍R语言机器学习与预测模型的学习笔记
你想要的R语言学习资料都在这里, 快来收藏关注【科研私家菜】
01 数据集划分
按一定比例划分为训练集和测试集
这种方法也称为保留法。我们通常取8-2、7-3、6-4、5-5比例切分,直接将数据随机划分为训练集和测试集,然后使用训练集来生成模型,再用测试集来测试模型的正确率和误差,以验证模型的有效性。
这种方法常见于决策树、朴素贝叶斯分类器、线性回归和逻辑回归等任务中。
# Train Validation & Test samples
trvaltest <- function(dat,prop = c(0.5,0.25,0.25)){
nrw = nrow(dat) trnr = as.integer(nrw *prop[1])
vlnr = as.integer(nrw*prop[2])
set.seed(123)
trni = sample(1:nrow(dat),trnr)
trndata = dat[trni,] rmng = dat[-trni,]
vlni = sample(1:nrow(rmng),vlnr)
valdata = rmng[vlni,]
tstdata = rmng[-vlni,]
mylist = list("trn" = trndata,"val"= valdata,"tst" = tstdata)
return(mylist) }
outdata = trvaltest(mtcars,prop = c(0.5,0.25,0.25))
train_data = outdata$trn;
valid_data = outdata$val;
test_data = outdata$tst
02 交叉验证
交叉验证是另一种以计算为代价确保模型鲁棒性的方法。在普通建模方法中,根据训练数据开发模型,并根据测试数据进行评估。在某些极端情况下,训练和测试可能不是均匀选择的,测试数据中可能会出现一些不均匀的极端情况,这将降低模型的性能。
另一方面,在交叉验证方法中,数据被分成相等的部分,并在数据的所有其他部分上进行训练,除了一个部分外,将在该部分上评估性能。此过程重复了用户选择的任何部分。
示例:在五重交叉验证中,数据将分为五个部分,随后对数据的四个部分进行训练,并对数据的一个部分进行测试。该过程将运行五次,以覆盖数据中的所有点。最后,计算的误差将是所有误差的平均值。
交叉验证是指一组检测建立的给定预测模型用在新数据(测试数据集)中效果好坏的方法 。
交叉验证法背后的基本思想是将数据分为两组:
训练数据集,用于训练(即构建)模型;
测试数据集(或验证集),用于测试(即验证)模型(通过估计预测误差) 。
交叉验证也称为重采样方法,它涉及使用数据的不同子集使用同一方法进行多次拟合 。
评估模型性能的交叉验证法有多种方法:
- 验证集方法(或数据拆分):Validation set approach
- 单个剔除交叉验证: Leave One Out Cross Validation
- k倍交叉验证(又叫k折交叉验证): k-fold Cross Validation
- 重复k倍交叉验证: Repeated k-fold Cross Validation
03 网格搜索
机器学习中的网格搜索是调整模型超参数以找到最佳组合以确定最佳拟合的常用方法。
1.网格搜索。(Grid Search)就是你手动的给出一个模型中你想要改动的参数,程序自动的帮你使用穷举法来将所甩的参数都运行-遍。决策树中我们常常将最天树深作为需要调节的參数: AdaBoost中将弱分类器的数量作为需要调节的参数。
2.参数调优:为了确定最优搜索参数,需要选择一个评分 方式(根据实际情况来确定的可能是accuracy、f1-score、 f-beta. pricise、 reall等) 。
3.交叉验证: K折交叉验证即把数据评分分成K分,每次留-份作为测试集,K- 1份作为训练集,进行K次模型评
分,将K次评分求平均值返回,然后找出最大的一个评分使用的参数组合。这也就完成了交叉验证这一过程。
4.可以自动对我们给定的参数进行组合,并得出每个组合的模型效果,通过比较其效果来选出最佳参数组合。
# Grid Search on Decision Trees
library(rpart)
input_data = read.csv("ad.csv",header=FALSE)
input_data$V1559 = as.factor(input_data$V1559)
set.seed(123)
numrow = nrow(input_data)
trnind = sample(1:numrow,size = as.integer(0.7*numrow))
train_data = input_data[trnind,];
test_data = input_data[-trnind,]
minspset = c(2,3);
minobset = c(1,2,3)
initacc = 0
for (minsp in minspset){
for (minob in minobset){
tr_fit = rpart(V1559 ~.,data = train_data,method = "class",minsplit = minsp, minbucket = minob) tr_predt = predict(tr_fit,newdata = train_data,type = "class") tble = table(tr_predt,train_data$V1559) acc = (tble[1,1]+tble[2,2])/sum(tble) acc if (acc > initacc){ tr_predtst = predict(tr_fit,newdata = test_data,type = "class") tblet = table(test_data$V1559,tr_predtst)
acct = (tblet[1,1]+tblet[2,2])/sum(tblet) acct print(paste("Best Score"))
print( paste("Train Accuracy ",round(acc,3),"Test Accuracy",round(acct,3)))
print( paste(" Min split ",minsp," Min obs per node ",minob)) print(paste("Confusion matrix on test data"))
print(tblet)
precsn_0 = (tblet[1,1])/(tblet[1,1]+tblet[2,1])
precsn_1 = (tblet[2,2])/(tblet[1,2]+tblet[2,2])
print(paste("Precision_0: ",round(precsn_0,3),"Precision_1: ",round(precsn_1,3)))
rcall_0 = (tblet[1,1])/(tblet[1,1]+tblet[1,2])
rcall_1 = (tblet[2,2])/(tblet[2,1]+tblet[2,2])
print(paste("Recall_0: ",round(rcall_0,3),"Recall_1: ",round(rcall_1,3)))
initacc = acc } } }
与模型交叉验证搭配,先用gridsearch搜索模型最佳参数,再用交叉验证训练测试模型。
网格搜索GridSearch参数网格搜索费时费力,往往能得到全局最佳参数;也可使用贝叶斯参数自动搜索,省时省力,但有时候容易得到的是局部最佳参数。可以先用贝叶斯自动搜索确定范围,再用网格搜索GridSearch搜索确定最佳参数。
关注R小盐,关注科研私家菜(VX_GZH: SciPrivate),有问题请联系R小盐。让我们一起来学习 R语言机器学习与临床预测模型