Я не уверен, что понимаю, что вы подразумеваете под «сбором» данных. Если вы имеете в виду хедс-ап оцифровку и назначение классов, это лучше всего сделать в ГИС. Есть много бесплатных опций, которые подойдут (например, QGIS, GRASS). В идеале вы должны иметь полевые данные для обучения вашей классификации.
Процедура классификации с использованием случайных лесов довольно проста. Вы можете читать свои тренировочные данные (то есть, точечный шейп-файл), используя «rgdal» или «maptools», считывать свои спектральные данные, используя raster::stack
, назначать растровые значения вашим тренировочным точкам, используя, raster:extract
а затем передавать ихrandomForest
, Вам нужно будет привести столбец «класса» в фактор, чтобы RF распознал модель как экземпляр классификации. Когда у вас есть модель соответствия, вы можете использовать функцию предсказания, передавая ее в растровый стек. Вам нужно будет передать стандартные аргументы для прогнозирования в дополнение к аргументам, специфичным для функции прогнозирования растра. Растровый пакет имеет возможность обрабатывать растры «вне памяти» и поэтому безопасен для памяти даже при работе с очень большими растрами. Одним из аргументов в функции прогнозирования растра является «имя файла», позволяющее записать растр на диск. Для задачи мультикласса вам нужно установить type = "response" и index = 1, которые будут выводить целочисленный растр ваших классов.
Есть несколько предостережений, которые следует отметить:
- Вы не можете иметь более 32 уровней в своей переменной ответа ( y ) или какой-либо фактор в правой части уравнения ( x )
- Ваши занятия должны быть сбалансированы. Правило 30% - это хорошее правило, которым нужно следовать, то есть если у вас на 30% больше наблюдений в одном классе, чем в любом другом, ваша проблема становится несбалансированной и результаты могут быть предвзятыми
- Это неправильно, что РФ не может переоценить. Если вы чрезмерно коррелируете свой ансамбль, вы можете переписать модель Хороший способ избежать этого - запустить предварительную модель и построить график стабилизации ошибок. Как правило, я выбираю 2X количество загрузок, необходимых для стабилизации ошибки для параметра ntree. Это потому, что переменное взаимодействие стабилизируется с меньшей скоростью, чем ошибка. Если вы не включили много переменных в модель, вы можете быть намного более консервативными с этим параметром.
- Не используйте чистоту узла как показатель переменной важности. Он не переставляется как среднее снижение точности.
У меня есть функции для выбора модели, дисбаланса класса и проверки в пакете rfUtilities , доступном на CRAN.
Вот простой код для начала работы.
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)