Я работаю со случайным лесом с несбалансированными данными, проблема, уже прокомментированная здесь на этом сайте, с несколькими решениями проблемы с акцентом на передискретизацию, недостаточную выборку и SMOTE.
Переменная, которую я хочу исследоватьсостоит из 75% чисел 0 и 25% чисел 1 (или близко к 56.000 / 14.000), которые будут регрессированы 18 другими переменными.Я не знаю, нужно ли публиковать здесь свою базу данных или проблему можно решить, просто посмотрев код, который я опубликую ниже.
Сначала я провел тренинг с 80% данных.и тест с 20%, и результаты были очень хорошими с точки зрения MSE, но плохими по точности, отзыву и f1-баллу при рассмотрении прогноза 1, предполагая, что модель имела большой уклон в 0.
В другом посте было предложено, чтобы функции strata
и sampsize
в randomForest
могли помочь в решении проблемы, так что мой код выглядел следующим образом (sinistros2 - мои данные):
train_idx <- sample(1:nrow(sinistros2),56538,replace=FALSE)
train6 <- sinistros2[train_idx,] # select all these rows
teste6 <- sinistros2[-train_idx,]
rf.mdl <- randomForest( y=as.factor(train6[,1]), x=train6[,2:ncol(sinistros2)],
strata=as.factor(train6$ev), sampsize=c(50,50),
ntree=100)
plot(rf.mdl)
print(rf.mdl)
Call:
randomForest(x = train6[, 2:ncol(sinistros2)], y = as.factor(train6[, 1]), ntree = 100, strata = as.factor(train6$ev), sampsize = c(50, 50))
Type of random forest: classification
Number of trees: 100
No. of variables tried at each split: 4
OOB estimate of error rate: 0.23%
Confusion matrix:
0 1 class.error
0 43465 0 0.00000000
1 131 12942 0.01002065
, поэтому я сделал прогноз набора тестов и вычислил точность измерений, напоминания и F1 socre
pred6<-predict(rf.mdl, newdata=teste6) #prediction
tab6<-table(pred6,teste6$ev)
tab6
pred6 0 1
0 10725 42
1 0 3233
1-sum(diag(tab6))/sum(tab6)
[1] 0.003
p1<-tab6[1,1]/(tab6[1,1]+tab6[2,1]) #classe1 precision
[1] 1
p2<-tab6[2,2]/(tab6[2,2]+tab6[1,2]) #classe 2 precision
[1] 0.9871756
r1<-tab6[1,1]/(tab6[1,1]+tab6[1,2]) #classe 1 recall
[1] 0.9960992
r2<-tab6[2,2]/(tab6[2,2]+tab6[2,1]) #classe 1 recall
[1] 1
f1<-2*p1*r1/(p1+r1) #f1 score
[1] 0.9980458
f2<-2*p2*r2/(p2+r2) #f1 score
[1] 0.9935464
Как видите, результат былпо-видимому, очень хорошо, что делает меня очень заинтригованным, если я не ошибся.Можете ли вы найти что-нибудь, чтобы помочь?
Перед тем как опубликовать этот вопрос, я много чего прочитал здесь, но ничего не помогло мне. Эта является проблемой, аналогичной моей, но мой алгоритм показал такую точность, что было невозможно оценить кривую ROC и AUC.