微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用“插入符”包对随机森林进行K折验证的变量编码

如何解决使用“插入符”包对随机森林进行K折验证的变量编码

我想像在“ randomForest”中指定的那样运行RF分类,但仍使用k折重复交叉验证方法(下面的代码)。如何阻止尖号从类别变量中创建伪变量?我读到这可能是由于“一键编码”造成的,但不确定如何更改。对于解决此问题的示例行,我将非常感激!

数据库

> str(river)
'data.frame':   121 obs. of  13 variables:
 $ stat_bino     : Factor w/ 2 levels "0","1": 2 2 1 1 2 2 2 2 2 2 ...
 $ Subfamily     : Factor w/ 14 levels "carettochelyinae",..: 14 14 14 14 8 8 8 8 8 8 ...
 $ MAXCL         : num  850 850 360 540 625 600 760 480 560 580 ...
 $ CS            : num  8 8 14 15 26 25.5 20 20 18 21.5 ...
 $ CF            : num  3.5 3.5 2.5 2 1.5 3 2 2 1 1 ...
 $ size_mat      : num  300 300 170 180 450 450 460 406 433 433 ...
 $ incubat       : num  97.5 97.5 71 72.5 91.5 67.5 73 55 83 80 ...
 $ diet          : Factor w/ 5 levels "omnivore leaning carnivore",..: 1 1 1 1 2 2 2 5 4 4 ...
 $ HDI           : num  721 627 878 885 704 ...
 $ HF09M93       : num  23.19 9.96 -8.52 -5.67 27.3 ...
 $ HF09          : num  116 121 110 110 152 ...
 $ deg_reg       : num  8.64 39.37 370.95 314.8 32.99 ...
 $ protected_area: num  7.55 10.93 2.84 2.89 12.71 …

其余:

> control <- trainControl(method='repeatedcv',+                         number=5,repeats = 3,+                         search='grid') 

> tunegrid <- expand.grid(.mtry = (1:12)) 

> rf_gridsearch <- train(stat_bino ~ .,+                        data = river,+                        method = 'rf',+                        metric = 'Accuracy',+                        ntree = 600,+                        importance = TRUE,+                        tuneGrid = tunegrid,trControl = control) 

> rf_gridsearch$finalModel[["xNames"]]
 [1] "Subfamilychelinae"              "Subfamilychelodininae"          "Subfamilychelydrinae"          
 [4] "Subfamilycyclanorbinae"         "Subfamilydeirochelyinae"        "Subfamilydermatemydinae"       
 [7] "Subfamilygeoemydinae"           "Subfamilykinosterninae"         "Subfamilypelomedusinae"        
                   
...you get the picture. I Now have 27 predictors instead of 12.

解决方法

使用公式界面进行训练时:

train(stat_bino ~ .,...

它将使用伪编码转换因子。这是有道理的,因为大多数传统R函数中的公式都是以这种方式工作的(例如lm)。

但是,如果您使用非公式界面:

train(y = river$stat_bino,x = river[,colnames(river) != "stat_bino"],...

然后插入符号将保留变量,直到它们被补齐。这是基于树的方法所需要的,但是使用无法内部处理诸如glmnet之类的因素的算法,则会产生错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。