我正在尝试创建一个分类模型来预测两个类中的一个:“命中”或“小姐”。
数据集包含大约80%的“命中率”,因此它是高度不平衡的,因此分类树(来自派对包的ctree)等模型选择将所有结果预测为“命中”并获得80%的准确度。
我尝试了欠采样和SMOTE算法但没有成功。
如何将“Miss”归类为“Hit”时,如何更改成本矩阵以惩罚模型?
答案 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