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语言机器学习与临床预测模型

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容