randomForest中的R和因子变量



我有一个数据集,其中有一些连续变量,一些有序变量和一些分类定性变量。

我想使用随机森林分类器(我有一个分类结果),但我不确定如何处理序数和分类特征,它们目前都被编码为factor。我希望将顺序变量视为数字和定性变量,将每个级别视为单独的虚拟。R的randomForest通常如何处理factor特征?我应该把定性变量转换成假数,把序数转换成整数或数字吗?

通过引入允许"one-hot"的虚拟变量来编码因子。编码。k级别编码在k-1虚拟变量中。如何表示这些水平取决于你对"对比"的选择。设置。您可以使用contrasts进行测试,例如

> contrasts(iris$Species)
versicolor virginica
setosa              0         0
versicolor          1         0
virginica           0         1

将有序变量编码为因子从而增加了自由度,这可能是您想要的,也可能不是。如果您想保留有关级别排序的信息,我只需将序数变量编码为整数。

我不确定randomForest::randomForest()版本4.7-1.1通过使用"one-hot"创建虚拟变量来处理因子变量。编码。

如果我们看一下randomForest:::randomForest.default的源代码,有这段代码转换了x的特性表:

if (is.data.frame(x)) {
xlevels <- lapply(x, mylevels)
ncat <- sapply(xlevels, length)
ncat <- ifelse(sapply(x, is.ordered), 1, ncat)
x <- data.matrix(x)
if (testdat) {
if (!is.data.frame(xtest)) 
stop("xtest must be data frame if x is")
xfactor <- which(sapply(xtest, is.factor))
if (length(xfactor) > 0) {
for (i in xfactor) {
if (any(!levels(xtest[[i]]) %in% xlevels[[i]])) 
stop("New factor levels in xtest not present in x")
xtest[[i]] <- factor(xlevels[[i]][match(xtest[[i]], 
xlevels[[i]])], levels = xlevels[[i]])
}
}
xtest <- data.matrix(xtest)
}
}
else {
ncat <- rep(1, p)
names(ncat) <- colnames(x)
xlevels <- as.list(rep(0, p))
}

mylevels()函数是,根据randomForest:::mylevels:

function(x) if (is.factor(x)) levels(x) else 0

如果我理解正确,当测试数据提供给函数时使用if(testdat){}部分,它在这里是没有用的。那么,唯一改变x的代码是x <- data.matrix(x)

现在,如果我们使用一个示例数据集,假设数据框为iris,并在其上使用data.matrix(),我们得到:

