首页 > 解决方案 > R树不使用所有变量(为什么?)

问题描述

嗨,我正在研究决策树。

tree1=tree(League.binary~TME.factor+APM.factor+Wmd.factor,starcraft)

该树显示了仅基于 APM.factor 的分区,并且叶子不是纯的。这是一个屏幕截图:

在此处输入图像描述

我尝试用 3395 个观测值中的 300 个子集创建一棵树,它使用了多个变量。第一种情况出了什么问题?它不需要额外的两个变量,所以它只使用一个吗?

标签: rtree

解决方案


尝试使用 tree.control() 参数,例如设置 minsize=1 以便最终在每个叶子中得到一个观察结果(过拟合),例如:

model = tree(y ~ X1 + X2, data = data, control = tree.control(nobs=n, minsize = 2, mindev=0))

另外,用 rpart 包尝试同样的事情,看看你得到了什么结果,这是树的“新”版本。您还可以绘制变量的重要性。这是一个语法示例:

install.packages("rpart")
install.packages("rpart.plot")
library(rpart)
library(rpart.plot)

## fit tree
### alt1: class
model = rpart(y ~ X1 + X2, data=data, method = "class")
### alt2: reg
model = rpart(y ~ X1 + X2, data=data, control = rpart.control(maxdepth = 30, minsplit = 1, minbucket = 1, cp=0))

## show model
print(model)
rpart.plot(model, cex=0.5)

## importance
model$variable.importance

请注意,由于树进行二元拆分,因此单个变量可能解释了大部分/所有 SSR(用于回归)。尝试绘制每个回归量的响应,看看除了你得到的变量之外是否有任何重要的关系。


如果你想运行上面的例子,这里有一个数据模拟(把它放在代码的开头):

n  = 12000
X1 = runif(n, -100, 100)
X2 = runif(n, -100, 100)

## 1. SQUARE DATA
# y  = ifelse( (X1< -50) | (X1>50) | (X2< -50) | (X2>50), 1, 0)

## 2. CIRCLE DATA
 y  = ifelse(sqrt(X1^2+X2^2)<=50, 0, 1)

## 3. LINEAR BOUNDARY DATA
# y  = ifelse(X2<=-X1, 0, 1)

# Create
color = ifelse(y==0,"red","green")
data = data.frame(y,X1,X2,color)

# Plot
data$color = data$color %>% as.character()
plot(data$X2 ~ data$X1, col = data$color, type='p', pch=15)

推荐阅读