应用预测建模第四章过度拟合与模型调优习题4.4【分层随机抽样、小样本的模型评估方案】

《应用预测建模》Applied Predictive Modeling (2013) by Max Kuhn and Kjell Johnson,林荟等译

第四章 过度拟合与模型调优

4.4 Brodnjak-Vonina 等( 2005 )提出了一种在食品科学研究中检测样本油脂类别的方法。在此方法中,他们使用气象色谱仪(一个能够分离样本化学物质的仪器)测量了油脂中7 种不同的脂肪酸。这些测量将被用来预测食物样本中含有的油脂类型。他们使用了96 个含有七种油脂的样本进行建模 。这些数据可以在caret 包中输入data(oil)得到。油脂的类别储存在一个名为oilType 的因子变量里,包括南瓜油(A)、葵花籽油 (B)、花生油(C )、橄榄油(D)、大豆油(E)、菜籽油(F)和玉米油(G) 。相关R 代码如下:

( a)使用基础R 中的sample函数建立一个含有60个油脂样品的完全随机样本。随机抽取的样本中各类油脂的比例和原样本中的有多相近? 重复这一过程多次,理解随机抽样过程的变异性。
( b)使用caret 包中的createDataPartition函数得到分层随机抽样样本。和完全随机抽样样本相比较有什么不同?
( c)对于该例这种小样本的情形,评估模型表现有哪些可选的方案?是否应该使用测试集?
( d )一种理解测试集不确定性的方法是使用置信区间。可以使用基础R函数binom. test 来得到总体准确度的置信区间。使用该函数时,需要指定总样本量和分类正确的样本点数量来计算区间。假设一个有20个油脂样本的测试集被预留下来,另外76 个样本被用来作为训练集。对于这样大小的测试集,假设准确度大概是80% ( 20 个小分类正确的为16 个),置信区间可以用如下方法得到:

 

在此例子中,95 %置信区间的宽度是37. 9 % 。请尝试不同的样本量和准确度,理解结果的不确定性、模型表现以及测试集大小这三者间的关系。 



( a)使用基础R 中的sample函数建立一个含有60个油脂样品的完全随机样本。随机抽取的样本中各类油脂的比例和原样本中的有多相近? 重复这一过程多次,理解随机抽样过程的变异性。

table(oilType)/length(oilType)

s1<-sample(oilType,60)
s2<-sample(oilType,60)
s3<-sample(oilType,60)
s4<-sample(oilType,60)
table(s1)/length(s1)
table(s2)/length(s2)
table(s3)/length(s3)
table(s4)/length(s4)

随机抽样4次,每个样本的各类油脂比例都与原样本差异较大,且各自也都互不相同。 

> table(oilType)/length(oilType)
oilType
         A          B          C          D          E          F          G 
0.38541667 0.27083333 0.03125000 0.07291667 0.11458333 0.10416667 0.02083333 
> 
> table(s1)/length(s1)
s1
         A          B          C          D          E          F          G 
0.40000000 0.26666667 0.01666667 0.08333333 0.06666667 0.15000000 0.01666667 
> table(s2)/length(s2)
s2
         A          B          C          D          E          F          G 
0.31666667 0.30000000 0.05000000 0.10000000 0.10000000 0.10000000 0.03333333 
> table(s3)/length(s3)
s3
         A          B          C          D          E          F          G 
0.35000000 0.26666667 0.01666667 0.10000000 0.10000000 0.13333333 0.03333333 
> table(s4)/length(s4)
s4
         A          B          C          D          E          F          G 
0.40000000 0.26666667 0.03333333 0.08333333 0.08333333 0.11666667 0.01666667 


( b)使用caret 包中的createDataPartition函数得到分层随机抽样样本。和完全随机抽样样本相比较有什么不同?

#分层随机抽样
library(caret)
set.seed(100)
trainingRows<-createDataPartition(oilType,p=0.625,list=FALSE) #返回索引矩阵
traindata<-oilType[trainingRows]
table(traindata)/length(traindata)

可见,分层随机抽样样本的各类别油脂比例非常接近于原样本。 

> table(traindata)/length(traindata)
traindata
       A        B        C        D        E        F        G 
0.375000 0.265625 0.031250 0.078125 0.109375 0.109375 0.031250 


( c)对于该例这种小样本的情形,评估模型表现有哪些可选的方案?是否应该使用测试集?

样本量太小,不应使用测试集,因为:

  1. 模型拟合需要利用任何一个可能的样本点。
  2. 测试集的样本量或许不足以提供一个合理论断所需要的信息量和精度,测试集带有的不确定性不能忽视,选取的不同测试集给出的结果可能大相径庭。

模型评估的可选方案:

重复十折交叉验证(得到的偏差和方差都适中,而且在给定样本量的情况下计算量也并不大)



( d )一种理解测试集不确定性的方法是使用置信区间。可以使用基础R函数binom. test 来得到总体准确度的置信区间。使用该函数时,需要指定总样本量和分类正确的样本点数量来计算区间。假设一个有20个油脂样本的测试集被预留下来,另外76 个样本被用来作为训练集。对于这样大小的测试集,假设准确度大概是80% ( 20 个小分类正确的为16 个),置信区间可以用如下方法得到:

在此例子中,95 %置信区间的宽度是37. 9 % 。请尝试不同的样本量和准确度,理解结果的不确定性、模型表现以及测试集大小这三者间的关系。 

首先,限定总测试集样本量为20,设定不同的预测正确样本数量,计算每个数量下的置信区间宽度。

#置信区间
num_correct <- 16:20
accuracy<-num_correct/20
width_of_interval = c()
for( nc in num_correct ){
  bt_out = binom.test( nc, 20 )
  width_of_interval = c( width_of_interval, diff( bt_out$conf.int ) )
}

plot( num_correct, width_of_interval, pch=17,lty=1, type='b',xlab='正确样本个数(测试集总样本20个)', ylab='95%置信区间宽度' )

可见,随着准确度(accuracy)的提升(模型表现向好),95%置信区间的宽度缩短,不确定降低。但就算所有样本都被预测正确(准确度100%),置信区间宽度也达16.8%,这说明就算所有测试集样本被预测正确,模型的真实准确度可能只有83.2%。这体现出,小样本测试集的高度不确定性,它不足以提供一个合理论断所需要的信息量和精度。

然后,扩大测试样本集,将测试样本量设定为40,重新做图。

#扩大测试集样本量,设定为40
num_correct2 <- seq(32, 40, by=2)
width_of_interval2 <- c()
for( nc in num_correct2 ){
  bt_out = binom.test( nc, 40 )
  width_of_interval2 = c( width_of_interval2, diff( bt_out$conf.int ) )
}
#做图
plot( accuracy, width_of_interval, pch=17,lty=1, type='b',col="blue"
      ,xlab='准确度', ylab='95%置信区间宽度',ylim=c(0.1, 0.4))
lines( accuracy, width_of_interval2, pch=15,lty=1, type='b', col="red")
legend("topright", inset=.05, title="测试集数量", c("20","40"),
       lty=c(1, 1), pch=c(17, 15), col=c("blue", "red"))



如图,说明相同准确度下, 样本量较大的测试集置信区间比较窄,不确定性比较低。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值