data.matrix(iris)
#>        Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#>   [1,]          5.1         3.5          1.4         0.2       1
#>   [2,]          4.9         3.0          1.4         0.2       1
#>   [3,]          4.7         3.2          1.3         0.2       1
#>   [4,]          4.6         3.1          1.5         0.2       1
#>   [5,]          5.0         3.6          1.4         0.2       1
#>   [6,]          5.4         3.9          1.7         0.4       1
#>   [7,]          4.6         3.4          1.4         0.3       1
#>   [8,]          5.0         3.4          1.5         0.2       1
#>   [9,]          4.4         2.9          1.4         0.2       1
#>  [10,]          4.9         3.1          1.5         0.1       1
#>  [11,]          5.4         3.7          1.5         0.2       1
#>  [12,]          4.8         3.4          1.6         0.2       1
#>  [13,]          4.8         3.0          1.4         0.1       1
#>  [14,]          4.3         3.0          1.1         0.1       1
#>  [15,]          5.8         4.0          1.2         0.2       1
#>  [16,]          5.7         4.4          1.5         0.4       1
#>  [17,]          5.4         3.9          1.3         0.4       1
#>  [18,]          5.1         3.5          1.4         0.3       1
#>  [19,]          5.7         3.8          1.7         0.3       1
#>  [20,]          5.1         3.8          1.5         0.3       1
#>  [21,]          5.4         3.4          1.7         0.2       1
#>  [22,]          5.1         3.7          1.5         0.4       1
#>  [23,]          4.6         3.6          1.0         0.2       1
#>  [24,]          5.1         3.3          1.7         0.5       1
#>  [25,]          4.8         3.4          1.9         0.2       1
#>  [26,]          5.0         3.0          1.6         0.2       1
#>  [27,]          5.0         3.4          1.6         0.4       1
#>  [28,]          5.2         3.5          1.5         0.2       1
#>  [29,]          5.2         3.4          1.4         0.2       1
#>  [30,]          4.7         3.2          1.6         0.2       1
#>  [31,]          4.8         3.1          1.6         0.2       1
#>  [32,]          5.4         3.4          1.5         0.4       1
#>  [33,]          5.2         4.1          1.5         0.1       1
#>  [34,]          5.5         4.2          1.4         0.2       1
#>  [35,]          4.9         3.1          1.5         0.2       1
#>  [36,]          5.0         3.2          1.2         0.2       1
#>  [37,]          5.5         3.5          1.3         0.2       1
#>  [38,]          4.9         3.6          1.4         0.1       1
#>  [39,]          4.4         3.0          1.3         0.2       1
#>  [40,]          5.1         3.4          1.5         0.2       1
#>  [41,]          5.0         3.5          1.3         0.3       1
#>  [42,]          4.5         2.3          1.3         0.3       1
#>  [43,]          4.4         3.2          1.3         0.2       1
#>  [44,]          5.0         3.5          1.6         0.6       1
#>  [45,]          5.1         3.8          1.9         0.4       1
#>  [46,]          4.8         3.0          1.4         0.3       1
#>  [47,]          5.1         3.8          1.6         0.2       1
#>  [48,]          4.6         3.2          1.4         0.2       1
#>  [49,]          5.3         3.7          1.5         0.2       1
#>  [50,]          5.0         3.3          1.4         0.2       1
#>  [51,]          7.0         3.2          4.7         1.4       2
#>  [52,]          6.4         3.2          4.5         1.5       2
#>  [53,]          6.9         3.1          4.9         1.5       2
#>  [54,]          5.5         2.3          4.0         1.3       2
#>  [55,]          6.5         2.8          4.6         1.5       2
#>  [56,]          5.7         2.8          4.5         1.3       2
#>  [57,]          6.3         3.3          4.7         1.6       2
#>  [58,]          4.9         2.4          3.3         1.0       2
#>  [59,]          6.6         2.9          4.6         1.3       2
#>  [60,]          5.2         2.7          3.9         1.4       2
#>  [61,]          5.0         2.0          3.5         1.0       2
#>  [62,]          5.9         3.0          4.2         1.5       2
#>  [63,]          6.0         2.2          4.0         1.0       2
#>  [64,]          6.1         2.9          4.7         1.4       2
#>  [65,]          5.6         2.9          3.6         1.3       2
#>  [66,]          6.7         3.1          4.4         1.4       2
#>  [67,]          5.6         3.0          4.5         1.5       2
#>  [68,]          5.8         2.7          4.1         1.0       2
#>  [69,]          6.2         2.2          4.5         1.5       2
#>  [70,]          5.6         2.5          3.9         1.1       2
#>  [71,]          5.9         3.2          4.8         1.8       2
#>  [72,]          6.1         2.8          4.0         1.3       2
#>  [73,]          6.3         2.5          4.9         1.5       2
#>  [74,]          6.1         2.8          4.7         1.2       2
#>  [75,]          6.4         2.9          4.3         1.3       2
#>  [76,]          6.6         3.0          4.4         1.4       2
#>  [77,]          6.8         2.8          4.8         1.4       2
#>  [78,]          6.7         3.0          5.0         1.7       2
#>  [79,]          6.0         2.9          4.5         1.5       2
#>  [80,]          5.7         2.6          3.5         1.0       2
#>  [81,]          5.5         2.4          3.8         1.1       2
#>  [82,]          5.5         2.4          3.7         1.0       2
#>  [83,]          5.8         2.7          3.9         1.2       2
#>  [84,]          6.0         2.7          5.1         1.6       2
#>  [85,]          5.4         3.0          4.5         1.5       2
#>  [86,]          6.0         3.4          4.5         1.6       2
#>  [87,]          6.7         3.1          4.7         1.5       2
#>  [88,]          6.3         2.3          4.4         1.3       2
#>  [89,]          5.6         3.0          4.1         1.3       2
#>  [90,]          5.5         2.5          4.0         1.3       2
#>  [91,]          5.5         2.6          4.4         1.2       2
#>  [92,]          6.1         3.0          4.6         1.4       2
#>  [93,]          5.8         2.6          4.0         1.2       2
#>  [94,]          5.0         2.3          3.3         1.0       2
#>  [95,]          5.6         2.7          4.2         1.3       2
#>  [96,]          5.7         3.0          4.2         1.2       2
#>  [97,]          5.7         2.9          4.2         1.3       2
#>  [98,]          6.2         2.9          4.3         1.3       2
#>  [99,]          5.1         2.5          3.0         1.1       2
#> [100,]          5.7         2.8          4.1         1.3       2
#> [101,]          6.3         3.3          6.0         2.5       3
#> [102,]          5.8         2.7          5.1         1.9       3
#> [103,]          7.1         3.0          5.9         2.1       3
#> [104,]          6.3         2.9          5.6         1.8       3
#> [105,]          6.5         3.0          5.8         2.2       3
#> [106,]          7.6         3.0          6.6         2.1       3
#> [107,]          4.9         2.5          4.5         1.7       3
#> [108,]          7.3         2.9          6.3         1.8       3
#> [109,]          6.7         2.5          5.8         1.8       3
#> [110,]          7.2         3.6          6.1         2.5       3
#> [111,]          6.5         3.2          5.1         2.0       3
#> [112,]          6.4         2.7          5.3         1.9       3
#> [113,]          6.8         3.0          5.5         2.1       3
#> [114,]          5.7         2.5          5.0         2.0       3
#> [115,]          5.8         2.8          5.1         2.4       3
#> [116,]          6.4         3.2          5.3         2.3       3
#> [117,]          6.5         3.0          5.5         1.8       3
#> [118,]          7.7         3.8          6.7         2.2       3
#> [119,]          7.7         2.6          6.9         2.3       3
#> [120,]          6.0         2.2          5.0         1.5       3
#> [121,]          6.9         3.2          5.7         2.3       3
#> [122,]          5.6         2.8          4.9         2.0       3
#> [123,]          7.7         2.8          6.7         2.0       3
#> [124,]          6.3         2.7          4.9         1.8       3
#> [125,]          6.7         3.3          5.7         2.1       3
#> [126,]          7.2         3.2          6.0         1.8       3
#> [127,]          6.2         2.8          4.8         1.8       3
#> [128,]          6.1         3.0          4.9         1.8       3
#> [129,]          6.4         2.8          5.6         2.1       3
#> [130,]          7.2         3.0          5.8         1.6       3
#> [131,]          7.4         2.8          6.1         1.9       3
#> [132,]          7.9         3.8          6.4         2.0       3
#> [133,]          6.4         2.8          5.6         2.2       3
#> [134,]          6.3         2.8          5.1         1.5       3
#> [135,]          6.1         2.6          5.6         1.4       3
#> [136,]          7.7         3.0          6.1         2.3       3
#> [137,]          6.3         3.4          5.6         2.4       3
#> [138,]          6.4         3.1          5.5         1.8       3
#> [139,]          6.0         3.0          4.8         1.8       3
#> [140,]          6.9         3.1          5.4         2.1       3
#> [141,]          6.7         3.1          5.6         2.4       3
#> [142,]          6.9         3.1          5.1         2.3       3
#> [143,]          5.8         2.7          5.1         1.9       3
#> [144,]          6.8         3.2          5.9         2.3       3
#> [145,]          6.7         3.3          5.7         2.5       3
#> [146,]          6.7         3.0          5.2         2.3       3
#> [147,]          6.3         2.5          5.0         1.9       3
#> [148,]          6.5         3.0          5.2         2.0       3
#> [149,]          6.2         3.4          5.4         2.3       3
#> [150,]          5.9         3.0          5.1         1.8       3

