处理多类别分类问题中的不平衡数据

时间:2019-02-20 05:27:50

标签: python r

我遇到了多类分类问题,数据严重偏斜。我的目标变量(y)具有3个类,其数据百分比如下:  -0 = 3%  -1 = 90%  -2 = 7%

我正在寻找R中可以执行多类过采样,欠采样或这两种技术的软件包。

如果它在R中不可行,那我可以在哪里处理这个问题。

PS: 我尝试在R中使用ROSE包,但它仅适用于二进制类问题。

2 个答案:

答案 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控制使用多少个这些邻居。所以   上课的时间可能会有所不同,这不会影响整体平衡。