Я получил 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
источник
Ваш набор резко несбалансирован - RF обычно терпит неудачу в этом сценарии (то есть хорошо предсказывает только больший класс).
Вы должны попытаться сбалансировать свой сет, либо выбрав класс «0» только для того, чтобы иметь примерно тот же размер, что и класс «1», либо поиграв с
classwt
параметром.источник
classwt
параметра, я не думаю, что он еще реализован вrandomForest()
функцииrandomForest
пакета в R. Per Link . Вы использовали это раньше? Я попробовал это с другими значениями, но получил идентичные результаты по умолчаниюclasswt=NULL
.Исходя из вашей матрицы путаницы, у вас есть 5 908 точек данных, и подавляющее большинство из них относится к типу 0 («сотрудник остался»). Поэтому классификатору может быть не по себе "лениво" и выбор класса большинства, если только он не уверен, что пример принадлежит другому классу. Обратите внимание, что ваш общий коэффициент ошибок составляет ~ 7%, что довольно близко к проценту примеров Class1!
У вас есть несколько вариантов:
Откажитесь от примеров Class0, пока у вас не будут примерно сбалансированные классы. Я не знаю, есть ли литература о том, как выбрать оптимально репрезентативное подмножество (может быть, кто-то еще может взвесить?), Но вы могли бы начать с случайного отбрасывания примеров. Вы можете передать
subset
аргумент в randomForest, который должен сделать это тривиальным для тестирования.Отрегулируйте свою функцию потерь / веса классов, чтобы компенсировать непропорциональное число Class0. По сути, вы хотите, чтобы классификатор ошибочно классифицировал пример Class1 намного дороже, чем Class0. Возможно, имеет смысл попробовать Class0 = 1 / 0,07 ~ = 14x Class1 для запуска, но вы можете настроить его в соответствии с требованиями вашего бизнеса (насколько хуже один вид ошибки). Я думаю, что
classwt
параметр это то, что вы ищете здесь.Используйте стратифицированную выборку, чтобы убедиться, что у вас есть примеры из обоих классов в обучающих данных деревьев. Возможно, что некоторые из ваших деревьев были натренированы только на данных класса 0, что явно не сулит ничего хорошего для их производительности обобщения. Проверьте
strata
аргумент.источник