通过阅读各种答案1,2,3,我了解到来自train
的{{1}}函数将创建虚拟变量来处理因素有多个级别。
以下是使用caret
的示例(模型除了显示点之外没用):
mtcars
我不明白这部分library(caret)
library(rattle)
df <- mtcars
df$cyl <- factor(df$cyl)
df$mpg_bound <- ifelse(df$mpg > 20, "good", "bad")
tc <- trainControl(classProbs = TRUE, summaryFunction = twoClassSummary)
mod <- as.formula(mpg_bound ~ cyl)
set.seed(666)
m1 <- train(mod, data = df,
method = "rpart",
preProcess = c("center", "scale"),
trControl = tc)
fancyRpartPlot(m1$finalModel)
m1$finalModel
n= 32
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 32 14 bad (0.5625000 0.4375000)
2) cyl8>=0.124004 14 0 bad (1.0000000 0.0000000) *
3) cyl8< 0.124004 18 4 good (0.2222222 0.7777778) *
。我得到cyl8>=0.124004
是因子的虚拟变量,但cyl8
是什么意思?
答案 0 :(得分:1)
我认为这个值代表基于虚拟变尺度(0-1)的分裂点。此代码产生相同的结果:
df = mtcars
df$cyl <- factor(df$cyl)
df$mpg_bound <- ifelse(df$mpg > 20, "good", "bad")
tc <- trainControl(classProbs = TRUE, summaryFunction = twoClassSummary)
data = cbind(df,model.matrix(~cyl+mpg_bound,df)) # binds the dummy transf to the data
mod <- as.formula(mpg_bound ~ cyl8)
m1 <- train(mod, data = data,
method = "rpart",
preProcess = c("center", "scale"),
trControl = tc)
m1$finalModel
直接运行rpart代码(包括原始比例)可能更容易,但这可能不允许您指定您使用的功能。例如
rpart(mpg_bound~cyl,data=df,method="class")
答案 1 :(得分:1)
我想扩展现有的答案,因为我不认为评论中得出的结论是正确的。正如你所说,当使用公式界面时,插入符号的列车功能会将因子变量转换为仅采用值0或1的虚拟变量,例如, cyl8 == 1表示汽车有8个汽缸&#39;。每个虚拟变量都会对观察的真实或错误特征做出声明
然而,Rpart将输出一个数值作为分割标准,因此cyl8> = 0.5,cyl8> = 0.2和cyl8 == 1都意味着相同的事情&#34;这辆车恰好有8个气缸&#34;。默认情况下,rpart将为二进制虚拟对象选择分割值cyl8&gt; = 0.5以指示虚拟对象为真。那么cyl8 >= 0.5
的解释是&#34;汽车是否有8个汽缸?&#34; (并且不&#34;汽车是否有超过8个汽缸?&#34;)
df <- mtcars
df$cyl <- factor(df$cyl)
df$mpg_bound <- ifelse(df$mpg > 20, "good", "bad")
library(caret)
tc <- trainControl(classProbs = TRUE, summaryFunction = twoClassSummary)
set.seed(166)
m1 <- train(mod, data = df,
method = "rpart",
#preProcess = c("center", "scale"),
trControl = tc,
metric = "ROC")
m1$finalModel
#1) root 32 14 bad (0.5625000 0.4375000)
#2) cyl8>=0.5 14 0 bad (1.0000000 0.0000000) *
#3) cyl8< 0.5 18 4 good (0.2222222 0.7777778) *
示例中的混淆值是由于插入显然将preProcessing应用于扩展数据集,其中虚拟变量是数字变量。解释保持不变,但(任意)拆分值被转换。
# Transform to dummies
mm <- model.matrix(mpg_bound ~ .-1, data = df)
# Do pre-processing
pp <- preProcess(mm, method = c("center", "scale"))
mm.pp <- as.matrix(predict(pp, mm))
# Dummy-Split in the middle
(max(mm.pp[,"cyl8"]) + min(mm.pp[,"cyl8"]) ) / 2