Я изучаю рекурсивное разбиение с помощью rpart. Насколько я понимаю из документации, rpart (реализация CART) должна выбрать переменную разделения и точку разделения, которая минимизирует среднеквадратическую ошибку в двух дочерних узлах. В ходе некоторых экспериментов я обнаружил, что это не всегда имеет место в дереве, выведенном rpart. Я приложил код R ниже, который иллюстрирует мою точку зрения.
library(MASS)
library(rpart)
### Defining the dataset
n <- 80
p <- 9
set.seed(123)
X <- mvrnorm(n, mu=1:p, Sigma = 4*diag(rep(1,p)))
y <- rnorm(n, mean=0, sd=11)
### Illustrating the rpart issue
### With this random seed, a one-level tree with rpart suggests splitting on variable
## 4 at cut point 4.19
print(rpart(y~X, control=rpart.control(minsplit=n)))
### Just brute force looking for best split suggests that ths minimim SSE
### occurs if we split at 1st variable at 3.88
minSSE <- Inf
minsplit = NA
for (j in 1:p) {
for (s in 1:(n-1)) {
xjs <- sort(X[,j])[s]
left <-y[X[,j] <= xjs]
right <- y[X[,j] > xjs]
SSE <- sum((left- mean(left))^2) + sum((right - mean(right))^2)
if (SSE < minSSE) {
minsplit = c(j,xjs)
minSSE <- SSE
}
}
}
print(minsplit)
Кто-нибудь знает, что это за сделка? Я неправильно понимаю документацию rpart? Есть ли какая-то процедура приближения, которую использует rpart? Кто-нибудь еще сталкивался с подобной проблемой?
Спасибо!