Функция для расчета точности, повторного вызова и точности для 5 различных алгоритмов в R - PullRequest
0 голосов
/ 19 марта 2020

У меня есть 4 разных набора данных в этой общей форме:

df <- data.frame(var1 = c(319, 77, 222, 107, 167),
                  var2 = c(137, 290, 237, 52, 192),
                  class = c(1,1,0,1,0))

Каждый содержит var1, var2 и переменную класса. Мне были даны следующие инструкции:

Написать сценарий R, который принимает таблицу данных в качестве входных данных и возвращает статистику производительности (точность, отзыв и точность) для пяти разностных алгоритмов, деревьев решений (rpart), наивного Байес (naiveBayes), K ближайшего соседа (knn), машины опорных векторов (svm) и искусственные нейронные сети (nnet). Возвращаемое значение скрипта будет 5 на 3 матрицы статистики для каждого алгоритма. Для knn используйте k = 3, для svm - для линейного ядра, а для nnet - 4 скрытых узла. Для расчета статистики вы будете использовать 10-кратную перекрестную проверку.

По сути, я считаю, что мне нужно написать всеобъемлющую функцию, чтобы я мог передавать кадр данных, а возвращением этой функции является точность, возврат и Точность для каждого из 5 различных алгоритмов, изложенных в направлениях выше. Есть ли краткий способ сделать это ?? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 19 марта 2020

Предполагая, что переменная класса является 3-м столбцом и называется «класс», как и все мои примеры наборов данных, вот что я придумал:

algStats <- function(dataset){
  # Split data into test and train (80/20 train to test)
  trainindex  <- sample(1:nrow(dataset), 0.8 * nrow(dataset))
  TrainData  <- dataset[trainindex, ] # Train data length same for all datasets
  TestData <- dataset[-trainindex, ] # Test data length same for all datasets
  # Declare 10-fold CV (same for all datasets)
  train_control <- trainControl(method="cv", number=10)
  # Train a decision tree model
  DecTreeMod <- train(as.factor(class)~., data=TrainData, 
                       trControl=train_control, method="rpart")
  # Predict on test data using Decision Tree model
  DecTreepred <- predict(DecTreeMod, TestData[,1:2])
  # Create confusion matrix for Decision Tree classifier
  DecTreecf <- confusionMatrix(DecTreepred, as.factor(TestData[,3]), mode = "prec_recall", positive = "1")
  # Extract Precision, Recall and Accuracy from confusion matrix
  DecTreePrecision <- DecTreecf$byClass[5] # <-----Precision
  DecTreeRecall <- DecTreecf$byClass[6] # <-----Recall
  DecTreeAcc <- DecTreecf$overall[1] # <-----Accuracy

  # Create an empty matrix to hold performance measures of each algorithm
  rownames = c("Decision Tree", "Naive Bayes", "KNN", "SVM", "ANN")
  colnames = c("Precision", "Recall", "Accuracy")

  performance <- matrix(ncol = 3, nrow = 5,
     byrow = T, dimnames = list(rownames, colnames))

  # Append the metrics from the Decision Tree classifier into the matrix
  # performance <- rbind(performance, c(DecTreePrecision,DecTreeRecall,DecTreeAcc))
  performance[1,] <- c(DecTreePrecision,DecTreeRecall,DecTreeAcc)

  # Train a Naive Bayes model
  NBMod <- train(as.factor(class)~., data=TrainData, 
                      trControl=train_control, method="nb")
  # Predict on test data using Naive Bayes model
  NBpred <- predict(NBMod, TestData[,1:2])
  # Create confusion matrix for Naive Bayes classifier
  NBcf <- confusionMatrix(NBpred, as.factor(TestData[,3]), mode = "prec_recall", positive = "1")
  # Extract Precision, Recall and Accuracy from confusion matrix
  NBPrecision <- NBcf$byClass[5] # <-----Precision
  NBRecall <- NBcf$byClass[6] # <-----Recall
  NBAcc <- NBcf$overall[1] # <-----Accuracy

  # Append the metrics from the Naive Bayes classifier into the matrix
  performance[2,] <- c(NBPrecision,NBRecall,NBAcc)

  # Train a KNN model
  KNNMod <- train(as.factor(class)~., data=TrainData, tuneGrid = expand.grid(k = 3), 
                 trControl=train_control, method="knn", preProcess = c("center","scale"))
  # Predict on test data using KNN model
  KNNpred <- predict(KNNMod, TestData[,1:2])
  # Create confusion matrix for KNN classifier
  KNNcf <- confusionMatrix(KNNpred, as.factor(TestData[,3]), mode = "prec_recall", positive = "1")
  # Extract Precision, Recall and Accuracy from confusion matrix
  KNNPrecision <- KNNcf$byClass[5] # <-----Precision
  KNNRecall <- KNNcf$byClass[6] # <-----Recall
  KNNAcc <- KNNcf$overall[1] # <-----Accuracy

  # Append the metrics from the KNN classifier into the matrix
  performance[3,] <- c(KNNPrecision,KNNRecall,KNNAcc)

  # Train an SVM model
  SVMMod <- train(as.factor(class)~., data=TrainData, 
                  trControl=train_control, method="svmLinear", preProcess = c("center","scale"))
  # Predict on test data using the SVM model
  SVMpred <- predict(SVMMod, TestData[,1:2])
  # Create confusion matrix for SVM classifier
  SVMcf <- confusionMatrix(SVMpred, as.factor(TestData[,3]), mode = "prec_recall", positive = "1")
  # Extract Precision, Recall and Accuracy from confusion matrix
  SVMPrecision <- SVMcf$byClass[5] # <-----Precision
  SVMRecall <- SVMcf$byClass[6] # <-----Recall
  SVMAcc <- SVMcf$overall[1] # <-----Accuracy

  # Append the metrics from the SVM classifier into the matrix
  performance[4,] <- c(SVMPrecision,SVMRecall,SVMAcc)

  # Train an ANN model
  ANNMod <- train(as.factor(class)~., data=TrainData, tuneGrid = expand.grid(
            size = 4, decay = 0.1), linear.output = F, trControl=train_control, method="nnet",
            preProcess = c("center","scale"))
  # Predict on test data using the ANN model
  ANNpred <- predict(ANNMod, TestData[,1:2])
  # Create confusion matrix for ANN classifier
  ANNcf <- confusionMatrix(ANNpred, as.factor(TestData[,3]), mode = "prec_recall", positive = "1")
  # Extract Precision, Recall and Accuracy from confusion matrix
  ANNPrecision <- ANNcf$byClass[5] # <-----Precision
  ANNRecall <- ANNcf$byClass[6] # <-----Recall
  ANNAcc <- ANNcf$overall[1] # <-----Accuracy

  # Append the metrics from the ANN classifier into the matrix
  performance[5,] <- c(ANNPrecision,ANNRecall,ANNAcc)

  # Return the performance matrix
  return(performance)
}

...