【问题标题】:varimp (R party) return only zerosvarimp(R 方)仅返回零
【发布时间】:2016-04-21 10:01:32
【问题描述】:

我对派对包中 varimp() 函数的行为感到困惑。

我正在使用条件随机森林来获得 Strobl 等人的变量重要性。 2009 年的建议。

它适用于我所有的数据集,但只有一个。我必须将我的观察进行子集化。 但是,即使条件随机森林在完整数据集上正常运行,它也只会为子集返回零……而且似乎根本不运行,但不会产生错误。

我想知道预测变量的数量是否太多,只能进行少量观察,并尝试仅使用有限数量的预测变量,但它给了我相同的结果。 正如在其他情况下指出的那样,它似乎也没有链接到变量类型......

我显然错过了一些东西,但我就是不知道是什么......

如果有人对我应该关注的方向有所了解,我将不胜感激。

我的数据here

VarforCRF <- read.csv("Data.csv",sep=";",dec=",",row.names=1)
library(party)
set.seed(round(runif(1,0,1)*10000))

# Run just fine with the entire dataset
cRF <- cforest(Syrph_pred~.,data = VarforCRF, control = cforest_unbiased(ntree=100))
varimp(object = cRF,conditional = T)


CRF_West <- subset(VarforCRF,Sector == "West") 

# Does not seem to run at all with subset and return zeros
cRF_W <- cforest(Syrph_pred~.,data = CRF_West, control = cforest_unbiased(ntree=100))
varimp(object = cRF_W,conditional = T)

【问题讨论】:

  • 您的数据以一种奇怪的格式下载。您是否将其保存为分号分隔,因为这不是存储数据的好方法。
  • 是的。抱歉,法文版 Excel 默认保存 .csv 时使用分号
  • 由于 Excel 在不同系统上的行为不同,R 提供了read.csv()(用于原始逗号分隔格式)和read.csv2()(用于分号分隔格式)。在您的情况下,只需使用:read.csv2("Data.csv", row.names = 1).

标签: r party


【解决方案1】:

您的子样本 CRF_West 太小,无法在森林树木中产生任何分裂。数据有 23 个观测值,从中为每棵树抽取大约 2/3 的引导样本。但是,用于拆分的节点的最小大小为 20 个观察值,最小节点大小为 7 个观察值,请参阅?ctree_control

要强制树木/森林分裂,您可以使用较小的值,例如

cRF_W <- cforest(Syrph_pred~.,data = CRF_West,
  control = cforest_unbiased(ntree=100, minsplit = 15, minbucket = 5))

对于这个森林,您将获得非零变量重要性。不过,这是否会在如此小的样本上产生特别好的/可靠的结果是一个不同的问题。

最后的评论:尝试通过设置种子来使计算可重现是好的并且非常有用。然而,对随机种子使用(不可重现的)随机数会破坏整个事情......

【讨论】:

  • 非常感谢!我发现样本量太小,但我无法理解为什么。我正在尝试寻找另一种方法来处理这些数据而不进行子集化。问题是,Syrph_pred 有一个双峰重新分区,对应于扇区(西部和东部)......至于种子,我知道。我随机设置种子只是为了测试不同的种子是否会导致不同的结果。一位老师建议我这样做一次......
猜你喜欢
  • 2017-07-26
  • 2020-11-05
  • 2019-11-11
  • 2016-03-04
  • 2020-02-12
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多