Как интерпретировать OOB и путаницу для случайного леса?


35

Я получил R-скрипт от кого-то для запуска модели случайного леса. Я изменил и запустил его с некоторыми данными о сотрудниках. Мы пытаемся предсказать добровольное увольнение.

Вот некоторая дополнительная информация: это модель классификации, в которой 0 = сотрудник остался, 1 = сотрудник уволен, в настоящее время мы рассматриваем только дюжину переменных предикторов, данные «несбалансированы» в том смысле, что записи в терминах составляют около 7 % от общего набора записей.

Я запускаю модель с различными вариантами выбора mtry и ntree, но остановился на следующем. OOB составляет 6,8%, что я считаю хорошим, но матрица путаницы, похоже, рассказывает другую историю для прогнозирования терминов, так как уровень ошибок довольно высок и составляет 92,79%. Правильно ли я считаю, что не могу положиться на эту модель и использовать ее, потому что высокая частота ошибок для прогнозирования сроков? или я тоже могу что-то сделать, чтобы использовать RF и получить меньшую частоту ошибок для прогнозирования условий?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908

Ответы:


20

Матрица путаницы рассчитывается в определенной точке, определенной по отсечке голосов. В зависимости от ваших потребностей, т. Е. Лучшей точности (уменьшение ложных срабатываний) или лучшей чувствительности (уменьшение ложных срабатываний), вы можете предпочесть другое ограничение.

Для этой цели я рекомендую построить (i) кривую ROC , (ii) точность повторного вызова и (iii) калибровочную кривую, чтобы выбрать обрезку, которая наилучшим образом соответствует вашим целям. Все это может быть легко построено с использованием 2 следующих функций из библиотеки ROCR R (доступно также в CRAN ):

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Например:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);

Меня интересует ваш ответ, я составил график с кодом, которым вы поделились. Не могли бы вы дать мне немного ресурсов, чтобы найти немного подробностей о предложенном вами сюжете. или напишет несколько предложений о том, как его интерпретировать. Спасибо заранее.
MKS

Я предлагаю вам начать с записи для кривой ROC, которая связана с выше, и других записей, упомянутых там.
Итамар

Ответ не имеет прямого отношения к ограничению дерева решений в сильно искаженном наборе данных.
SmallChess

19

Ваш набор резко несбалансирован - RF обычно терпит неудачу в этом сценарии (то есть хорошо предсказывает только больший класс).

Вы должны попытаться сбалансировать свой сет, либо выбрав класс «0» только для того, чтобы иметь примерно тот же размер, что и класс «1», либо поиграв с classwtпараметром.


1
Несмотря на наличие classwtпараметра, я не думаю, что он еще реализован в randomForest()функции randomForestпакета в R. Per Link . Вы использовали это раньше? Я попробовал это с другими значениями, но получил идентичные результаты по умолчанию classwt=NULL.
Жубарб

9

Исходя из вашей матрицы путаницы, у вас есть 5 908 точек данных, и подавляющее большинство из них относится к типу 0 («сотрудник остался»). Поэтому классификатору может быть не по себе "лениво" и выбор класса большинства, если только он не уверен, что пример принадлежит другому классу. Обратите внимание, что ваш общий коэффициент ошибок составляет ~ 7%, что довольно близко к проценту примеров Class1!

У вас есть несколько вариантов:

  • Откажитесь от примеров Class0, пока у вас не будут примерно сбалансированные классы. Я не знаю, есть ли литература о том, как выбрать оптимально репрезентативное подмножество (может быть, кто-то еще может взвесить?), Но вы могли бы начать с случайного отбрасывания примеров. Вы можете передать subsetаргумент в randomForest, который должен сделать это тривиальным для тестирования.

  • Отрегулируйте свою функцию потерь / веса классов, чтобы компенсировать непропорциональное число Class0. По сути, вы хотите, чтобы классификатор ошибочно классифицировал пример Class1 намного дороже, чем Class0. Возможно, имеет смысл попробовать Class0 = 1 / 0,07 ~ = 14x Class1 для запуска, но вы можете настроить его в соответствии с требованиями вашего бизнеса (насколько хуже один вид ошибки). Я думаю, что classwtпараметр это то, что вы ищете здесь.

  • Используйте стратифицированную выборку, чтобы убедиться, что у вас есть примеры из обоих классов в обучающих данных деревьев. Возможно, что некоторые из ваших деревьев были натренированы только на данных класса 0, что явно не сулит ничего хорошего для их производительности обобщения. Проверьте strataаргумент.


Случайный выбор из доминирующего класса звучит разумно. Они не должны быть равными: даже соотношение 1: 5 должно быть улучшением.
Итамар

@ Итмар, именно это я и попробую в первую очередь. Однако, похоже, что должен быть какой-то способ убедиться, что примеры, которые вы сохраняете, представляют более широкий набор данных.
Мэтт Краузе

1
Одним из вариантов может быть запуск PCA (анализ основных компонентов) на большем наборе, кластеризация точек в соответствии с первым основным компонентом и выборка одной выборки из каждого кластера.
Итамар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.