-1

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

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

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

当模型将“未命中”分类为“命中”时,如何更改成本矩阵以惩罚模型?

4

1 回答 1

0

您可以使用 to 的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
于 2018-01-22T20:36:15.153 回答