Как выполнить рандомизацию лесного покрова в случайном порядке?


32

Это продолжение предыдущего поста: Алгоритмы машинного обучения для классификации земного покрова .

Похоже, что метод классификации случайных лесов (RF Forest ) набирает обороты в мире дистанционного зондирования. Я особенно заинтересован в РФ из-за многих ее сильных сторон:

  • Непараметрический подход, подходящий для данных дистанционного зондирования
  • Высокая заявленная точность классификации
  • Значение переменной сообщается

Учитывая эти сильные стороны, я хотел бы выполнить классификацию случайных лесных земель с использованием 4-полосных изображений высокого разрешения. Существует много материалов и исследований, рассказывающих о преимуществах Random Forest, но очень мало информации о том, как на самом деле выполнить классификационный анализ. Я знаком с RF-регрессией с использованием R и предпочел бы использовать эту среду для запуска алгоритма RF-классификации.

Как собрать, обработать и ввести данные обучения (т.е. на основе аэрофотоснимков CIR высокого разрешения) в алгоритм Random Forest с использованием R? Будем весьма благодарны за любые пошаговые рекомендации по созданию классифицированного растра растительного покрова.


Я пытаюсь понять эту растровую классификацию, так как я работаю над RF-классом (для распределения видов) с изображениями с разрешением 10 см. Поэтому я думаю, что не могу ввести точечные фигуры, а только растровые. Как я могу продолжить работу с * png или * tif-файлами?
Steveomb

Ответы:


29

Я не уверен, что понимаю, что вы подразумеваете под «сбором» данных. Если вы имеете в виду хедс-ап оцифровку и назначение классов, это лучше всего сделать в ГИС. Есть много бесплатных опций, которые подойдут (например, QGIS, GRASS). В идеале вы должны иметь полевые данные для обучения вашей классификации.

Процедура классификации с использованием случайных лесов довольно проста. Вы можете читать свои тренировочные данные (то есть, точечный шейп-файл), используя «rgdal» или «maptools», считывать свои спектральные данные, используя raster::stack, назначать растровые значения вашим тренировочным точкам, используя, raster:extractа затем передавать ихrandomForest, Вам нужно будет привести столбец «класса» в фактор, чтобы RF распознал модель как экземпляр классификации. Когда у вас есть модель соответствия, вы можете использовать функцию предсказания, передавая ее в растровый стек. Вам нужно будет передать стандартные аргументы для прогнозирования в дополнение к аргументам, специфичным для функции прогнозирования растра. Растровый пакет имеет возможность обрабатывать растры «вне памяти» и поэтому безопасен для памяти даже при работе с очень большими растрами. Одним из аргументов в функции прогнозирования растра является «имя файла», позволяющее записать растр на диск. Для задачи мультикласса вам нужно установить type = "response" и index = 1, которые будут выводить целочисленный растр ваших классов.

Есть несколько предостережений, которые следует отметить:

  1. Вы не можете иметь более 32 уровней в своей переменной ответа ( y ) или какой-либо фактор в правой части уравнения ( x )
  2. Ваши занятия должны быть сбалансированы. Правило 30% - это хорошее правило, которым нужно следовать, то есть если у вас на 30% больше наблюдений в одном классе, чем в любом другом, ваша проблема становится несбалансированной и результаты могут быть предвзятыми
  3. Это неправильно, что РФ не может переоценить. Если вы чрезмерно коррелируете свой ансамбль, вы можете переписать модель Хороший способ избежать этого - запустить предварительную модель и построить график стабилизации ошибок. Как правило, я выбираю 2X количество загрузок, необходимых для стабилизации ошибки для параметра ntree. Это потому, что переменное взаимодействие стабилизируется с меньшей скоростью, чем ошибка. Если вы не включили много переменных в модель, вы можете быть намного более консервативными с этим параметром.
  4. Не используйте чистоту узла как показатель переменной важности. Он не переставляется как среднее снижение точности.

У меня есть функции для выбора модели, дисбаланса класса и проверки в пакете 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)

Я видел довольно хорошие результаты, используя RF и функцию предиката () для определения покрытия навеса. Тем не менее, я не могу показать лучшие результаты, чем с алгоритмом ISODATA. Я подозреваю, что мои тренировочные образцы смещены или слишком много спектральных совпадений. Существует ли неконтролируемая реализация RF, которая может привести к лучшим результатам? Можно ли назначить количество классов на выходе, как вы бы алгоритм ISODATA?
Аарон

3
@ Аарон, можно запустить немаркированную (неконтролируемую) РФ, но с результатами трудно иметь дело. Я бы посоветовал взглянуть на метод RF-вменения, доступный в пакете YaImpute. Это может касаться некоторых проблем смещения / дисбаланса, с которыми вы сталкиваетесь.
Джеффри Эванс

5

Я знаю, что эта ветка немного старая, но для тех, кто хочет попробовать классифицировать данные дистанционного зондирования R, был выпущен очень многообещающий новый пакет.

install.packages("RSToolbox")

Он поставляется с функциями как для неконтролируемой, так и для контролируемой классификации (с использованием случайных лесов). Более подробную информацию можно найти здесь - http://bleutner.github.io/RStoolbox/


Это выглядит очень многообещающе, спасибо за вашу работу над этим пакетом. Одно уточнение, вы указываете случайные леса через каретку? Если это так, вы должны сделать это ОЧЕНЬ ясно в документации. Пакет каретки использует статистику разделения узлов, отличную от оригинального определения Breiman (2001). Статистика следует Strobl et al., (2007) и там, где предлагаемая статистика может быть действительной, я никогда не покупал ее условия моделирования. Кроме того, наблюдаемое смещение основано на вариации факторных уровней. Я предпочитаю исходную статистику энтропии и поэтому не использую каретку.
Джеффри Эванс

Привет Джеффри, боюсь, что я не автор пакета. Его подробности можно найти по ссылке, которую я предоставил.
JPD


0

Поскольку проблема здесь заключалась в классификации CIR-изображения высокого разрешения, я предлагаю не использовать традиционный подход (основанный на пикселях), используемый для спутниковых данных, а произвести анализ сегментации аэрофотоснимка и затем использовать классификатор (RF).


3
В тех случаях, когда это вполне обоснованный подход, не следует исходить из того, что основанная на агрегации классификация удовлетворяет потребностям пользователя. Сегментация должна применяться не только для решения задач вычислений, но и для достижения конкретных аналитических целей. Это не метод бланширования корзины, который автоматически заменяет методы на основе пикселей. Необходимо сбалансировать потерю информации из-за статистического / пространственного сглаживания с намеченным результатом. Если вас интересует пространственная вариация, сегментация может удалить ее. Результаты также могут сильно зависеть от параметров сегментации.
Джеффри Эванс

Я полностью согласен с вами, ведь каждый метод должен быть ориентирован на конкретные цели. Вот почему я предположил, что с CIR-изображениями высокого разрешения (которые, вероятно, имеют ограниченные спектральные полосы) набор переменных GEOBIA, который включает вспомогательные данные или значения текстуры, может значительно улучшить конечную точность классификации, особенно в сочетании с классификаторами, такими как RF.
Винсент
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.