2014-06-12 5 views
2

J'ai joué avec le jeu de données de reconnaissance de chiffres MNIST et je suis bloqué. J'ai lu des documents de recherche et mis en œuvre tout ce que j'ai compris. Ce que j'ai fait, c'est que j'ai d'abord créé mon ensemble d'entraînement et de validation croisée pour évaluer mon classificateur, puis j'ai couru PCA sur mon test et mon train et après j'ai utilisé KNN et SVM pour effectuer la tâche de classification. Le principal problème auquel je suis confronté est que je dois exécuter PCA sur l'ensemble de l'ensemble, puis séparer mon ensemble d'apprentissage et de validation croisée ou les séparer, puis exécuter PCA individuellement sur le test de validation croisée et les ensembles d'apprentissage. Je m'excuse de demander les choses que j'ai déjà essayées parce que j'ai essayé les deux scénarios, dans le premier cas mon classificateur fonctionne brillamment, parce que je suppose que PCA utilise l'ensemble de données de test tout en créant les composants principaux. la raison de la partialité dans mon modèle, dans l'autre cas, la performance est autour de 20% à 30%, ce qui est très faible. Donc, je suis coincé comment dois-je affiner mon modèle, toute aide et conseil est très apprécié, j'ai collé mon code ci-dessous pour référence.Mauvaises performances sur l'ensemble de données de reconnaissance de chiffres MNIST

library(ggplot2) 
library(e1071) 
library(ElemStatLearn) 
library(plyr) 
library(class) 

import.csv <- function(filename){ 
    return(read.csv(filename, sep = ",", header = TRUE, stringsAsFactors = FALSE)) 
} 

train.data <- import.csv("train.csv") 
test.data <- train.data[30001:32000,] 
train.data <- train.data[1:6000,] 

#Performing PCA on the dataset to reduce the dimensionality of the data 

get_PCA <- function(dataset){ 
    dataset.features <- dataset[,!(colnames(dataset) %in% c("label"))] 
    features.unit.variance <- names(dataset[, sapply(dataset, function(v) var(v, na.rm=TRUE)==0)]) 
    dataset.features <- dataset[,!(colnames(dataset) %in% features.unit.variance)] 
    pr.comp <- prcomp(dataset.features, retx = T, center = T, scale = T) 
    #finding the total variance contained in the principal components 
    prin_comp <- summary(pr.comp) 
    prin_comp.sdev <- data.frame(prin_comp$sdev) 
    #print(paste0("%age of variance contained = ", sum(prin_comp.sdev[1:500,])/sum(prin_comp.sdev))) 
    screeplot(pr.comp, type = "lines", main = "Principal Components") 
    num.of.comp = 50 
    red.dataset <- prin_comp$x 
    red.dataset <- red.dataset[,1:num.of.comp] 
    red.dataset <- data.frame(red.dataset) 
    return(red.dataset) 
} 

#Perform k-fold cross validation 

do_cv_class <- function(df, k, classifier){ 
    num_of_nn = gsub("[^[:digit:]]","",classifier) 
    classifier = gsub("[[:digit:]]","",classifier) 
    if(num_of_nn == "") 
    { 
    classifier = c("get_pred_",classifier) 
    } 
    else 
    { 
    classifier = c("get_pred_k",classifier) 
    num_of_nn = as.numeric(num_of_nn) 
    } 
    classifier = paste(classifier,collapse = "") 
    func_name <- classifier 
    output = vector() 
    size_distr = c() 
    n = nrow(df) 
    for(i in 1:n) 
    { 
    a = 1 + (((i-1) * n)%/%k) 
    b = ((i*n)%/%k) 
    size_distr = append(size_distr, b - a + 1) 
    } 

    row_num = 1:n 
    sampling = list() 
    for(i in 1:k) 
    { 
    s = sample(row_num,size_distr) 
    sampling[[i]] = s 
    row_num = setdiff(row_num,s) 
    } 
    prediction.df = data.frame() 
    outcome.list = list() 

    for(i in 1:k) 
    { 
    testSample = sampling[[i]] 
    train_set = df[-testSample,] 
    test_set = df[testSample,]  

    if(num_of_nn == "") 
    { 
     classifier = match.fun(classifier) 
     result = classifier(train_set,test_set) 
     confusion.matrix <- table(pred = result, true = test_set$label) 
     accuracy <- sum(diag(confusion.matrix)*100)/sum(confusion.matrix) 
     print(confusion.matrix) 
     outcome <- list(sample_ID = i, Accuracy = accuracy) 
     outcome.list <- rbind(outcome.list, outcome) 
    } 
    else 
    { 

     classifier = match.fun(classifier) 
     result = classifier(train_set,test_set) 
     print(class(result)) 
     confusion.matrix <- table(pred = result, true = test_set$label) 
     accuracy <- sum(diag(confusion.matrix)*100)/sum(confusion.matrix) 
     print(confusion.matrix) 
     outcome <- list(sample_ID = i, Accuracy = accuracy) 
     outcome.list <- rbind(outcome.list, outcome) 
    } 
    } 
    return(outcome.list) 
} 

#Support Vector Machines with linear kernel 

get_pred_svm <- function(train, test){ 
    digit.class.train <- as.factor(train$label) 
    train.features <- train[,-train$label] 
    test.features <- test[,-test$label] 
    svm.model <- svm(train.features, digit.class.train, cost = 10, gamma = 0.0001, kernel = "radial") 
    svm.pred <- predict(svm.model, test.features) 
    return(svm.pred) 
} 

#KNN model 
get_pred_knn <- function(train,test){ 
    digit.class.train <- as.factor(train$label) 
    train.features <- train[,!colnames(train) %in% "label"] 
    test.features <- test[,!colnames(train) %in% "label"] 
    knn.model <- knn(train.features, test.features, digit.class.train) 
    return(knn.model) 
} 

=========================================== ================================

Répondre

4

Pensez à PCA comme une transformation que vous appliquez à vos données. Vous voulez que deux choses à retenir:

  1. Depuis l'ensemble de test simule une situation « monde réel » où vous obtenez des échantillons que vous ne voyez pas avant, vous ne pouvez pas utiliser le jeu d'essai pour quoi que ce soit, mais l'évaluation du classificateur.
  2. Vous devez appliquer la même transformation à tous les échantillons.

, vous devez donc appliquer PCA à l'ensemble de la formation, conserver les données de transformation, ce qui est deux informations:

  1. La moyenne vous soustrait des échantillons afin de les centraliser.
  2. La matrice de transformation, soit les vecteurs propres de la matrice de covariance

et appliquer la même transformation à l'ensemble de test.

+0

Nous vous remercions de votre aide et de vos conseils :). – user37940

+0

Si cela a aidé, envisager upvoting/acceptant :) –

+0

Je suis tellement reconnaissant à vous pour m'aider parce que j'ai obtenu une précision de 96,87% ce qui était incroyable, je suis désolé de ne pas voter parce qu'il ne cesse de dire que j'ai besoin une réputation de 15 pour le faire. – user37940

Questions connexes