我正在尝试使用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)])
}