【问题标题】:Caret and dummy variables插入符号和虚拟变量
【发布时间】:2016-07-25 02:16:57
【问题描述】:

在调用 caret 包的train 函数时,会自动转换数据,使所有因子变量都变成一组哑变量。

如何防止这种行为?是否可以说插入符号“不要将因子转换为虚拟变量”?

例如:

如果我对etitanic 数据运行rpart 算法:

library(caret)
library(earth)
data(etitanic)

etitanic$survived[etitanic$survived==1] <- 'YES'
etitanic$survived[etitanic$survived!='YES'] <- 'NO'

model<-train(survived~., data=etitanic, method='rpart')

那么最终生成的模型是这样的:

> model$finalModel
n= 1046 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 1046 427 NO (0.5917782 0.4082218)  
   2) sexmale>=0.5 658 135 NO (0.7948328 0.2051672)  
     4) age>=9.5 615 110 NO (0.8211382 0.1788618) *
     5) age< 9.5 43  18 YES (0.4186047 0.5813953)  
      10) sibsp>=2.5 16   1 NO (0.9375000 0.0625000) *
      11) sibsp< 2.5 27   3 YES (0.1111111 0.8888889) *
   3) sexmale< 0.5 388  96 YES (0.2474227 0.7525773) *

而如果我直接运行rpart 算法并构建一棵树,我会得到

> rpart(survived~., data=etitanic)
n= 1046 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 1046 427 NO (0.59177820 0.40822180)  
   2) sex=male 658 135 NO (0.79483283 0.20516717)  
     4) age>=9.5 615 110 NO (0.82113821 0.17886179) *
     5) age< 9.5 43  18 YES (0.41860465 0.58139535)  
      10) sibsp>=2.5 16   1 NO (0.93750000 0.06250000) *
      11) sibsp< 2.5 27   3 YES (0.11111111 0.88888889) *
   3) sex=female 388  96 YES (0.24742268 0.75257732)  
     6) pclass=3rd 152  72 NO (0.52631579 0.47368421)  
      12) age>=1.5 145  66 NO (0.54482759 0.45517241)  
        24) sibsp>=1.5 19   4 NO (0.78947368 0.21052632) *
        25) sibsp< 1.5 126  62 NO (0.50793651 0.49206349)  
          50) age>=27.5 44  15 NO (0.65909091 0.34090909) *
          51) age< 27.5 82  35 YES (0.42682927 0.57317073) *
      13) age< 1.5 7   1 YES (0.14285714 0.85714286) *
     7) pclass=1st,2nd 236  16 YES (0.06779661 0.93220339) *

现在,忘记树木不同的部分。我了解,它们是用不同的参数构建的。但是,它们也建立在不同的数据集之上。例如,插入符号树建立在其中一列是“性别”的数据集上,这是由原始数据中的 sex 列组成的虚拟列。

有没有办法告诉caret 在将数据提供给rpart 之前不要执行这个虚拟变量创建?

【问题讨论】:

  • 算法不太可能接受非数字变量,这就是因素/字符被编码为虚拟变量的原因。
  • @iboboboru 看我的例子。我的示例中的caret 包调用了一个 能够处理因素的函数。我想知道我能做些什么来确保这些因素能够进入内部电话会议。

标签: r r-caret


【解决方案1】:

为了使插入符号的行为与 rpart 首先完全一样,我将trainControl 函数设置为“none”,并将使用一条记录的 tuneGrid,cp 设置为 0.01。然后默认值与rpart 的默认值完全相同。

ctrl <- trainControl(method = "none")
#caret formula model
model<-train(survived ~ ., 
             data=etitanic, 
             method='rpart', 
             trControl = ctrl, 
             tuneGrid = expand.grid(cp = 0.01))

# rpart model
model_rp <- rpart(survived~., data=etitanic)

