解释在插入符号列中创建的虚拟变量

时间:2017-03-17 12:47:27

标签: r r-caret

通过阅读各种答案123,我了解到来自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是什么意思?

2 个答案:

答案 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