我有一个数据集,其中有一些连续变量,一些有序变量和一些分类定性变量。
我想使用随机森林分类器(我有一个分类结果),但我不确定如何处理序数和分类特征,它们目前都被编码为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"
如果我理解错了,请告诉我!