我遇到了多类分类问题,数据严重偏斜。我的目标变量(y)具有3个类,其数据百分比如下: -0 = 3% -1 = 90% -2 = 7%
我正在寻找R中可以执行多类过采样,欠采样或这两种技术的软件包。
如果它在R中不可行,那我可以在哪里处理这个问题。
PS: 我尝试在R中使用ROSE包,但它仅适用于二进制类问题。
答案 0 :(得分:0)
还有caret
软件包,它提供了广泛的ML算法,包括针对多类问题的解决方案。
它还可以通过downSample()
,upSample()
trainclass <- data.frame("label" = c(rep("class1", 100), rep("class2", 20), rep("class3", 180)),
"predictor1" = rnorm(300, 0 ,1),
"predictor2" = sample(c("this", "that"), 300, replace = TRUE))
> table(trainclass$label)
class1 class2 class3
100 20 180
#then use
set.seed(234)
dtrain <- downSample(x = trainclass[, -1],
y = trainclass$label)
> table(dtrain$Class)
class1 class2 class3
20 20 20
不错的功能:在应用重采样程序(例如交叉验证)时,它还可以进行下采样,上采样以及SMOTE和ROSE
这将使用下采样执行10倍交叉验证。
ctrl <- caret::trainControl(method = "cv",
number = 10,
verboseIter = FALSE,
summaryFunction = multiClassSummary
sampling = "down")
set.seed(42)
model_rf_under <- caret::train(Class ~ .,
data = data,
method = "rf",
trControl = ctrl)
在此处查看更多信息: https://topepo.github.io/caret/subsampling-for-class-imbalances.html
也请检查mlr
软件包:
https://mlr.mlr-org.com/articles/tutorial/over_and_undersampling.html#sampling-based-approaches
答案 1 :(得分:0)
您可以在DMwR软件包下使用SMOTE功能。我创建了一个样本数据集,并创建了三个不平衡类。
install.packages("DMwR")
library(DMwR)
## A small example with a data set created artificially from the IRIS
## data
data(iris)
#setosa 90%, versicolor 3% and virginica 7%
Species<-c(rep("setosa",135),rep("versicolor",5),rep("virginica",10))
data<-cbind(iris[,1:4],Species)
table(data$Species)
不平衡类:
setosa versicolor virginica
135 5 10
现在,要恢复2个不平衡等级,请对数据应用2次SMOTE函数...
First_Imbalence_recover <- DMwR::SMOTE(Species ~ ., data, perc.over = 2000,perc.under=100)
Final_Imbalence_recover <- DMwR::SMOTE(Species ~ ., First_Imbalence_recover, perc.over = 2000,perc.under=200)
table(Final_Imbalence_recover$Species)
最终余额类别:
setosa versicolor virginica
79 81 84
注意:这些示例将通过使用以下信息生成 每个少数类示例的k个最近邻居。的 参数k控制使用多少个这些邻居。所以 上课的时间可能会有所不同,这不会影响整体平衡。