Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 分层抽样不';似乎不会改变结果_R_Random Forest - Fatal编程技术网

R 分层抽样不';似乎不会改变结果

R 分层抽样不';似乎不会改变结果,r,random-forest,R,Random Forest,我正在使用R中的randomForest软件包来构建几个物种分布模型。我的反应变量是二进制的(0-缺失或1-存在),并且非常不平衡——对于某些物种,缺失与存在的比率是37:1。这种不平衡(或零通胀)导致了有问题的带外误差估计——缺勤与在场的比率越大,我的带外(OOB)误差估计越低 为了补偿这种不平衡,我想实施分层抽样,这样随机林中的每棵树都包含相同数量(或至少更少不平衡)的存在和不存在类别的结果。我很惊讶分层模型和非分层模型OOB误差估计似乎没有任何区别。请参见下面的我的代码: 无分层 >设置种

我正在使用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) )