Я новичок в R и потратил часы, пытаясь решить следующие проблемы (которые, как мне кажется, могут быть взаимосвязаны). Я прочитал другие ответы, в основном предполагающие, что в столбце DRB1 может быть опечатка. Это определенно так, и мне интересно, возникла ли ошибка раньше, поскольку матрица путаницы показывает, что все классифицируется как «-», в то время как около 20% факторов в «Ответе» равны «+»:
Call:
randomForest(formula = Response ~ ., data = training, ntree = 21, importance = TRUE)
Type of random forest: classification
Number of trees: 21
No. of variables tried at each split: 1
OOB estimate of error rate: 20.24%
Confusion matrix:
- + class.error
- 17504 0 0
+ 4443 0 1
Я пытаюсь использовать случайный лес fn для предсказания переменной ответа «Response» по столбцу DRB1:
library(randomForest)
#library(xlsx)
library(xlsx)
# load data
path <- "C:/Users/[...].xlsx" #I have only removed the path for privacy reasons
data <- read.xlsx(path, sheetIndex = 2)
# show data [FINE]
head(data)
# make some data categorical
data$DRB1=as.factor(data$DRB1)
data$Response=as.factor(data$Response)
# to check data structure [FINE]
str(data)
# define 20% testing, 80% training data set etc.
data_set_size=floor(nrow(data)*0.80)
index <- sample(1:nrow(data), size = data_set_size)
# training set up to first set of index
training <- data[index,]
# testing set up to first set of index
testing <- data[-index,]
head(testing,100) #FINE!
# now apply random forest
rf <- randomForest(Response ~ ., data = training, ntree=21, importance=TRUE)
rf
plot(rf)
# testing$DRB1 [FINE]
str(testing)
# predict runs random forest
result <- data.frame(testing$Response, predict(rf, testing[,2], type = "response"))
result
plot(result)
Вот уменьшенная версия информации, которую я получаю при запуске кода :
> library(randomForest)
> #library(xlsx)
> library(xlsx)
>
> # load data
> path <- "C:/Users/[...].xlsx"
> data <- read.xlsx(path, sheetIndex = 2)
>
> # show data
> head(data)
Response DRB1
1 - 08_01
2 - 11_01
3 - 07_01
4 - 11_01
5 - 04_04
6 - 07_01
>
> # make some data categorical
>
> data$DRB1=as.factor(data$DRB1)
> data$Response=as.factor(data$Response)
>
> # to check data structure
> str(data)
'data.frame': 27438 obs. of 2 variables:
$ Response: Factor w/ 2 levels "-","+": 1 1 1 1 1 1 1 1 1 1 ...
$ DRB1 : Factor w/ 47 levels "0","01_01","01_02",..: 19 26 18 26 10 18 18 19 31 18 ...
>
> # define 20% testing, 80% training data set etc.
> data_set_size=floor(nrow(data)*0.80)
> index <- sample(1:nrow(data), size = data_set_size)
>
> # training set up to first set of index
> training <- data[index,]
>
> # testing set up to first set of index
> testing <- data[-index,]
>
> head(testing,20)
Response DRB1
2 - 11_01
6 - 07_01
9 - 12_01
13 - 03_01
14 - 12_01
27 - 08_01
28 + 04_02
31 - 04_04
33 - 03_01
39 - 14_54
54 - 01_01
55 - 03_01
60 - 04_02
69 - 03_02
81 - 08_01
83 - 11_01
88 - 04_04
90 - 04_07
104 - 15_03
115 - 11_01
>
> # now apply random forest
> rf <- randomForest(Response ~ ., data = training, ntree=21, importance=TRUE)
> rf
Call:
randomForest(formula = Response ~ ., data = training, ntree = 21, importance = TRUE)
Type of random forest: classification
Number of trees: 21
No. of variables tried at each split: 1
OOB estimate of error rate: 20.24%
Confusion matrix:
- + class.error
- 17504 0 0
+ 4443 0 1
Вопрос 1: Почему нет прогнозов +?
> plot(rf)
>
> # testing$DRB1
>
> str(testing)
'data.frame': 5488 obs. of 2 variables:
$ Response: Factor w/ 2 levels "-","+": 1 1 1 1 1 1 2 1 1 1 ...
$ DRB1 : Factor w/ 47 levels "0","01_01","01_02",..: 26 18 31 5 31 19 8 10 5 40 ...
Вопрос 2: Если DRB1 имеет некоторые данные NA, учитываются ли они в качестве категории, как и любая другая, и учитывает ли randomForest ее как категорию или игнорирует ее?
> # predict runs random forest
> result <- data.frame(testing$Response, predict(rf, testing[,2], type = "response"))
Error in eval(predvars, data, env) : object 'DRB1' not found
Вопрос 3: Я так старался понять это сообщение об ошибке но не может. Можете ли вы мне помочь?
> result
testing.Response predict.rf..testing...2.3...type....response..
7 - -
11 - -
13 - -
16 - -
24 - -
36 - -
56 - -
58 - -
59 - -
65 - -
72 - -
73 - -
75 - -
77 - -
87 - -
89 - -
95 - -
101 - -
108 - -
111 + -
118 - -
123 - -
124 - -
126 - -
127 - -
130 - -
143 - -
149 - -
154 - -
155 - -
167 - -
169 - -
174 - -
175 - -
177 - -
199 - -
201 - -
202 - -
213 - -
220 - -
229 - -
231 + -
256 - -
259 - -
268 - -
278 - -
281 - -
291 - -
296 + -
297 + -
298 - -
301 + -
302 - -
303 + -
[...]
[ reached 'max' / getOption("max.print") -- omitted 2244 rows ]
> plot(result)
Результат остается таким же, как и в предыдущем моделировании ...
Я СУПЕР благодарен за любую помощь / ответы даже на 1 из 3-х вопросов.
Спасибо много !