Jak przeprowadzić klasyfikację pokrycia terenu w Random Forest?

32

Jest to kontynuacja poprzedniego postu: Algorytmy uczenia maszynowego dla klasyfikacji pokrycia terenu .

Wydaje się, że metoda klasyfikacji Random Forest (RF) nabiera dużego rozmachu w świecie teledetekcji. RF szczególnie mnie interesuje ze względu na wiele jego mocnych stron:

  • Nieparametryczne podejście dostosowane do danych z teledetekcji
  • Wysoka zgłoszona dokładność klasyfikacji
  • Podaje się zmienne znaczenie

Biorąc pod uwagę te mocne strony, chciałbym przeprowadzić klasyfikację gruntów w Losowym Lesie przy użyciu zdjęć w paśmie 4 w wysokiej rozdzielczości. Istnieje wiele materiałów i badań na temat zalet Losowego Lasu, ale bardzo mało informacji na temat tego, jak właściwie przeprowadzić analizę klasyfikacji. Znam regresję RF za pomocą R i wolałbym używać tego środowiska do uruchamiania algorytmu klasyfikacji RF.

Jak gromadzić, przetwarzać i wprowadzać dane szkoleniowe (tj. W oparciu o zdjęcia lotnicze CIR o wysokiej rozdzielczości) do algorytmu Random Forest za pomocą R? Byłoby bardzo mile widziane wszelkie porady dotyczące sposobu tworzenia sklasyfikowanego rastra pokrycia terenu.

Aaron
źródło
Próbuję zrozumieć tę klasyfikację rastrową, ponieważ pracuję nad klasą RF (do dystrybucji gatunków) z obrazami o rozdzielczości 10 cm. Myślę więc, że nie mogę wprowadzać kształtów punktów, a jedynie raster. Jak mogę postępować z plikami * png lub * tif?
steveomb

Odpowiedzi:

29

Nie jestem pewien, czy rozumiem, co rozumiesz przez „zbieranie” danych. Jeśli masz na myśli digitalizację i przypisywanie klas do pojedynków, najlepiej to zrobić w GIS. Istnieje wiele bezpłatnych opcji, które byłyby odpowiednie (np. QGIS, GRASS). Idealnie byłoby mieć dane terenowe do trenowania klasyfikacji.

Procedura klasyfikacji za pomocą lasów losowych jest dość prosta. Możesz odczytać dane treningowe (tj. Plik kształtu) za pomocą „rgdal” lub „maptools”, odczytać dane spektralne za pomocą raster::stack, przypisać wartości rastrowe do punktów treningowych za pomocą, raster:extracta następnie przekazać to dorandomForest. Będziesz musiał przekonwertować kolumnę „klasy” na czynnik, aby RF rozpoznał model jako instancję klasyfikacji. Gdy już masz model dopasowania, możesz użyć funkcji przewidywania, przekazując ją do stosu rastrowego. Będziesz musiał przekazać standardowe argumenty do przewidywania oprócz tych specyficznych dla funkcji przewidywania rastrowego. Pakiet rastrowy ma możliwość obsługi rastrów „poza pamięcią” i jako taki jest bezpieczny dla pamięci, nawet przy bardzo dużych rastrach. Jednym z argumentów funkcji przewidywania rastra jest „nazwa pliku” pozwalająca na zapisanie rastra na dysku. W przypadku problemu wieloklasowego musisz ustawić type = "response" i index = 1, co spowoduje wyświetlenie liczby całkowitej rastra twoich klas.

Należy pamiętać o kilku zastrzeżeniach :

  1. Nie możesz mieć więcej niż 32 poziomy w zmiennej odpowiedzi ( y ) lub dowolnym czynniku po prawej stronie równania ( x )
  2. Wasze klasy muszą być zrównoważone. Należy przestrzegać reguły 30%, to znaczy, jeśli masz więcej niż 30% obserwacji w jednej klasie niż jakakolwiek inna, twój problem staje się niezrównoważony, a wyniki mogą być stronnicze
  3. To mylące, że RF nie może się przewyższyć. Jeśli nadmiernie skorelujesz swój zespół, możesz dopasować model. Dobrym sposobem na uniknięcie tego jest uruchomienie wstępnego modelu i wykreślenie stabilizacji błędów. Jako ogólną zasadę wybieram 2x liczbę ładowań początkowych wymaganych do ustabilizowania błędu parametru ntree. Jest tak, ponieważ zmienna interakcja stabilizuje się wolniej niż błąd. Jeśli nie uwzględniasz wielu zmiennych w modelu, możesz być bardziej konserwatywny dzięki temu parametrowi.
  4. Nie używaj czystości węzłów jako miary o zmiennym znaczeniu. Nie jest permutowane jak średni spadek dokładności.

