Несбалансированный набор данных, классификационное дерево и матрица затрат в R

Я пытаюсь создать классификационную модель для прогнозирования одного из двух классов: "Хит" или "Мисс".

Набор данных содержит около 80% "совпадений", поэтому он крайне несбалансирован, поэтому модели, такие как деревья классификации (ctree from party package), предпочитают прогнозировать все результаты как "Hit" и получают точность 80%.

Я пробовал недосэмплирование и алгоритм SMOTE без успеха.

Как я могу изменить матрицу затрат, чтобы оштрафовать модель, когда она классифицирует "Мисс" как "Хит"?

1 ответ

Решение

Вы можете сделать это с weights аргумент ctree, Поскольку вы не предоставляете никаких данных, я проиллюстрирую их фиктивными данными.

library(party)

## Some bogus data
set.seed(42)
class = factor(sample(1:2, 500, replace=TRUE, prob=c(0.8, 0.2)) )
x1 = rnorm(500)
x2 = rnorm(500, 0.7, 0.9)
x = ifelse(class == 1, x1, x2)
y1 = rnorm(500)
y2 = rnorm(500, 0.7, 0.9)
y = ifelse(class == 1, y1, y2)
Imbalanced = data.frame(x,y,class)

Просто используя ctree на этих данных заставляет классифицировать все данные как класс 1.

CT1 = ctree(class ~ ., data=Imbalanced)
table(predict(CT1))
  1   2 
500   0 

Но если вы установите вес, вы можете найти больше данных класса 2.

W = ifelse(class==1, 1, 2)
CT2 = ctree(class ~ ., data=Imbalanced, weights=W)
table(predict(CT2), class)
   class
      1   2
  1 336  44
  2  63  57

Обратите внимание, что общая точность снизилась, но мы получили больше очков класса 2, правильно классифицированных. Если вы используете действительно большой весовой коэффициент, вы можете получить почти все очки класса 2 (за счет еще большей потери общей точности).

W = ifelse(class==1, 1, 5)
CT3 = ctree(class ~ ., data=Imbalanced, weights=W)
table(predict(CT3), class)
   class
      1   2
  1 178   4
  2 221  97
Другие вопросы по тегам