r - R树不使用所有变量(为什么?)
问题描述
嗨,我正在研究决策树。
tree1=tree(League.binary~TME.factor+APM.factor+Wmd.factor,starcraft)
该树显示了仅基于 APM.factor 的分区,并且叶子不是纯的。这是一个屏幕截图:
我尝试用 3395 个观测值中的 300 个子集创建一棵树,它使用了多个变量。第一种情况出了什么问题?它不需要额外的两个变量,所以它只使用一个吗?
解决方案
尝试使用 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)
推荐阅读
- jquery - jquery DateTimePicker maxDate 不更新
- azure - Azure 应用程序配置:在 arm 模板中获取 PrimaryKey
- php - 上传 CSV 文件并检查值是否为空以将其设置为 = 0 php
- ios - 从枚举中获取关联类型对象,无需切换
- c++ - 在 Visual Studio C++ 2017 中链接 libjpeg-turbo 需要包含哪些文件
- fortran - gfortran -std=f2008 如果调用 fseek 存在编译标志错误
- javascript - Chrome 扩展设置 httpOnly cookie 不起作用
- javascript - 使用ngrx效果时避免多次请求
- jquery - 如何在这个 jQuery 代码段中添加自定义的缓动函数而不获取所有的 jQueryUI?
- javascript - Django + JQuery - 交互式甘特图