В последнее время я делаю KNN с наборами данных по раку молочной железы, которые довольно известны для обучающихся машинному обучению.
Я использовал функцию поезда с опцией метода kKnn в библиотеке карет, чтобы найти оптимальное значение k, и я использовал "repeatcv"метод.
Я решил найти оптимальное значение 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 был таким разным.
После этого я кодировал свой выигранный код, чтобы найти оптимальное значение k, используя функцию Knn из библиотеки 'class'.Как ни странно, это выглядело как успешное.Но я до сих пор не знаю, почему функция каретки возвращает недопустимый результат.
Вот мой код, использующий функцию 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 и сходится согласно итерации