Wie führt man eine zufällige Waldflächenklassifizierung durch?

32

Dies ist eine Fortsetzung eines vorherigen Beitrags: Algorithmen für maschinelles Lernen zur Klassifizierung der Landbedeckung .

Es scheint, dass die Klassifizierungsmethode Random Forest (RF) in der Welt der Fernerkundung an Dynamik gewinnt. Ich interessiere mich besonders für RF aufgrund vieler seiner Stärken:

  • Ein nichtparametrischer Ansatz, der für die Fernerkundung von Daten geeignet ist
  • Hohe gemeldete Klassifizierungsgenauigkeit
  • Variable Wichtigkeit wird gemeldet

Angesichts dieser Stärken möchte ich eine zufällige Waldlandklassifizierung mit hochauflösenden 4-Band-Bildern durchführen. Es gibt viel Material und Forschung, um die Vorteile von Random Forest anzukündigen, aber es gibt nur sehr wenige Informationen darüber, wie die Klassifizierungsanalyse tatsächlich durchgeführt werden soll. Ich bin mit der RF-Regression unter Verwendung von R vertraut und würde es vorziehen, diese Umgebung zum Ausführen des RF-Klassifizierungsalgorithmus zu verwenden.

Wie sammle, verarbeite und gebe ich Trainingsdaten (dh basierend auf hochauflösenden CIR-Luftbildern) mit R in den Random Forest- Algorithmus ein? Alle schrittweisen Ratschläge zur Erstellung eines klassifizierten Landbedeckungsrasters sind sehr willkommen.

Aaron
quelle
Ich versuche diese Rasterklassifizierung zu verstehen, da ich an einer RF-Klasse (für die Artenverteilung) mit Bildern mit einer Auflösung von 10 cm arbeite. Ich kann also keine Punktformen eingeben, sondern nur ein Raster. Wie kann ich mit * png oder * tif -Dateien fortfahren?
Steveomb

Antworten:

29

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:extractund 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:

  1. Ihre Antwortvariable ( y ) oder ein Faktor auf der rechten Seite der Gleichung ( x ) darf nicht mehr als 32 Ebenen enthalten.
  2. 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
  3. 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.
  4. 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)
Jeffrey Evans
quelle
Ich habe ziemlich gute Ergebnisse bei der Verwendung von RF und predict () zur Identifizierung der Baldachinabdeckung gesehen. Ich kann jedoch keine besseren Ergebnisse erzielen als mit dem ISODATA-Algorithmus. Ich vermute, meine Trainingsmuster sind verzerrt oder es gibt zu viele spektrale Überlappungen. Gibt es eine unbeaufsichtigte Implementierung von RF, die möglicherweise zu besseren Ergebnissen führt? Ist es möglich, die Anzahl der Klassen wie beim ISODATA-Algorithmus dem Ausgang zuzuweisen?
Aaron
3
@Aaron, es ist möglich, eine nicht beschriftete (unbeaufsichtigte) RF auszuführen, aber die Ergebnisse sind schwer zu verarbeiten. Ich würde vorschlagen, sich die RF-Imputationsmethode anzusehen, die im YaImpute-Paket enthalten ist. Dies kann sich mit einigen der Probleme befassen, auf die Sie stoßen.
Jeffrey Evans
5

Ich weiß, dass dieser Thread ein wenig alt ist, aber für alle, die versuchen möchten, Fernerkundungsdaten zu klassifizieren R, wurde ein vielversprechendes neues Paket veröffentlicht.

install.packages("RSToolbox")

Es enthält Funktionen sowohl für die unbeaufsichtigte als auch für die überwachte Klassifizierung (mithilfe zufälliger Gesamtstrukturen). Weitere Informationen finden Sie hier - http://bleutner.github.io/RStoolbox/

JPD
quelle
Das sieht sehr vielversprechend aus, danke für Ihre Arbeit an diesem Paket. Eine Klarstellung, spezifizieren Sie zufällige Wälder durch Caret? In diesem Fall sollten Sie dies in der Dokumentation SEHR klarstellen. Das Caret-Paket verwendet eine andere Knotenaufteilungsstatistik als die ursprüngliche Breiman-Definition (2001). Die Statistik folgt Strobl et al. (2007) und wo die vorgeschlagene Statistik gültig sein könnte, habe ich ihre Simulationsbedingungen nie gekauft. Darüber hinaus basiert die beobachtete Verzerrung auf Schwankungen der Faktorwerte. Ich bevorzuge die ursprüngliche Entropiestatistik und verwende daher kein Caret.
Jeffrey Evans
Hallo Jeffrey, ich fürchte, ich bin nicht der Autor des Pakets. Seine Details finden Sie unter dem von mir angegebenen Link.
JPD
2

Hier und hier finden Sie Tutorials zur überwachten Klassifizierung / Regression mit R, die Beispiele für RandomForest enthalten.

Robert Hijmans
quelle
0

Da das Problem hier in der Klassifizierung eines hochauflösenden CIR-Bildes bestand, empfehle ich, nicht den herkömmlichen Ansatz (pixelbasiert) für Satellitendaten zu verwenden, sondern eine Segmentierungsanalyse des Luftbildes und anschließend den Classier (RF) zu erstellen.

Vincent
quelle
3
Wenn dies ein durchaus gültiger Ansatz ist, darf nicht davon ausgegangen werden, dass eine aggregationsbasierte Klassifizierung den Bedürfnissen des Benutzers entspricht. Die Segmentierung sollte nicht nur angewendet werden, um die Traktierbarkeit der Berechnungen zu untersuchen, sondern um bestimmte analytische Ziele zu erreichen. Dies ist keine Cart-Blanch-Methode, die pixelbasierte Methoden automatisch ersetzt. Man muss den Informationsverlust aufgrund statistischer / räumlicher Glättung gegen das beabsichtigte Ergebnis abwägen. Wenn Sie an der räumlichen Variation interessiert sind, kann diese durch Segmentierung entfernt werden. Die Ergebnisse können auch stark von Segmentierungsparametern abhängen.
Jeffrey Evans
Ich stimme Ihnen voll und ganz zu, in der Tat sollte jede Methode auf bestimmte Ziele ausgerichtet sein. Aus diesem Grund schlug ich vor, dass mit hochauflösenden CIR-Bildern (die wahrscheinlich begrenzte Spektralbänder aufweisen) ein GEOBIA-Variablensatz, der Zusatzdaten oder Texturwerte enthält, die endgültige Genauigkeit der Klassifizierung erheblich verbessern könnte, insbesondere wenn er mit Klassifizierern wie RF gekoppelt ist.
Vincent