我有一个名为酵母4 的不平衡数据集。记录分为目标“正面”和“负面”两类。正类只占总比例的3%。我使用了 kNN 算法进行分类,我没有指定 k,但我对训练数据使用了 5 折交叉验证。我发现:auc_knn_none = 0.7062473。我很高兴添加一种过采样算法来提高模型的质量。所以我使用了 SMOTE 算法,而且我没有指定 k ok kNN,我对训练数据使用了 5 折交叉验证。但这一次,我发现:auc_knn_smote = 0.56676。通常 auc_knn_smote 必须高于 auc_knn_none ,所以有一些问题,我不知道问题出在哪里。这是我的代码:
library(imbalance)
data(yeast4)
Data <- yeast4
Data$Mcg <- as.numeric(as.character(Data$Mcg))
Data$Gvh <- as.numeric(as.character(Data$Gvh))
Data$Alm <- as.numeric(as.character(Data$Alm))
Data$Mit <- as.numeric(as.character(Data$Mit))
Data$Erl <- as.numeric(as.character(Data$Erl))
Data$Pox <- as.numeric(as.character(Data$Pox))
Data$Vac <- as.numeric(as.character(Data$Vac))
Data$Nuc <- as.numeric(as.character(Data$Nuc))
U <- data.frame(Data[,-9])
U <- scale(U,center = TRUE ,scale=TRUE)
U <- data.frame(U)
q <- as.factor(unlist(Data$Class))
Q <- vector()
for(i in 1: nrow(Data))
{
if(substr(q[i],1,1)=="n")
{
Q <- c(Q,0)
}
else{
Q <- c(Q,1)
}
}
Q <- as.factor(Q)
在这里,我对数据进行了缩放和居中,将任何负值设置为 0,将其他所有值设置为 1。这是我使用的函数:
library(ROCR)
library(pROC)
library(caret)
library(ROSE)
library(DMwR)
library(nnet)
AUC_KNN_SMOTE <- function(U,Q,k,M){
folds <- createFolds(Q, k)
AUC <- vector()
W <- vector()
for( i in 1:k){
s <- data.frame(folds[i])[,1]
TRAIN <- data.frame(U[-s,])
TEST <- data.frame(U[s,])
TRAIN$Class <- Q[-s]
TRAIN.smote <- SMOTE(Class~.,data = TRAIN
,perc.over = 100,perc.under = 200)
trControl <- trainControl(method = "cv",
number = 5,
classProbs = TRUE,
summaryFunction = twoClassSummary)
fit <- train(make.names(Class) ~ .,
method = "knn",
tuneGrid = expand.grid(k = 1:M),
trControl = trControl,
metric = "ROC",
data = TRAIN.smote)
W <- c(W,fit[["results"]][,2])
W <- matrix(W,nrow=M,ncol = i)
J <- which.is.max(W[,i])
mod <- class::knn(cl = TRAIN.smote$Class,
test = TEST,
train = TRAIN.smote[,-9],
k = J,
prob = TRUE)
X <- roc(Q[s],attributes(mod)$prob,quiet = TRUE)
AUC <- c(AUC, as.numeric(X$auc))
}
return(mean(AUC))
}
我上面提到并使用此功能找到的结果是:
b <- 0
for(i in 1:1000)
{
m <- AUC_KNN_SMOTE(U,Q,k=5,M=100)+b
b <- m
}
auc_knn_smote <- m/1000
auc_knn_smote=0.56676
感谢您的任何帮助!