Ich bin nicht sicher, ob ich verstehe, was Sie unter "Sammeln" von Daten verstehen. Wenn Sie sich auf die Heads-up-Digitalisierung und Klassenzuweisung beziehen, ist dies am besten in einem GIS möglich. Es gibt viele freie Optionen, die geeignet wären (d. H. QGIS, GRASS). Idealerweise hätten Sie Felddaten, um Ihre Klassifizierung zu trainieren.
Das Verfahren zur Klassifizierung mit Random Forests ist recht einfach. Sie können Ihre Trainingsdaten (dh ein Punkt-Shapefile) mit "rgdal" oder "maptools" einlesen, Ihre Spektraldaten mit einlesen raster::stack
, die Rasterwerte mit Ihren Trainingspunkten zuweisen raster:extract
und diese dann übergebenrandomForest
. Sie müssen Ihre "Klassen" -Spalte in einen Faktor zwingen, damit RF das Modell als Klassifizierungsinstanz erkennt. Sobald Sie ein Anpassungsmodell haben, können Sie die Vorhersagefunktion verwenden und es an den Raster-Stack übergeben. Sie müssen zusätzlich zu den für die Raster-Vorhersagefunktion spezifischen Argumenten die Standardargumente für die Vorhersage übergeben. Das Rasterpaket kann Raster "außerhalb des Arbeitsspeichers" verarbeiten und ist daher auch bei sehr großen Rastern speichersicher. Eines der Argumente in der Raster-Vorhersagefunktion ist "Dateiname", mit dem ein Raster auf die Festplatte geschrieben werden kann. Für ein Problem mit mehreren Klassen müssen Sie type = "response" und index = 1 setzen, wodurch ein ganzzahliges Raster Ihrer Klassen ausgegeben wird.
Es gibt ein paar Vorsichtsmaßnahmen , die beachtet werden sollten:
- Ihre Antwortvariable ( y ) oder ein Faktor auf der rechten Seite der Gleichung ( x ) darf nicht mehr als 32 Ebenen enthalten.
- Ihre Klassen müssen ausgeglichen sein. Es empfiehlt sich, eine 30% -Regel zu befolgen. Wenn Sie also mehr als 30% mehr Beobachtungen in einer Klasse machen als in jeder anderen, ist Ihr Problem unausgewogen und die Ergebnisse können verzerrt sein
- Es ist eine Fehlbezeichnung, die RF nicht übertreffen kann. Wenn Sie Ihr Ensemble zu stark korrelieren, können Sie das Modell zu stark anpassen. Eine gute Möglichkeit, dies zu vermeiden, besteht darin, ein vorläufiges Modell zu erstellen und die Fehlerstabilisierung aufzuzeichnen. Als Faustregel wähle ich die doppelte Anzahl von Bootstraps, die erforderlich sind, um den Fehler für den Parameter ntree zu stabilisieren. Dies liegt daran, dass sich die variable Interaktion langsamer als der Fehler stabilisiert. Wenn Sie nicht viele Variablen in das Modell aufnehmen, können Sie mit diesem Parameter viel konservativer vorgehen.
- Verwenden Sie die Knotenreinheit nicht als Maß für die variable Bedeutung. Sie wird nicht wie die mittlere Abnahme der Genauigkeit permutiert.
Ich habe Funktionen für Modellauswahl, Klassenungleichgewicht und Validierung im rfUtilities- Paket, das auf CRAN verfügbar ist.
Hier ist ein einfacher Code, mit dem Sie loslegen können.
require(sp)
require(rgdal)
require(raster)
require(randomForest)
# CREATE LIST OF RASTERS
rlist=list.files(getwd(), pattern="img$", full.names=TRUE)
# CREATE RASTER STACK
xvars <- stack(rlist)
# READ POINT SHAPEFILE TRAINING DATA
sdata <- readOGR(dsn=getwd() layer=inshape)
# ASSIGN RASTER VALUES TO TRAINING DATA
v <- as.data.frame(extract(xvars, sdata))
sdata@data = data.frame(sdata@data, v[match(rownames(sdata@data), rownames(v)),])
# RUN RF MODEL
rf.mdl <- randomForest(x=sdata@data[,3:ncol(sdata@data)], y=as.factor(sdata@data[,"train"]),
ntree=501, importance=TRUE)
# CHECK ERROR CONVERGENCE
plot(rf.mdl)
# PLOT mean decrease in accuracy VARIABLE IMPORTANCE
varImpPlot(rf.mdl, type=1)
# PREDICT MODEL
predict(xvars, rf.mdl, filename="RfClassPred.img", type="response",
index=1, na.rm=TRUE, progress="window", overwrite=TRUE)