Несбалансированный набор данных, классификационное дерево и матрица затрат в 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