r - 与我自己使用类库的代码相比,KNN 重复的 cv 方法返回不合理的结果
问题描述
最近,我正在使用以机器学习学习器而闻名的乳腺癌数据集进行 KNN。
我在插入符号库中使用带有 kKnn 方法选项的 train 函数来找到最佳 k 值,并且我使用了“repeatedcv”方法。
我决定随着重复次数的增加找到最佳 k 值。但是,函数会产生不同的最佳 k 值。
我的源代码在这里。
accuracy_data<-vector()
accuracy_data[1:10]<-0
current_op<-0
count_same<-0
str(knnFit)
for (i in 1:50){
cat('\n current repitation is',i)
set.seed(i*10)
training_now<-training[sample(nrow(training)),]
set.seed(i*100)
ctrl <- trainControl(method="repeatedcv",repeats = 1)
formula <- as.formula(paste(col_label_name, ' ~ .' ))
knnFit <- train(formula, data=training_now, method = "knn", trControl = ctrl, preProcess = c("center","scale"), tuneLength = 20)
accuracy_data<-accuracy_data+knnFit$results$Accuracy
cat('\n',3+which.max(accuracy_data)*2,'\n')
if (current_op == which.max(accuracy_data)){
count_same<-count_same+1
}
else{
current_op<-which.max(accuracy_data);
}
if (count_same==3){
cat('\n',i,'time repitition is enough \n')
break
}
}
有意地,我重复使用了 1 次,但我循环了它。我积累了准确度以看到收敛,但我看不到任何收敛。此外,每次代码运行时,最优k结果都是如此不同。
之后,我使用“类”库中的 Knn 函数对我的获胜代码进行编码以找到最佳 k 值。奇怪的是,它看起来很成功。但我仍然不知道为什么插入符号函数会返回不可接受的结果。
这是我使用类库中的 knn 函数的代码。
accuracy_data<-vector()
accuracy_data[1:10]<-0
current_op<-0
count_same<-0
print('Finding best parameter k by using 10-fold cross-validation method. please wait....')
for (k in (1:100)){
random_rows<-sample(nrow(training))
training<-training[random_rows,]
train_label<-train_label[random_rows]
print(paste('The number of repeatation:',k))
for (j in (1:20)) { ## the number k that will be swept
kvalue=2*j-1
acc<-0
for (i in 1:fold_n){ ## accmulate accuracy
# cat(point[i],point[i+1],'\n')
training_now<-training[-(point[i]:point[i+1]),]
train_label_now<-train_label[-(point[i]:point[i+1])]
validation_set<-training[(point[i]:point[i+1]),]
validation_label<-train_label[(point[i]:point[i+1])]
validation_pred<-knn(train =training_now , test = validation_set , cl = train_label_now, k=kvalue)
accuracy<-sum(ifelse(validation_label==validation_pred,1,0)) / length(validation_pred)
acc<-accuracy+acc
}
cat('\n Accuracy:',acc/fold_n,'when k=',kvalue)
accuracy_data[j]<-accuracy_data[j]+acc/fold_n
}
if (current_op==which.max(accuracy_data)){
count_same<-count_same+1
}
else{
count_same<-0
current_op<-which.max(accuracy_data)
}
if (count_same==3){
cat('\n',k,'time repitition is enough \n')
break;
}
current_op<-which.max(accuracy_data)
cat('\n maximum row:',which.max(accuracy_data),'\n')
}
我认为两个结果应该收敛到具有最大精度的相同 k,但第一个结果在每次执行时都会给出不同的最优 k,尽管收敛。
然而,第二个给出了最优k的一致结果,并根据迭代收敛
解决方案
推荐阅读
- postgresql - Knex 种子和主键序列
- javascript - 包括和使用 Three.js 调用 FBXLoader 的错误
- apache-spark - 通过 operatorhub 部署的 spark-gcp 上的 Webhook
- php - 使用 Oracle 数据库在 PHP 中插入多个 CLOB
- python - 等距时间序列填补空白
- assembly - 正确调用 printf 的堆栈对齐?
- c++ - 如何防止 QListView 调用每个项目的 sizeHint?
- c - 将指针延迟到指针会导致分段错误
- php - 在 Codeigniter 中调用未定义的方法 Sendgrid::send()
- php - 如何更改多维数组中的日期格式并用键迭代所有数组