Попытка создать матрицу путаницы из перекрестно проверенных результатов, используя лучшее значение k в R - PullRequest
0 голосов
/ 10 января 2020

Я написал метод перекрестной проверки knn ниже, используя набор данных iris в R. Как я мог бы получить из этого наилучшее значение k и создать матрицу путаницы на основе этого? Любая помощь будет отличной.

library(class)
data("iris")
kfolds = 5
iris$folds = cut(seq(1,nrow(iris)),breaks=kfolds,labels=FALSE)
iris$folds

# Sets the columns to use as predicators
pred = c("Petal.Width", "Petal.Length")
accuracies = c()
ks = c(1,3,5,7,9,11,13,15)
for (k in ks) {
  k.accuracies = c()
  for(i in 1:kfolds) {
    # Builds the training set and test set for this fold.
    train.items.this.fold  = iris[iris$folds != i,] 
    validation.items.this.fold = iris[iris$folds == i,]

    # Fit knn model on this fold.
    predictions = knn(train.items.this.fold[,pred], 
                      validation.items.this.fold[,pred], 
                      train.items.this.fold$Species, k=k)

    predictions.table <- table(predictions, validation.items.this.fold$Species)

    # Work out the amount of correct and incorrect predictions.
    correct.list <- predictions == validation.items.this.fold$Species
    nr.correct = nrow(validation.items.this.fold[correct.list,])

    # Get accuracy rate of cv.
    accuracy.rate = nr.correct/nrow(validation.items.this.fold)

    # Adds the accuracy list.
    k.accuracies <- cbind(k.accuracies, accuracy.rate)
  }
  # Adds the mean accuracy to the total accuracy list.
  accuracies <- cbind(accuracies, mean(k.accuracies))
}

# Accuracy for each value of k: visualisation.
accuracies

Обновление:

predictions.table <- table(predictions == ks[which.max(accuracies)], validation.items.this.fold$Species)

1 Ответ

1 голос
/ 10 января 2020

У вашего кода есть некоторые проблемы, он запускается:

library(class)
data("iris")
kfolds = 5
iris$folds = cut(seq(1,nrow(iris)),breaks=kfolds,labels=FALSE)
iris$folds

# Sets the columns to use as predicators
pred = c("Petal.Width", "Petal.Length")
accuracies = c()
ks = c(1,3,5,7,9,11,13,15)
k.accuracies = c()
predictions.list = list()
for (k in ks) {
  k.accuracies = c()
  for(i in 1:kfolds) {
    # Builds the training set and test set for this fold.
    train.items.this.fold  = iris[iris$folds != i,] 
    validation.items.this.fold = iris[iris$folds == i,]

    # Fit knn model on this fold.
    predictions = knn(train.items.this.fold[,pred], 
                      validation.items.this.fold[,pred], 
                      train.items.this.fold$Species, k=k)
    predictions.list[[i]] = predictions

    predictions.table <- table(predictions, validation.items.this.fold$Species)

    # Work out the amount of correct and incorrect predictions.
    correct.list <- predictions == validation.items.this.fold$Species
    nr.correct = nrow(validation.items.this.fold[correct.list,])

    # Get accuracy rate of cv.
    accuracy.rate = nr.correct/nrow(validation.items.this.fold)

    # Adds the accuracy list.
    k.accuracies <- cbind(k.accuracies, accuracy.rate)
  }
  # Adds the mean accuracy to the total accuracy list.
  accuracies <- cbind(accuracies, mean(k.accuracies))
}
accuracies


predictions.table <- table(predictions.list[[which.max(accuracies)]], validation.items.this.fold$Species)  

Когда вы звоните predictions.table <- table(predictions, validation.items.this.fold$Species), это матрица путаницы, и вы используете точность в качестве метрики оценки c, поэтому лучший К - лучшая точность. Вы можете получить лучшее значение K, например:

ks[which.max(accuracies)]

ОБНОВЛЕНИЕ

Создайте список для хранения каждого прогноза, а затем создайте матрицу путаницы, используя лучшую точность.

...