在 rpart 中使用 minsplit 和不等权重

Posted

技术标签:

【中文标题】在 rpart 中使用 minsplit 和不等权重【英文标题】:Using minsplit and unequal weights in rpart 【发布时间】:2012-02-01 19:13:42 【问题描述】:

当权重不均匀时,如何将权重合并到rpartminsplit 标准中? 我找不到让minsplit 阈值考虑权重的方法,当权重不均匀时,它就会成为一个问题,如下例所示。 我目前的解决方法是将数据扩展为每行都是观察的数据,但这在时间和内存上似乎都是浪费的(而且我怀疑我是否可以将需要使用的真实数据集以扩展形式保存在内存中) ,因此 - 寻求帮助。 在此先感谢您的帮助, -萨尔

以下代码显示了问题所在;前 3 棵树是相同的,但以下两棵树(权重不均匀)结果不同:

## playing with rpart weights
require(rpart)
dev.new()
par(mfrow=c(2,3), xpd=NA) 
data(kyphosis)

fitOriginal <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosis, control=rpart.control(minsplit=15))
plot(fitOriginal)
text(fitOriginal, use.n=TRUE)

# this dataset is the original data repeated 3 times
kyphosisRepeated <- rbind(kyphosis, kyphosis, kyphosis)
fitRepeated <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisRepeated, control=rpart.control(minsplit=45))
plot(fitRepeated)
text(fitRepeated, use.n=TRUE)

# instead of repeating, use weights
kyphosisWeighted <- kyphosis
kyphosisWeighted$myWeights <- 3
fitWeighted <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisWeighted, weights=myWeights, 
    control=rpart.control(minsplit=15))        ## minsplit has to be adjusted for weights...
plot(fitWeighted)
text(fitWeighted, use.n=TRUE)

# uneven weights don't works the same way
kyphosisUnevenWeights <- rbind(kyphosis, kyphosis)
kyphosisUnevenWeights$myWeights <- c(rep(1,length.out=nrow(kyphosis)), rep(2,length.out=nrow(kyphosis)))

fitUneven15 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
    control=rpart.control(minsplit=15))
plot(fitUneven15)
text(fitUneven15, use.n=TRUE)

fitUneven45 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
    control=rpart.control(minsplit=45))
plot(fitUneven45)
text(fitUneven45, use.n=TRUE)

## 30 works, but seems like a special case 
fitUneven30 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
    control=rpart.control(minsplit=30))
plot(fitUneven30)
text(fitUneven30, use.n=TRUE)

【问题讨论】:

【参考方案1】:

这里没有问题。如果您使用的数据集是原始数据集的两倍,然后要求 minsplit 是原始 minsplit 的 3 倍,那么您当然会长出一棵较短的树(假设权重之间的相关性保持不变。)请参阅这些修改后的示例,这些示例表明,如果您保持权重相关性相同,并且 minsplit/n 的比率也相同,您将种植相同的树。

## playing with rpart weights
require(rpart)
dev.new()
par(mfrow=c(2,2), xpd=NA) 
data(kyphosis)

# this dataset is the original data repeated 2 times############################################################
# without weights
kyphosisRepeated <- rbind(kyphosis, kyphosis)
fitRepeated <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisRepeated, control=rpart.control(minsplit=30))
plot(fitRepeated)
text(fitRepeated, use.n=TRUE)

# with weights
kyphosisUnevenWeights <- rbind(kyphosis, kyphosis)
kyphosisUnevenWeights$myWeights <- c(rep(1,length.out=nrow(kyphosis)), rep(2,length.out=nrow(kyphosis)))

fitUneven30 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
                     control=rpart.control(minsplit=30))
plot(fitUneven30)
text(fitUneven30, use.n=TRUE)
################################################################################################################

# this dataset is the original data repeated 3 times
# without weights
kyphosisRepeated <- rbind(kyphosis, kyphosis, kyphosis)
fitRepeated <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisRepeated, control=rpart.control(minsplit=45))
plot(fitRepeated)
text(fitRepeated, use.n=TRUE)

# with weights
kyphosisUnevenWeights <- rbind(kyphosis, kyphosis, kyphosis)
kyphosisUnevenWeights$myWeights <- c(rep(1,length.out=nrow(kyphosis)), rep(2,length.out=nrow(kyphosis)), rep(3,length.out=nrow(kyphosis)))

fitUneven45 <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosisUnevenWeights, weights=myWeights, 
                     control=rpart.control(minsplit=45))
plot(fitUneven45)
text(fitUneven45, use.n=TRUE)

有关RPart 的更多详细信息,请参阅this blog post。

【讨论】:

我正在尝试在一般数据集上使用不平衡的权重和最小分割,示例显示它不起作用。平衡权重不是一个通用的解决方案,它可能会导致数据集太大。 @Saar,如果我遗漏了一些明显的东西,我深表歉意。您说这些示例显示“它不起作用”。以什么方式不起作用?当我测试这些示例时,它们中的每一个都长出了一棵树,没有任何错误。其中一棵树的生长方式是否出乎你的意料? 在所有 6 个示例中,数据都是相同的数据,以不同的方式表示(第一个示例除外):每个观察重复 3 次,出现一次但权重为 3,或出现两次权重加起来为 3。我希望由它构建的树是同一棵树(相同的数据、相同的算法、相同的条件应该导致相同的输出)。具体来说,第五个示例应该给我与第二个和第三个示例相同的树。它没有。这不是关于运行时错误,而是关于得到错误的答案......

以上是关于在 rpart 中使用 minsplit 和不等权重的主要内容,如果未能解决你的问题,请参考以下文章

rpart中的Minbucket和权重

RPART 模型在拟合模型时忽略变量

使用 R 中“rpart”包中的生存树来预测新的观察结果

rpart 节点分配

Fixed Partition Memory Management UVALive - 2238 建图很巧妙 km算法左右顶点个数不等模板以及需要注意的问题 求最小权匹配

rpart 中 CP 表给出的树大小