R中的不平衡数据集,分类树和成本矩阵

时间:2018-01-22 19:29:05

标签: r classification party predictive

我正在尝试创建一个分类模型来预测两个类中的一个:“命中”或“小姐”。

数据集包含大约80%的“命中率”,因此它是高度不平衡的,因此分类树(来自派对包的ctree)等模型选择将所有结果预测为“命中”并获得80%的准确度。

我尝试了欠采样和SMOTE算法但没有成功。

如何将“Miss”归类为“Hit”时,如何更改成本矩阵以惩罚模型?

1 个答案:

答案 0 :(得分:0)

您可以使用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

请注意,整体准确度已经 down ,但我们得到了更多正确分类的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