R 分层抽样不';似乎不会改变结果
我正在使用R中的randomForest软件包来构建几个物种分布模型。我的反应变量是二进制的(0-缺失或1-存在),并且非常不平衡——对于某些物种,缺失与存在的比率是37:1。这种不平衡(或零通胀)导致了有问题的带外误差估计——缺勤与在场的比率越大,我的带外(OOB)误差估计越低 为了补偿这种不平衡,我想实施分层抽样,这样随机林中的每棵树都包含相同数量(或至少更少不平衡)的存在和不存在类别的结果。我很惊讶分层模型和非分层模型OOB误差估计似乎没有任何区别。请参见下面的我的代码: 无分层R 分层抽样不';似乎不会改变结果,r,random-forest,R,Random Forest,我正在使用R中的randomForest软件包来构建几个物种分布模型。我的反应变量是二进制的(0-缺失或1-存在),并且非常不平衡——对于某些物种,缺失与存在的比率是37:1。这种不平衡(或零通胀)导致了有问题的带外误差估计——缺勤与在场的比率越大,我的带外(OOB)误差估计越低 为了补偿这种不平衡,我想实施分层抽样,这样随机林中的每棵树都包含相同数量(或至少更少不平衡)的存在和不存在类别的结果。我很惊讶分层模型和非分层模型OOB误差估计似乎没有任何区别。请参见下面的我的代码: 无分层 >设置种
>设置种子(25)
>HHrf HHrf
电话:
随机森林(公式=因子(HH_Pres)~SST+Dist2Shr+DaylightHours+Bathy+Slope+MoonPhase+factor(Region)+Chla,数据=bll_HH,ntree=500,替换=FALSE,重要性=TRUE,na.action=na.省略)
随机森林类型:分类
树木数目:500
每次拆分时尝试的变量数:2
OOB错误率估计:19.1%
混淆矩阵:
0.1类错误
0 422 18 0.04090909
1 84 10 0.89361702
分层
>HHrf\u HHrf
电话:
随机森林(公式=因子(HH_Pres)~SST+Dist2Shr+DaylightHours+Bathy+Slope+MoonPhase+factor(Region)+Chla,数据=bll_HH,ntree=500,替换=FALSE,重要性=TRUE,na.action=na.省略)
随机森林类型:分类
树木数目:500
每次拆分时尝试的变量数:2
OOB错误率估计:19.1%
混淆矩阵:
0.1类错误
0 422 18 0.04090909
1 84 10 0.89361702
我在这两种情况下得到相同的结果有什么原因吗?对于strata参数,我指定了我的响应变量HH_Pres。对于sampsize参数,我指定它应该只占整个数据集的63.2%
有人知道我做错了什么吗?还是这是意料之中的事
谢谢
莉莎
要重现此问题,请执行以下操作:
样本数据:
代码:
bll = read.csv("bll_Nov2013_NMV.csv", header=TRUE)
HH_Pres <- bll$HammerHeadALL_Presence
Slope <-bll$Slope
Dist2Shr <-bll$Dist2Shr
Bathy <-bll$Bathy2
Chla <-bll$GSM_Chl_Daily_MF
SST <-bll$SST_PF_daily
Region <- bll$Region
MoonPhase <-bll$MoonPhase
DaylightHours <- bll$DaylightHours
bll_HH <- data.frame(HH_Pres, Slope, Dist2Shr, Bathy, Chla, SST, DaylightHours, MoonPhase, Region)
set.seed(25)
HHrf<- randomForest(formula = factor(HH_Pres) ~ SST + Dist2Shr+ DaylightHours + Bathy + Slope + MoonPhase + factor(Region) + Chla , data = bll_HH, ntree = 500, replace = FALSE, importance = TRUE, na.action = na.omit)
HHrf
set.seed(25)
HHrf_strata<- randomForest(formula = factor(HH_Pres) ~ SST + Chla + Dist2Shr+ DaylightHours + Bathy + Slope + MoonPhase + factor(Region), data = bll_HH, strata = bll_HH$HH_Pres, sampsize = c(100, 50), ntree = 500, replace = FALSE, importance = TRUE)
HHrf
bll=read.csv(“bll\u Nov2013\u NMV.csv”,header=TRUE)
HH_Pres据我所知,sampsize
参数应该是一个与数据集中的类数长度相同的向量。如果在strata
参数中指定因子变量,则应为sampsize
指定一个向量,该向量的长度与strata
参数中的因子数相同。我不确定它的性能是否如您在问题中所述,但我已经有一段时间没有使用randomForest
函数了
从帮助文件中,它显示:
地层
用于分层抽样的(因子)变量
sampsize
:
要抽取的样本大小。对于分类,如果sampsize是一个向量
根据地层的长度和数量,然后按
地层和sampsize元素表示要绘制的数字
从地层中
例如,由于您的分类有两个不同的类,因此需要为sampsize
提供一个长度为2的向量,该向量指定在训练期间要从每个类中采样多少个观察值
e、 g.sampsize=c(100,50)
此外,您还可以将组的名称指定为格外清晰
e、 g.sampsize=c('0'=100,'1'=50)
帮助文件中的一个示例使用sampsize
参数来说明:
## stratified sampling: draw 20, 30, and 20 of the species to grow each tree.
data(iris)
(iris.rf2 <- randomForest(iris[1:4], iris$Species, sampsize=c(20, 30, 20)))
请注意,在这种情况下,OOB错误估计是相同的,即使我们只使用引导样本中每个类63.2%的数据。这可能是由于使用的样本大小与训练数据中的类分布成比例,并且数据集的大小相对较小。让我们尝试更改mySampSize
,以确保它真正起作用
# Change mySampSize. Sample 100 from class 0 and 50 from class 1
mySampSize[1] <- 100
mySampSize[2] <- 50
set.seed(25)
HHrf <- randomForest(formula=HH_Pres ~ SST + Dist2Shr + DaylightHours + Bathy +
Slope + MoonPhase + Chla + Region,
data=bll_HH, ntree = 500, replace = FALSE,
importance = TRUE, na.action = na.omit,
sampsize=mySampSize)
HHrf
# Output
# OOB estimate of error rate: 21.16%
# Confusion matrix:
# 0 1 class.error
# 0 382 58 0.1318182
# 1 55 39 0.5851064
#更改mySampSize。0类样品100和1类样品50
mySampSize[1]这种语法似乎对我处理您的数据很有效。OOB为32.21%,类错误:0.32,0.29。我确实把引导的数量提高到了1000。我总是建议使用索引来定义RF模型。在某些情况下,符号语法似乎不稳定
require(randomForest)
HHrf <- read.csv("bll_HH.csv")
set.seed(25)
( rf.mdl <- randomForest( y=as.factor(HHrf[,"HH_Pres"]), x=HHrf[,2:ncol(HHrf)],
strata=as.factor(HHrf[,"HH_Pres"]), sampsize=c(50,50),
ntree=1000) )
require(随机林)
我也遇到了这个问题。我注意到,当使用importance=TRUE
时,我的错误率发生了显著变化。这与我没有选择分层抽样不同
对我来说,这最终是一种折衷,因为我的分类树没有重要性/准确性得分。这似乎是此实现中的众多错误之一。非常感谢您的回答!我现在更了解sampsize的论点了。不幸的是,我仍然从分层和非分层模型中得到相同的OOB误差估计。我想知道,当我运行分层模型后打印它时,“sampsize”和“strata”参数在调用后不再出现,这是不是很奇怪?请看我的原始示例。@Liza没有一些示例数据,我无法尝试您的示例。但是,请尝试更改strata
和sampsize
参数-它们可能无效,randomForest
可能会忽略它们。以下是一些示例数据。如果你有机会测试一下,我会非常感激的。我将编辑我的原始示例以包含所有变量名。我知道这是一个老问题,但是。。。您将第二个模型命名为HHrf\u strata
,但同时检查HHrf
的输出。。。最后一行不是应该是HHrf\u strata
吗?这并不能真正回答问题。我
# Fix up the data set to have HH_Pres and Region as factors
bll_HH$Region <- factor(bll_HH$Region)
bll_HH$HH_Pres <- factor(bll_HH$HH_Pres)
# Original RF code
set.seed(25)
HHrf <- randomForest(formula=HH_Pres ~ SST + Dist2Shr + DaylightHours + Bathy +
Slope + MoonPhase + Chla + Region,
data=bll_HH, ntree = 500, replace = FALSE,
importance = TRUE, na.action = na.omit)
HHrf
# Output
# OOB estimate of error rate: 18.91%
# Confusion matrix:
# 0 1 class.error
# 0 425 15 0.03409091
# 1 86 8 0.91489362
# Take 63.2% from each class
mySampSize <- ceiling(table(bll_HH$HH_Pres) * 0.632)
set.seed(25)
HHrf <- randomForest(formula=HH_Pres ~ SST + Dist2Shr + DaylightHours + Bathy +
Slope + MoonPhase + Chla + Region,
data=bll_HH, ntree = 500, replace = FALSE,
importance = TRUE, na.action = na.omit,
sampsize=mySampSize)
HHrf
# Output
# OOB estimate of error rate: 18.91%
# Confusion matrix:
# 0 1 class.error
# 0 424 16 0.03636364
# 1 85 9 0.90425532
# Change mySampSize. Sample 100 from class 0 and 50 from class 1
mySampSize[1] <- 100
mySampSize[2] <- 50
set.seed(25)
HHrf <- randomForest(formula=HH_Pres ~ SST + Dist2Shr + DaylightHours + Bathy +
Slope + MoonPhase + Chla + Region,
data=bll_HH, ntree = 500, replace = FALSE,
importance = TRUE, na.action = na.omit,
sampsize=mySampSize)
HHrf
# Output
# OOB estimate of error rate: 21.16%
# Confusion matrix:
# 0 1 class.error
# 0 382 58 0.1318182
# 1 55 39 0.5851064
require(randomForest)
HHrf <- read.csv("bll_HH.csv")
set.seed(25)
( rf.mdl <- randomForest( y=as.factor(HHrf[,"HH_Pres"]), x=HHrf[,2:ncol(HHrf)],
strata=as.factor(HHrf[,"HH_Pres"]), sampsize=c(50,50),
ntree=1000) )