Случайный лес - результаты слишком хорошие, чтобы быть правдой - PullRequest
0 голосов
/ 27 февраля 2019

Я работаю со случайным лесом с несбалансированными данными, проблема, уже прокомментированная здесь на этом сайте, с несколькими решениями проблемы с акцентом на передискретизацию, недостаточную выборку и 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)

Plot of tree-error curve

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.

...