print(model$finalModel)

 1) root 1046 427 NO (0.59177820 0.40822180)  
   2) sexmale>=0.5 658 135 NO (0.79483283 0.20516717)  
     4) age>=9.5 615 110 NO (0.82113821 0.17886179) *
     5) age< 9.5 43  18 YES (0.41860465 0.58139535)  
      10) sibsp>=2.5 16   1 NO (0.93750000 0.06250000) *
      11) sibsp< 2.5 27   3 YES (0.11111111 0.88888889) *
   3) sexmale< 0.5 388  96 YES (0.24742268 0.75257732)  
     6) pclass3rd>=0.5 152  72 NO (0.52631579 0.47368421)  
      12) age>=1.5 145  66 NO (0.54482759 0.45517241)  
        24) sibsp>=1.5 19   4 NO (0.78947368 0.21052632) *
        25) sibsp< 1.5 126  62 NO (0.50793651 0.49206349)  
          50) age>=27.5 44  15 NO (0.65909091 0.34090909) *
          51) age< 27.5 82  35 YES (0.42682927 0.57317073) *
      13) age< 1.5 7   1 YES (0.14285714 0.85714286) *
     7) pclass3rd< 0.5 236  16 YES (0.06779661 0.93220339) *

print(model_rp)


 1) root 1046 427 NO (0.59177820 0.40822180)  
   2) sex=male 658 135 NO (0.79483283 0.20516717)  
     4) age>=9.5 615 110 NO (0.82113821 0.17886179) *
     5) age< 9.5 43  18 YES (0.41860465 0.58139535)  
      10) sibsp>=2.5 16   1 NO (0.93750000 0.06250000) *
      11) sibsp< 2.5 27   3 YES (0.11111111 0.88888889) *
   3) sex=female 388  96 YES (0.24742268 0.75257732)  
     6) pclass=3rd 152  72 NO (0.52631579 0.47368421)  
      12) age>=1.5 145  66 NO (0.54482759 0.45517241)  
        24) sibsp>=1.5 19   4 NO (0.78947368 0.21052632) *
        25) sibsp< 1.5 126  62 NO (0.50793651 0.49206349)  
          50) age>=27.5 44  15 NO (0.65909091 0.34090909) *
          51) age< 27.5 82  35 YES (0.42682927 0.57317073) *
      13) age< 1.5 7   1 YES (0.14285714 0.85714286) *
     7) pclass=1st,2nd 236  16 YES (0.06779661 0.93220339) *

查看这两个模型,您可以看到即使插入符号将因子和字符转换为具有默认类作为参考类,树也完全相同,节点中的百分比相同。您可以使用partykit 包并在模型上使用as.party() 以获得更好的布局。

但是如果你想在不使用因子的情况下拥有与 rpart 完全相同的模型,你可以使用默认的使用模型的方式。

#caret default model
model_xy <-train(x = etitanic[, -2], 
                 y = etitanic$survived, 
                 method='rpart', 
                 trControl = ctrl, 
                 tuneGrid = expand.grid(cp = 0.01))

print(model_xy$finalModel)

 1) root 1046 427 NO (0.59177820 0.40822180)  
   2) sex=male 658 135 NO (0.79483283 0.20516717)  
     4) age>=9.5 615 110 NO (0.82113821 0.17886179) *
     5) age< 9.5 43  18 YES (0.41860465 0.58139535)  
      10) sibsp>=2.5 16   1 NO (0.93750000 0.06250000) *
      11) sibsp< 2.5 27   3 YES (0.11111111 0.88888889) *
   3) sex=female 388  96 YES (0.24742268 0.75257732)  
     6) pclass=3rd 152  72 NO (0.52631579 0.47368421)  
      12) age>=1.5 145  66 NO (0.54482759 0.45517241)  
        24) sibsp>=1.5 19   4 NO (0.78947368 0.21052632) *
        25) sibsp< 1.5 126  62 NO (0.50793651 0.49206349)  
          50) age>=27.5 44  15 NO (0.65909091 0.34090909) *
          51) age< 27.5 82  35 YES (0.42682927 0.57317073) *
      13) age< 1.5 7   1 YES (0.14285714 0.85714286) *
     7) pclass=1st,2nd 236  16 YES (0.06779661 0.93220339) *

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多