[英]Handling imbalanced data in multi-class classification problem
我有多類分類問題,數據嚴重傾斜。 我的目標變量 (y) 有 3 個類,它們在數據中的百分比如下: - 0=3% - 1=90% - 2=7%
我正在尋找 R 中的包,它可以進行多類過采樣、欠采樣或這兩種技術。
如果它在 R 中不可行,那么我可以在哪里處理這個問題。?
PS:我嘗試在 R 中使用 ROSE 包,但它僅適用於二進制類問題。
好吧,有一個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
您可以在 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 個不平衡類,對數據應用 SMOTE 函數 2 次......
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 控制使用多少這些鄰居。 因此,每次運行時課程可能會有所不同,這不應該影響整體平衡。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.