如果我用默认值指定 parms,为什么我会得到不同的 rpart 交叉验证错误?

Why do I get different cross validation errors with rpart if I specify parms with default values?

我对以下问题感到困惑:

set.seed(144)
df = data.frame(outcome=as.factor(sample(c('a','b','c'), 1000, replace=T)), x=rnorm(1000), y=rnorm(1000), z=rnorm(1000))
library(rpart)
fit.default = rpart(outcome ~ x + y + z, data=df, method='class')
fit.specified = rpart(outcome ~ x + y + z, data=df, method='class', parms=list(split='gini', loss=matrix(c(0,1,1,1,0,1,1,1,0), nrow=3,ncol=3,byrow=T)))
fit.default$cptable
fit.specified$cptable

它在 xerror 和 xstd 列中为指定值和默认值生成不同的值。但是根据 ?rpart,默认拆分是 'gini',默认损失矩阵是我提供的 1 矩阵(对角线为零)。那么为什么它会表现不同呢?我注意到这一点是因为我根据最小 xerror 选择了不同的树,并想验证基线默认情况。

说明我上面的评论,如果你 运行 他们完全解开:

set.seed(144)
df = data.frame(outcome=as.factor(sample(c('a','b','c'), 1000, replace=T)), 
                x=rnorm(1000), 
                y=rnorm(1000), 
                z=rnorm(1000))
library(rpart)
fit.default = rpart(outcome ~ x + y + z, 
                    data=df, 
                    method='class')
fit.default$cptable  

set.seed(144)
df = data.frame(outcome=as.factor(sample(c('a','b','c'), 1000, replace=T)), 
                x=rnorm(1000), 
                y=rnorm(1000), 
                z=rnorm(1000))
library(rpart)
fit.specified = rpart(outcome ~ x + y + z, 
                      data=df, 
                      method='class', 
                      parms=list(split='gini', 
                                loss=matrix(c(0,1,1,1,0,1,1,1,0), 
                                nrow=3,
                                ncol=3,
                                byrow=T)))

fit.specified$cptable

你得到:

> fit.default$cptable
         CP nsplit rel error    xerror       xstd
1 0.0375000      0  1.000000 1.0000000 0.02371708
2 0.0140625      1  0.962500 0.9640625 0.02401939
3 0.0100000      3  0.934375 0.9921875 0.02378775

> fit.specified$cptable
         CP nsplit rel error    xerror       xstd
1 0.0375000      0  1.000000 1.0000000 0.02371708
2 0.0140625      1  0.962500 0.9640625 0.02401939
3 0.0100000      3  0.934375 0.9921875 0.02378775