因此,因子变量Species使用因子级别的数字转换为数字。之后,该函数使用t(x),但这是初始数据的最后一次转换。

如果使用了热编码,我希望出现这样的结构:

model.matrix(~0+iris[,'Species'])
#>     iris[, "Species"]setosa iris[, "Species"]versicolor
#> 1                         1                           0
#> 2                         1                           0
#> 3                         1                           0
#> 4                         1                           0
#> 5                         1                           0
#> 6                         1                           0
#> 7                         1                           0
#> 8                         1                           0
#> 9                         1                           0
#> 10                        1                           0
#> 11                        1                           0
#> 12                        1                           0
#> 13                        1                           0
#> 14                        1                           0
#> 15                        1                           0
#> 16                        1                           0
#> 17                        1                           0
#> 18                        1                           0
#> 19                        1                           0
#> 20                        1                           0
#> 21                        1                           0
#> 22                        1                           0
#> 23                        1                           0
#> 24                        1                           0
#> 25                        1                           0
#> 26                        1                           0
#> 27                        1                           0
#> 28                        1                           0
#> 29                        1                           0
#> 30                        1                           0
#> 31                        1                           0
#> 32                        1                           0
#> 33                        1                           0
#> 34                        1                           0
#> 35                        1                           0
#> 36                        1                           0
#> 37                        1                           0
#> 38                        1                           0
#> 39                        1                           0
#> 40                        1                           0
#> 41                        1                           0
#> 42                        1                           0
#> 43                        1                           0
#> 44                        1                           0
#> 45                        1                           0
#> 46                        1                           0
#> 47                        1                           0
#> 48                        1                           0
#> 49                        1                           0
#> 50                        1                           0
#> 51                        0                           1
#> 52                        0                           1
#> 53                        0                           1
#> 54                        0                           1
#> 55                        0                           1
#> 56                        0                           1
#> 57                        0                           1
#> 58                        0                           1
#> 59                        0                           1
#> 60                        0                           1
#> 61                        0                           1
#> 62                        0                           1
#> 63                        0                           1
#> 64                        0                           1
#> 65                        0                           1
#> 66                        0                           1
#> 67                        0                           1
#> 68                        0                           1
#> 69                        0                           1
#> 70                        0                           1
#> 71                        0                           1
#> 72                        0                           1
#> 73                        0                           1
#> 74                        0                           1
#> 75                        0                           1
#> 76                        0                           1
#> 77                        0                           1
#> 78                        0                           1
#> 79                        0                           1
#> 80                        0                           1
#> 81                        0                           1
#> 82                        0                           1
#> 83                        0                           1
#> 84                        0                           1
#> 85                        0                           1
#> 86                        0                           1
#> 87                        0                           1
#> 88                        0                           1
#> 89                        0                           1
#> 90                        0                           1
#> 91                        0                           1
#> 92                        0                           1
#> 93                        0                           1
#> 94                        0                           1
#> 95                        0                           1
#> 96                        0                           1
#> 97                        0                           1
#> 98                        0                           1
#> 99                        0                           1
#> 100                       0                           1
#> 101                       0                           0
#> 102                       0                           0
#> 103                       0                           0
#> 104                       0                           0
#> 105                       0                           0
#> 106                       0                           0
#> 107                       0                           0
#> 108                       0                           0
#> 109                       0                           0
#> 110                       0                           0
#> 111                       0                           0
#> 112                       0                           0
#> 113                       0                           0
#> 114                       0                           0
#> 115                       0                           0
#> 116                       0                           0
#> 117                       0                           0
#> 118                       0                           0
#> 119                       0                           0
#> 120                       0                           0
#> 121                       0                           0
#> 122                       0                           0
#> 123                       0                           0
#> 124                       0                           0
#> 125                       0                           0
#> 126                       0                           0
#> 127                       0                           0
#> 128                       0                           0
#> 129                       0                           0
#> 130                       0                           0
#> 131                       0                           0
#> 132                       0                           0
#> 133                       0                           0
#> 134                       0                           0
#> 135                       0                           0
#> 136                       0                           0
#> 137                       0                           0
#> 138                       0                           0
#> 139                       0                           0
#> 140                       0                           0
#> 141                       0                           0
#> 142                       0                           0
#> 143                       0                           0
#> 144                       0                           0
#> 145                       0                           0
#> 146                       0                           0
#> 147                       0                           0
#> 148                       0                           0
#> 149                       0                           0
#> 150                       0                           0
#>     iris[, "Species"]virginica
#> 1                            0
#> 2                            0
#> 3                            0
#> 4                            0
#> 5                            0
#> 6                            0
#> 7                            0
#> 8                            0
#> 9                            0
#> 10                           0
#> 11                           0
#> 12                           0
#> 13                           0
#> 14                           0
#> 15                           0
#> 16                           0
#> 17                           0
#> 18                           0
#> 19                           0
#> 20                           0
#> 21                           0
#> 22                           0
#> 23                           0
#> 24                           0
#> 25                           0
#> 26                           0
#> 27                           0
#> 28                           0
#> 29                           0
#> 30                           0
#> 31                           0
#> 32                           0
#> 33                           0
#> 34                           0
#> 35                           0
#> 36                           0
#> 37                           0
#> 38                           0
#> 39                           0
#> 40                           0
#> 41                           0
#> 42                           0
#> 43                           0
#> 44                           0
#> 45                           0
#> 46                           0
#> 47                           0
#> 48                           0
#> 49                           0
#> 50                           0
#> 51                           0
#> 52                           0
#> 53                           0
#> 54                           0
#> 55                           0
#> 56                           0
#> 57                           0
#> 58                           0
#> 59                           0
#> 60                           0
#> 61                           0
#> 62                           0
#> 63                           0
#> 64                           0
#> 65                           0
#> 66                           0
#> 67                           0
#> 68                           0
#> 69                           0
#> 70                           0
#> 71                           0
#> 72                           0
#> 73                           0
#> 74                           0
#> 75                           0
#> 76                           0
#> 77                           0
#> 78                           0
#> 79                           0
#> 80                           0
#> 81                           0
#> 82                           0
#> 83                           0
#> 84                           0
#> 85                           0
#> 86                           0
#> 87                           0
#> 88                           0
#> 89                           0
#> 90                           0
#> 91                           0
#> 92                           0
#> 93                           0
#> 94                           0
#> 95                           0
#> 96                           0
#> 97                           0
#> 98                           0
#> 99                           0
#> 100                          0
#> 101                          1
#> 102                          1
#> 103                          1
#> 104                          1
#> 105                          1
#> 106                          1
#> 107                          1
#> 108                          1
#> 109                          1
#> 110                          1
#> 111                          1
#> 112                          1
#> 113                          1
#> 114                          1
#> 115                          1
#> 116                          1
#> 117                          1
#> 118                          1
#> 119                          1
#> 120                          1
#> 121                          1
#> 122                          1
#> 123                          1
#> 124                          1
#> 125                          1
#> 126                          1
#> 127                          1
#> 128                          1
#> 129                          1
#> 130                          1
#> 131                          1
#> 132                          1
#> 133                          1
#> 134                          1
#> 135                          1
#> 136                          1
#> 137                          1
#> 138                          1
#> 139                          1
#> 140                          1
#> 141                          1
#> 142                          1
#> 143                          1
#> 144                          1
#> 145                          1
#> 146                          1
#> 147                          1
#> 148                          1
#> 149                          1
#> 150                          1
#> attr(,"assign")
#> [1] 1 1 1
#> attr(,"contrasts")
#> attr(,"contrasts")$`iris[, "Species"]`
#> [1] "contr.treatment"
如果我理解错了,请告诉我!

最新更新