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:extract
a 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 :
- Nie możesz mieć więcej niż 32 poziomy w zmiennej odpowiedzi ( y ) lub dowolnym czynniku po prawej stronie równania ( x )
- 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
- 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.
- 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)