【问题标题】:variable encoding in K-fold validation of random forest using package 'caret'使用包“caret”对随机森林进行 K 折验证中的变量编码
【发布时间】:2021-02-06 06:09:29
【问题描述】:

我想运行一个 RF 分类,就像它在“randomForest”中指定的那样,但仍然使用 k 折重复交叉验证方法(下面的代码)。如何阻止插入符号从我的分类变量中创建虚拟变量?我读到这可能是由于 One-Hot-Encoding,但不知道如何改变它。对于如何解决此问题的一些示例行,我将非常感激!

数据库:

> 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.

【问题讨论】:

    标签: r random-forest r-caret one-hot-encoding k-fold


    【解决方案1】:

    当你使用公式界面训练时:

    train(stat_bino ~ ., 
          ...
    

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

    但是如果你使用非公式接口:

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

    然后插入符号将在提供变量时保留它们。这正是基于树的方法所需要的,但它会在无法在内部处理诸如glmnet 等因素的算法中产生错误。

    【讨论】:

    • 谢谢!但是,现在当我尝试制作部分依赖图(使用包 pdp)时,我得到: eval(stats::getCall(object)$data) 中的错误:..1 在不正确的上下文中使用,没有...查看
    • 也许最好发布另一个问题,因为这个问题似乎与手头的问题无关。
    猜你喜欢
    • 2018-06-14
    • 2021-06-05
    • 2021-06-17
    • 1970-01-01
    • 2017-08-13
    • 2015-05-10
    • 2021-07-30
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多