预测KNN并在McNemar中使用

时间:2016-01-10 16:38:39

标签: r prediction knn

我正在尝试使用McNemar三种不同的算法(knn,Decision Trees和Naive Bayes)。在编写我的代码时,我在预测KNN的一些问题上遇到了绊脚石。似乎knnPrediction函数(下面)接收NA字符串或者长度不一样?我对KNN的经验很少,我到处寻找答案,但无法解决我的问题。有人有想法吗? (向下滚动到" cl< - trainData [,ncol(trainData)]") 我也尝试过不同的行: cl< - as.formula(paste(variableCible,"〜。") 没有结果。

runAnalysis <- function(fileName,separator=","){

  nastrings <- c(NA, " ?", "?", "NA", " NA")

  #load raw data
  rawData <- read.table(
    file=fileName,
    header=TRUE,
    sep=separator,
    na.strings = nastrings)
  donneesBrutes <- na.omit(rawData)
  variableCible <-names(donneesBrutes)[length(donneesBrutes)]

  library(rpart)
  library(e1071)
  source("knn.R")


  #On fixe nos données aléatoire 
  set.seed(1)
  #Nombre du découpage pour le test de précision et les erreurs
  V <- 5
  #Nombre d'occurence dans nos données
  nbOccurence <-nrow(donneesBrutes)
  #Tableau des différents parties
  taille <- nbOccurence %/% V
  #Mélange des données pour éviter les tri
  donneesBrutes <- donneesBrutes[as.factor(sample(rownames(donneesBrutes))),]
  arbreDecisionPredictions<-c()
  arbreDecisionPrecisions<-c()
  naivesBayesPrecisions<-c()
  naivesBayesPredictions<-c()
  knnPredictions <- c()
  knnPrecisions <- c()
  classifieurParDefaut <- CPD(donneesBrutes)
  for (v in 1:(V-1)){
    testIndex <- ((v - 1) * taille + 1):(v * taille)
    trainData <- donneesBrutes[-testIndex,]
    testData <- donneesBrutes[testIndex,]
    #Arbre de décision
    arbreDecisionP <- arbreDecisionPrediction(trainData, testData, variableCible)
    arbreDecisionPrecisions <- c(arbreDecisionPrecisions, precision(arbreDecisionP,testData))
    arbreDecisionPredictions <- c(arbreDecisionPredictions, arbreDecisionP)
    #Naives Bayes
    naivesBayesP <- naivesBayesPrediction(trainData, testData,variableCible)
    naivesBayesPrecisions <- c(naivesBayesPrecisions, precision(naivesBayesP,testData))
    naivesBayesPredictions <- c(naivesBayesPredictions, naivesBayesP)
    #Knn
    knnP <- knnPrediction(trainData, testData, variableCible)
    knnPrecisions <- c(knnPrecisions, precision(knnP, testData))
    knnPredictions <- c(knnPredictions, knnP)
  }
  #Pour avoir des parties de taille égal
  testIndex <- ((V - 1) * taille + 1):(dim(donneesBrutes)[1])
  trainData <- donneesBrutes[-testIndex,]
  testData <- donneesBrutes[testIndex,]
  #Arbre de décision
  arbreDecisionP <- arbreDecisionPrediction(trainData, testData,variableCible)
  arbreDecisionPrecisions <- c(arbreDecisionPrecisions, precision(arbreDecisionP,testData))
  arbreDecisionPredictions <- c(arbreDecisionPredictions, arbreDecisionP)
  #Naives Bayes
  naivesBayesP <- naivesBayesPrediction(trainData, testData,variableCible)
  naivesBayesPrecisions <- c(naivesBayesPrecisions, precision(naivesBayesP,testData))
  naivesBayesPredictions <- c(naivesBayesPredictions, naivesBayesP)
  #Knn
  knnP <- knnPrediction(trainData, testData, variableCible)
  knnPrecisions <- c(knnPrecisions, precision(knnP, testData))
  knnPredictions <- c(knnPredictions, knnP)

  print("Précision des algorithmes : Arbre de décision, Naives Bayes et Classifieur par défaut")
  print(paste("Arbre de décision :", precision(arbreDecisionPredictions,donneesBrutes)))
  #print(arbreDecisionPrecisions)
  print(paste("Naives Bayes :", precision(naivesBayesPredictions,donneesBrutes)))
  #print(naivesBayesPrecisions)
  print(paste("Classifieur par défaut :", precision(classifieurParDefaut,donneesBrutes)))
  #print(knnPrecision)
  print(paste("KNN : ", precision(knnPredictions, donneesBrutes)))

  print("")

  print("Comparaison des algorithmes avec McNemar")
  #Arbre de décision et Naives Bayes
  m<-mcNemar(arbreDecisionPredictions,naivesBayesPredictions)
  print(paste("Arbre de décision et Naives Bayes", mcnemar.test(m)$p.value))
  print(m)
  #Arbre de décision et Classifieur par défaut
  m<-mcNemar(arbreDecisionPredictions,classifieurParDefaut)
  print(paste("Arbre de décision et Classifieur par défaut",mcnemar.test(m)$p.value))
  print(m)
  #Classifieur par défaut et Naives Bayes
  m<-mcNemar(naivesBayesPredictions,classifieurParDefaut)
  print(paste("Classifieur par défaut et Naives Bayes",mcnemar.test(m)$p.value))
  print(m)
  #Arbre de décision et KNN
  m<-mcNemar(arbreDecisionPredictions,knnPredictions)
  print(paste("Arbre de décision et KNN", mcnemar.test(m)$p.value))
  print(m)
  #Naive et KNN
  m<-mcNemar(naivesBayesPredictions,knnPredictions)
  print(paste("Naive bayes et KNN", mcnemar.test(m)$p.value))
  print(m)
  #Classifieur par défaut et KNN
  m<-mcNemar(knnPredictions,classifieurParDefaut)
  print(paste("Classifieur par défaut et KNN",mcnemar.test(m)$p.value))
  print(m)
}

#Fonction pour récupérer la comparaison entre deux algo
mcNemar <- function (predictionsA, predictionsB){
  FauxFaux <- length(which(predictionsA==FALSE & predictionsB==FALSE))
  FauxVrai <- length(which(predictionsA==FALSE & predictionsB==TRUE))  
  VraiFaux <- length(which(predictionsA==TRUE & predictionsB==FALSE))
  VraiVrai <- length(which(predictionsA==TRUE & predictionsB==TRUE))
  m <- matrix(c(FauxFaux, FauxVrai, VraiFaux, VraiVrai), nrow=2, dimnames=list("Algorithmes B" = c("#wrong", "#correct"), "Algorithmes A" = c("#wrong", "#correct")))
  m
}

#Fonction pour récupérerles prédictions d'un arbre de décision
arbreDecisionPrediction <- function (trainData, testData, variableCible){
  testDataNoLab <- testData[,1:ncol(testData)-1]
  #Création de l'arbre
  arbre<-rpart(as.formula(paste(variableCible,"~.")), data=trainData, minsplit=80,cp=0.01,parms=list(split="gini"))
  #Prédictions avec les données de test
  predictions <- predict(arbre, testDataNoLab, type="class")    
  #Calcul et retour des résultats
  predictions==testData[,ncol(testData)]
}

#Fonction pour récupérer la précision 
precision <- function(model, testData){
  #Récupére la longueur de la valeur correct
  numCorrect<-length(which(model))
  #Récupére la précision en %
  numCorrect/dim(testData)[1]
}

#Fonction pour récupérerles prédictions d'un model de naives bayes
naivesBayesPrediction <- function (trainData, testData, variableCible){
  testDataNoLab <- testData[,1:ncol(testData)-1]
  #Création du modele de naives bayes
  naivesBayesModel<-naiveBayes(as.formula(paste(variableCible,"~.")),trainData)
  #Prédictions avec les données de test
  predictions <- predict(naivesBayesModel, testDataNoLab, type="class")  
  #Calcul et retour des résultats
  predictions==testData[,dim(testData)[2]]
}

#Fonction pour récupérer les predictions de KNN
knnPrediction <- function(trainData, testData, variableCible){
  testDataNoLab <- testData[,1:ncol(testData)-1]
  print(trainData[,ncol(trainData)])

  cl <- trainData[,ncol(trainData)] ------------------------ Here seems to be the problem
  knnModel <-knn(trainData,testData, cl)
  #Prédictions avec les données de test
  predictions <- predict(knnModel, testDataNoLab, type="class")  
  #Calcul et retour des résultats
  predictions==testData[,dim(testData)[2]]
}

#Fonction pour récupérerles prédictions du classifieur par défaut
CPD <- function (data){  
  cpd <- sort(table(data[,ncol(data)]))
  data[,ncol(data)]==names(cpd[length(cpd)])
}

0 个答案:

没有答案