如何从 R 中的 randomForest 预测函数按类别对选票求和?
How can I sum votes by category from the randomForest predict function in R?
此示例代码创建了一个数据框,其初始列代表来自 10 棵树的多数票。接下来的 10 列包含模型中每棵树的分类投票。我想创建一个图表来显示每一行的投票分布。最好的方法是什么?
library(tidyverse)
library(caret)
library(randomForest)
train_index_cars <- as.vector(createDataPartition(mtcars[['cyl']],p=.8,list=FALSE,times=1))
mytrain <- mtcars[train_index_cars, ]
mytest <- mtcars[-train_index_cars, ]
car_forest <- randomForest(factor(cyl) ~., data= mytrain, ntree = 10, predict.all = T)
cartest_predicted <- as.data.frame(predict(car_forest, newdata = mytest, predict.all = TRUE))
cartest_predicted
中 Merc 280 行的输出看起来像这样(不包括最后 6 棵树)
id
aggregrate
individual.1
individual.2
individual.3
individual.4
Merc 280
6
6
8
6
4
我想在每一行中添加三列,其中包含树中每个类别(4、6、8)的投票计数。我正在设想这样的输出:
individual.10
Votes_4
Votes_6
Votes_8
6
2
7
1
按条件对跨行的列求和的最佳方法是什么?我似乎无法在那里找到我真正需要的东西。此输出是否已作为 randomForest 包的一部分存在,而我只是忽略了它?
这应该有效:
# Defining temporarily function, to be passed within apply().
temp.fun = function(x) sum(x == i)
for (i in unique(cartest_predicted$aggregate)) # Iterating over possible votes.
{
i = as.integer(i)
cartest_predicted$temp = apply(cartest_predicted[, -1], MARGIN = 1, temp.fun) # Requested results.
colnames(cartest_predicted)[dim(cartest_predicted)[[2]]] = paste("Votes", i, sep = "_") # Renaming new column.
}
需要 for
循环来迭代树可以投出的所有可能的选票。创建一个临时函数来为每个 i
执行您需要的操作,即为每个可能的投票。然后在 apply()
中使用这样的函数来应用于 cartest_predict
的每一行(注意 MARGIN = 1
)。最后,paste
用于重命名列。
此示例代码创建了一个数据框,其初始列代表来自 10 棵树的多数票。接下来的 10 列包含模型中每棵树的分类投票。我想创建一个图表来显示每一行的投票分布。最好的方法是什么?
library(tidyverse)
library(caret)
library(randomForest)
train_index_cars <- as.vector(createDataPartition(mtcars[['cyl']],p=.8,list=FALSE,times=1))
mytrain <- mtcars[train_index_cars, ]
mytest <- mtcars[-train_index_cars, ]
car_forest <- randomForest(factor(cyl) ~., data= mytrain, ntree = 10, predict.all = T)
cartest_predicted <- as.data.frame(predict(car_forest, newdata = mytest, predict.all = TRUE))
cartest_predicted
中 Merc 280 行的输出看起来像这样(不包括最后 6 棵树)
id | aggregrate | individual.1 | individual.2 | individual.3 | individual.4 |
---|---|---|---|---|---|
Merc 280 | 6 | 6 | 8 | 6 | 4 |
我想在每一行中添加三列,其中包含树中每个类别(4、6、8)的投票计数。我正在设想这样的输出:
individual.10 | Votes_4 | Votes_6 | Votes_8 |
---|---|---|---|
6 | 2 | 7 | 1 |
按条件对跨行的列求和的最佳方法是什么?我似乎无法在那里找到我真正需要的东西。此输出是否已作为 randomForest 包的一部分存在,而我只是忽略了它?
这应该有效:
# Defining temporarily function, to be passed within apply().
temp.fun = function(x) sum(x == i)
for (i in unique(cartest_predicted$aggregate)) # Iterating over possible votes.
{
i = as.integer(i)
cartest_predicted$temp = apply(cartest_predicted[, -1], MARGIN = 1, temp.fun) # Requested results.
colnames(cartest_predicted)[dim(cartest_predicted)[[2]]] = paste("Votes", i, sep = "_") # Renaming new column.
}
需要 for
循环来迭代树可以投出的所有可能的选票。创建一个临时函数来为每个 i
执行您需要的操作,即为每个可能的投票。然后在 apply()
中使用这样的函数来应用于 cartest_predict
的每一行(注意 MARGIN = 1
)。最后,paste
用于重命名列。