我有一个包含一些连续变量,一些有序变量和一些分类定性变量的数据集。我想使用随机森林分类器(我有一个分类结果),但我不确定如何对待序数和分类特征这两个变量目前都被编码为factor。我希望序数变量被认为是数值变量,定性变量将每个水平作为单独的虚拟变量。R的randomForest通常如何处理factor特征?我是否应该将定性变量转换为虚拟变量,将序数变量转换为整数或数值?
factor
randomForest
ni65a41a1#
因子通过引入允许“独热”编码的虚拟变量进行编码。k 个水平编码在 k-1 个虚拟变量中。这些变量如何表示水平取决于您选择的“对比度”设置。您可以使用contrasts进行测试,例如:
contrasts
> contrasts(iris$Species) versicolor virginica setosa 0 0 versicolor 1 0 virginica 0 1
因此,将序数变量编码为因子增加了自由度,这可能是也可能不是你想要的。如果你想保留关于水平排序的信息,我只会将序数变量编码为整数。
68de4m5k2#
我不确定randomForest::randomForest()版本4.7-1.1是否通过使用“one-hot”编码创建虚拟变量来处理因子变量。如果我们看一下randomForest:::randomForest.default的源代码,有一段代码转换了x的特征表:
randomForest::randomForest()
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)) }
根据randomForest:::mylevels,mylevels()函数是:
randomForest:::mylevels
mylevels()
function(x) if (is.factor(x)) levels(x) else 0
如果我理解正确的话,if(testdat){}部分是在向函数提供测试数据时使用的,它在这里没有用。现在,如果我们使用一个示例数据集,比如 Dataframe iris,并在其上使用data.matrix(),我们得到:
if(testdat){}
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),但这是初始数据的最后一次转换。如果使用一个热编码,我希望出现以下结构:
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"
如果我理解错了请告诉我!
2条答案
按热度按时间ni65a41a1#
因子通过引入允许“独热”编码的虚拟变量进行编码。k 个水平编码在 k-1 个虚拟变量中。这些变量如何表示水平取决于您选择的“对比度”设置。您可以使用
contrasts
进行测试,例如:因此,将序数变量编码为因子增加了自由度,这可能是也可能不是你想要的。如果你想保留关于水平排序的信息,我只会将序数变量编码为整数。
68de4m5k2#
我不确定
randomForest::randomForest()
版本4.7-1.1是否通过使用“one-hot”编码创建虚拟变量来处理因子变量。如果我们看一下
randomForest:::randomForest.default
的源代码,有一段代码转换了x
的特征表:根据
randomForest:::mylevels
,mylevels()
函数是:如果我理解正确的话,
if(testdat){}
部分是在向函数提供测试数据时使用的,它在这里没有用。现在,如果我们使用一个示例数据集,比如 Dataframe
iris
,并在其上使用data.matrix()
,我们得到:因此,因子变量
Species
使用因子水平的数字转换为数值。稍后,函数使用t(x)
,但这是初始数据的最后一次转换。如果使用一个热编码,我希望出现以下结构:
如果我理解错了请告诉我!