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