Mam funkcje wyboru modelu, nierównowagi klas i walidacji w pakiecie rfUtilities dostępnym na CRAN.

Oto prosty kod na początek.

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
źródło
Widziałem dość dobre wyniki za pomocą RF i przewidywania () w celu identyfikacji pokrycia czaszy. Nie wydaje mi się jednak, aby osiągać lepsze wyniki niż w przypadku algorytmu ISODATA. Podejrzewam, że moje próbki treningowe są tendencyjne lub zbyt duże nakładanie się widm. Czy istnieje nienadzorowana implementacja RF, która może dawać lepsze wyniki? Czy można przypisać liczbę klas do danych wyjściowych, tak jak algorytm ISODATA?
Aaron
3
@Aaron, możliwe jest uruchomienie RF bez etykiety (bez nadzoru), ale wyniki są trudne do zniesienia. Proponuję przyjrzeć się metodzie imputacji RF dostępnej w pakiecie YaImpute. Może to rozwiązać niektóre napotkane problemy związane z uprzedzeniami / nierównowagą.
Jeffrey Evans
5

Wiem, że ten wątek jest trochę stary, ale dla każdego, kto chce spróbować sklasyfikować dane z teledetekcji R, wydano bardzo obiecujący nowy pakiet.

install.packages("RSToolbox")

Zawiera funkcje zarówno do klasyfikacji bez nadzoru, jak i nadzorowanej (przy użyciu losowych lasów). Więcej informacji można znaleźć tutaj - http://bleutner.github.io/RStoolbox/

JPD
źródło
Wygląda to bardzo obiecująco, dziękuję za pracę nad tym pakietem. Jedno wyjaśnienie, czy określasz losowe lasy za pomocą kursora? Jeśli tak, powinieneś to WYRAŹNIE wyjaśnić w dokumentacji. Pakiet Caret wykorzystuje inną statystykę podziału węzłów niż oryginalna definicja Breimana (2001). Statystyka jest zgodna ze Strobl i wsp., (2007), a tam gdzie proponowana statystyka może być poprawna, nigdy nie kupiłem jej warunków symulacji. Dodatkowo zaobserwowane odchylenie opiera się na zmienności poziomów czynnikowych. Wolę oryginalną statystykę entropii i jako taki nie używam karetki.
Jeffrey Evans,
Cześć Jeffrey, boję się, że nie jestem autorem paczki. Jego dane można znaleźć pod linkiem, który podałem.
JPD,
2

Tu i tutaj są tutoriale na temat nadzorowanej klasyfikacji / regresji z R, która zawiera przykłady RandomForest.

Robert Hijmans
źródło
0

Ponieważ problemem tutaj było sklasyfikowanie obrazu CIR o wysokiej rozdzielczości, sugeruję, aby nie stosować tradycyjnego podejścia (opartego na pikselach) stosowanego do danych satelitarnych, ale aby przeprowadzić analizę segmentacji obrazu lotniczego, a następnie użyć klasy (RF).

Vincent
źródło
3
Jeżeli jest to dość uzasadnione podejście, nie można zakładać, że klasyfikacja oparta na agregacji spełnia potrzeby użytkownika. Segmentacji nie należy stosować wyłącznie w celu obliczenia wykonalności obliczeniowej, ale raczej w celu osiągnięcia określonych celów analitycznych. To nie jest metoda blanszowania koszyka, która automatycznie zastępuje metody oparte na pikselach. Utratę informacji należy zrównoważyć z powodu wygładzenia statystycznego / przestrzennego w stosunku do zamierzonego wyniku. Jeśli jesteś zainteresowany zmiennością przestrzenną, segmentacja może ją usunąć. Wyniki mogą również w dużym stopniu zależeć od parametrów segmentacji.
Jeffrey Evans
Całkowicie się z tobą zgadzam, w rzeczywistości każda metoda powinna być ukierunkowana na konkretne cele. Właśnie dlatego zasugerowałem, że przy obrazach CIR o wysokiej rozdzielczości (które prawdopodobnie mają ograniczone pasma widmowe) zestaw zmiennych GEOBIA, które zawierają dane pomocnicze lub wartości tekstury, może znacznie poprawić końcową dokładność klasyfikacji, szczególnie w połączeniu z klasyfikatorami takimi jak RF.
vincent