2010-11-16 18 views
4

J'ai un problème avec randomForest et le paquetage raster. Tout d'abord, je crée le classificateur:R problème avec la classification randomForest avec le paquet raster

library(raster) 
library(randomForest) 

# Set some user variables 
fn = "image.pix" 
outraster = "classified.pix" 
training_band = 2 
validation_band = 1 
original_classes = c(125,126,136,137,151,152,159,170) 
reclassd_classes = c(122,122,136,137,150,150,150,170) 

# Get the training data 
myraster = stack(fn) 
training_class = subset(myraster, training_band) 

# Reclass the training data classes as required 
training_class = subs(training_class, data.frame(original_classes,reclassd_classes)) 

# Find pixels that have training data and prepare the data used to create the classifier 
is_training = Which(training_class != 0, cells=TRUE) 
training_predictors = extract(myraster, is_training)[,3:nlayers(myraster)] 
training_response = as.factor(extract(training_class, is_training)) 
remove(is_training) 

# Create and save the forest, use odd number of trees to avoid breaking ties at random 
r_tree = randomForest(training_predictors, y=training_response, ntree = 201, keep.forest=TRUE) # Runs out of memory, does not allow more trees than this... 
remove(training_predictors, training_response) 

Jusqu'à présent, tout va bien. Je peux voir que la forêt a été créée correctement en regardant les taux d'erreur, la matrice de confusion, etc. Quand j'essaye de classer quelques données, cependant, je rencontre des ennuis avec ce qui suit, qui renvoie tous les NA dans predictions:

# Classify the whole image 
predictor_data = subset(myraster, 3:nlayers(myraster)) 
layerNames(predictor_data) = layerNames(myraster)[3:nlayers(myraster)] 
predictions = predict(predictor_data, r_tree, type='response', progress='text') 

et donne cet avertissement:

Warning messages: 
1: In `[<-.factor`(`*tmp*`, , value = c(1, 1, 1, 1, 1, 1, ... : 
    invalid factor level, NAs generated 
(keeps going like this)... 

Toutefois, l'appel predict.randomForest fonctionne directement bien et retourne la predictions attendue (ce n'est pas une bonne option pour moi parce que l'image est grande, et je ne peux pas stocker l'ensemble matrice en mémoire):

# Classify the whole image and write it to file 
predictor_data = subset(myraster, 3:nlayers(myraster)) 
layerNames(predictor_data) = layerNames(myraster)[3:nlayers(myraster)] 
predictor_data = extract(predictor_data, extent(predictor_data)) 
predictions = predict(r_tree, newdata=predictor_data) 

Comment puis-je le faire fonctionner directement avec la version "raster"? Je sais que c'est possible, comme montré dans les exemples de predict{raster}.

+0

Sans données, ceci n'est pas facile à résoudre. J'ai eu des erreurs similaires quand mon ensemble d'entraînement et mon test n'avaient pas les mêmes niveaux de facteur, et cela était souvent dû à une mauvaise conversion (les variables numériques interprétées comme facteur, ou les valeurs numériques stockées en tant que caractère suite à une erreur dans les données). J'essaierais de comprendre ce qui entre et sort exactement. predict.raster fait pas mal de manipulation, donc il se peut que quelque chose ne fonctionne pas comme prévu. –

+0

Comme vous le voyez dans le code, les données d'apprentissage consistent en une classe (facteur) c'est-à-dire 125, 126, 127, 128, 129 ... et 26 variables numériques, à savoir 0 à 32768 (canaux de 16 bits). Comme je le dis, l'objet classificateur est créé correctement, et quand j'appelle predict.randomForest directement en utilisant des données dans une matrice plutôt que d'utiliser les données RasterLayer et que Raster prédisent, il produit les prédictions correctes ... Je pense que le problème pourrait être lié aux NA rampant quelque part, mais je ne peux pas localiser où. Y a-t-il un test que je pourrais utiliser pour exclure cela? – Benjamin

Répondre

0

Vous pouvez essayer d'imbriquer predict.randomForest dans la fonction writeRaster et d'écrire la matrice sous la forme d'un raster en morceaux, conformément au fichier pdf inclus dans le package raster. Avant cela, essayez l'argument 'na.rm = TRUE' lors de l'appel de predict dans la fonction raster. Vous pouvez également affecter des valeurs factices aux NA dans les rasters prédictifs, puis les réécrire ultérieurement en tant que NA à l'aide des fonctions du package raster.

En ce qui concerne les problèmes de mémoire lors de l'appel RF, j'ai eu une pléthore de problèmes de mémoire traitant des BRT. Ils sont immenses sur disque et en mémoire! (Un modèle devrait-il être plus complexe que les données?) Je ne les ai pas fait fonctionner de manière fiable sur des machines 32 bits (WinXp ou Linux). Parfois, ajuster l'attribution de mémoire Windows aux applications a aidé, et passer à Linux a aidé plus, mais je profite au maximum des machines Windows ou Linux 64 bits, puisqu'elles imposent une limite plus élevée (ou nulle) sur la quantité de mémoire que les applications peuvent prendre . Vous pourriez être en mesure d'augmenter le nombre d'arbres que vous pouvez utiliser en faisant cela.

+0

Merci pour la suggestion, mais à la fin, j'ai trouvé qu'appeler predict.randomForest récursivement pour les groupes de lignes de l'image est plus rapide que d'appeler la version "Raster" de prédire, donc problème évité pour le moment. – Benjamin