partykit 对象变量不匹配
partykit object varid mismatch
我正在使用 partykit
并注意到可能 varid
不匹配(除非我误解了什么)。下面是示例代码。
nodeapply
返回的根节点显示变量 5 作为拆分变量。
显式生成的列表的第一个元素也有 split$varid
5。如果我们查看 iris
数据框,那么第 5 列是 Species
,Petal.Width
是第 4 列,它应该是根节点的 varid
,如 j48_party
对象所示。
varid
好像是实际使用的功能+1,这是故意的吗?
> library(partykit)
> library(RWeka)
> data("iris")
> j48 <- J48(Species~., data=iris)
> j48_party <- as.party(j48)
> j48_party
Model formula:
Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
Fitted party:
[1] root
| [2] Petal.Width <= 0.6: setosa (n = 50, err = 0.0%)
| [3] Petal.Width > 0.6
| | [4] Petal.Width <= 1.7
| | | [5] Petal.Length <= 4.9: versicolor (n = 48, err = 2.1%)
| | | [6] Petal.Length > 4.9
| | | | [7] Petal.Width <= 1.5: virginica (n = 3, err = 0.0%)
| | | | [8] Petal.Width > 1.5: versicolor (n = 3, err = 33.3%)
| | [9] Petal.Width > 1.7: virginica (n = 46, err = 2.2%)
Number of inner nodes: 4
Number of terminal nodes: 5
> colnames(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
> nodeapply(j48_party)
$`1`
[1] root
| [2] V5 <= 0.6 *
| [3] V5 > 0.6
| | [4] V5 <= 1.7
| | | [5] V4 <= 4.9 *
| | | [6] V4 > 4.9
| | | | [7] V5 <= 1.5 *
| | | | [8] V5 > 1.5 *
| | [9] V5 > 1.7 *
> nodes <- as.list(j48_party$node)
> nodes[[1]]$split$varid
[1] 5
不同之处在于:J48()
像大多数其他建模函数(如lm()
、glm()
等)并不简单地直接使用data
提供但首先建立一个 model.frame
。这已经执行了变量转换(例如,获取日志、创建因子或 Surv()
对象),收集可能不在 data
但在调用环境中的变量,并遗漏不在 data
中的变量型号 formula
等。有关更多信息和链接,请参阅 ?model.frame
。
因此,由 J48()
创建的对象有一个 model.frame
不完全是 iris
数据,但响应变量已移至第一列:
head(model.frame(j48))
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 setosa 5.1 3.5 1.4 0.2
## 2 setosa 4.9 3.0 1.4 0.2
## 3 setosa 4.7 3.2 1.3 0.2
## 4 setosa 4.6 3.1 1.5 0.2
## 5 setosa 5.0 3.6 1.4 0.2
## 6 setosa 5.4 3.9 1.7 0.4
并且来自此的信息也被传递到 party
对象。
j48_party$data
## [1] Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## <0 rows> (or 0-length row.names)
[注意:在 J48()
的情况下,这仅存储元信息,但会丢弃实际数据,因为此处不需要。但这对于 ctree()
来说是不同的。]
要查看此 model.frame()
可能与原始数据不同,请考虑以下情况:我们创建一个新的 noise
变量,它是 而不是 的一部分iris
但只是在调用环境中,获取日志并省略几个变量:
set.seed(1)
noise <- rnorm(150)
j48 <- J48(Species ~ log(Petal.Width) + noise, data = iris)
j48_party <- as.party(j48)
head(model.frame(j48))
## Species log(Petal.Width) noise
## 1 setosa -1.6094379 -0.6264538
## 2 setosa -1.6094379 0.1836433
## 3 setosa -1.6094379 -0.8356286
## 4 setosa -1.6094379 1.5952808
## 5 setosa -1.6094379 0.3295078
## 6 setosa -0.9162907 -0.8204684
j48_party$data
## [1] Species log(Petal.Width) noise
## <0 rows> (or 0-length row.names)
我正在使用 partykit
并注意到可能 varid
不匹配(除非我误解了什么)。下面是示例代码。
nodeapply
返回的根节点显示变量 5 作为拆分变量。
显式生成的列表的第一个元素也有 split$varid
5。如果我们查看 iris
数据框,那么第 5 列是 Species
,Petal.Width
是第 4 列,它应该是根节点的 varid
,如 j48_party
对象所示。
varid
好像是实际使用的功能+1,这是故意的吗?
> library(partykit)
> library(RWeka)
> data("iris")
> j48 <- J48(Species~., data=iris)
> j48_party <- as.party(j48)
> j48_party
Model formula:
Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
Fitted party:
[1] root
| [2] Petal.Width <= 0.6: setosa (n = 50, err = 0.0%)
| [3] Petal.Width > 0.6
| | [4] Petal.Width <= 1.7
| | | [5] Petal.Length <= 4.9: versicolor (n = 48, err = 2.1%)
| | | [6] Petal.Length > 4.9
| | | | [7] Petal.Width <= 1.5: virginica (n = 3, err = 0.0%)
| | | | [8] Petal.Width > 1.5: versicolor (n = 3, err = 33.3%)
| | [9] Petal.Width > 1.7: virginica (n = 46, err = 2.2%)
Number of inner nodes: 4
Number of terminal nodes: 5
> colnames(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
> nodeapply(j48_party)
$`1`
[1] root
| [2] V5 <= 0.6 *
| [3] V5 > 0.6
| | [4] V5 <= 1.7
| | | [5] V4 <= 4.9 *
| | | [6] V4 > 4.9
| | | | [7] V5 <= 1.5 *
| | | | [8] V5 > 1.5 *
| | [9] V5 > 1.7 *
> nodes <- as.list(j48_party$node)
> nodes[[1]]$split$varid
[1] 5
不同之处在于:J48()
像大多数其他建模函数(如lm()
、glm()
等)并不简单地直接使用data
提供但首先建立一个 model.frame
。这已经执行了变量转换(例如,获取日志、创建因子或 Surv()
对象),收集可能不在 data
但在调用环境中的变量,并遗漏不在 data
中的变量型号 formula
等。有关更多信息和链接,请参阅 ?model.frame
。
因此,由 J48()
创建的对象有一个 model.frame
不完全是 iris
数据,但响应变量已移至第一列:
head(model.frame(j48))
## Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 setosa 5.1 3.5 1.4 0.2
## 2 setosa 4.9 3.0 1.4 0.2
## 3 setosa 4.7 3.2 1.3 0.2
## 4 setosa 4.6 3.1 1.5 0.2
## 5 setosa 5.0 3.6 1.4 0.2
## 6 setosa 5.4 3.9 1.7 0.4
并且来自此的信息也被传递到 party
对象。
j48_party$data
## [1] Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## <0 rows> (or 0-length row.names)
[注意:在 J48()
的情况下,这仅存储元信息,但会丢弃实际数据,因为此处不需要。但这对于 ctree()
来说是不同的。]
要查看此 model.frame()
可能与原始数据不同,请考虑以下情况:我们创建一个新的 noise
变量,它是 而不是 的一部分iris
但只是在调用环境中,获取日志并省略几个变量:
set.seed(1)
noise <- rnorm(150)
j48 <- J48(Species ~ log(Petal.Width) + noise, data = iris)
j48_party <- as.party(j48)
head(model.frame(j48))
## Species log(Petal.Width) noise
## 1 setosa -1.6094379 -0.6264538
## 2 setosa -1.6094379 0.1836433
## 3 setosa -1.6094379 -0.8356286
## 4 setosa -1.6094379 1.5952808
## 5 setosa -1.6094379 0.3295078
## 6 setosa -0.9162907 -0.8204684
j48_party$data
## [1] Species log(Petal.Width) noise
## <0 rows> (or 0-length row.names)