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}.
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. –
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