Як здійснити класифікацію випадкових земельних покривів лісових випадків?


32

Це продовження попереднього допису: Алгоритми машинного навчання для класифікації земельних покривів .

Здається, що класифікаційний метод Random Forest (RF) набирає значних обертів у світі дистанційного зондування. Мене особливо цікавить РФ через багато її сильних сторін:

  • Непараметричний підхід підходить для даних дистанційного зондування
  • Висока точність класифікації
  • Повідомляється про змінну важливість

Враховуючи ці сильні сторони, я хотів би виконати класифікацію земельних ділянок випадкових лісів, використовуючи 4-смугові зображення високої роздільної здатності. Існує багато матеріалів та досліджень, що підтверджують переваги випадкового лісу, проте дуже мало інформації про те, як реально виконати класифікаційний аналіз. Я знайомий з РР регресією за допомогою R і вважаю за краще використовувати це середовище для запуску алгоритму класифікації РФ.

Як я можу збирати, обробляти та вводити дані тренувань (тобто на основі повітряних знімків високої роздільної здатності) в алгоритм Random Forest за допомогою R? Будемо дуже вдячні за будь-яку покрокову пораду щодо створення класифікованого растрового покриву.


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

Відповіді:


29

Я не впевнений, що я розумію, що ви маєте на увазі під "збиранням" даних. Якщо ви маєте на увазі підручну оцифрування та присвоєння класів, це найкраще зробити в ГІС. Є безліч безкоштовних варіантів, які були б підходящими (i..e, QGIS, GRASS). В ідеалі ви мали б польові дані для підготовки вашої класифікації.

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

Є кілька застережень, які слід зазначити:

  1. У вашій змінній відповіді ( у ) або будь-якому факторі праворуч рівняння ( х ) не може бути більше 32 рівнів
  2. Ваші заняття повинні бути збалансованими. Правило на 30% - це добре дотримуватися, тобто якщо у вас є більше 30% спостережень за одним класом, ніж будь-який інший, ваша проблема стає незбалансованою, і результати можуть бути упередженими
  3. Це неправильне значення, яке РФ не може перевиконати. Якщо ви більше співвіднесете свій ансамбль, ви зможете доповнити модель. Хороший спосіб уникнути цього - запустити попередню модель та побудувати схему стабілізації помилок. Як правило, я вибираю в 2 рази кількість завантажувальних рядів, необхідних для стабілізації помилки для параметра 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. Я підозрюю, що мої тренувальні зразки є упередженими, або є занадто велике спектральне перекриття. Чи існує непідконтрольне впровадженню РФ, яке може принести кращі результати? Чи можна присвоїти кількість класів виводу, як би ви алгоритм ISODATA?
Аарон

3
@Aaron, можна запустити немечену (непідконтрольну) РФ, але з результатами важко боротися. Я б запропонував ознайомитись з методом імпутації РФ, доступним у пакеті YaImpute. Це може вирішити деякі проблеми з ухилом / дисбалансом, з якими ви стикаєтесь.
Джеффрі Еванс

5

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

install.packages("RSToolbox")

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


Це виглядає дуже перспективно, дякую за вашу роботу над цим пакетом. Одне уточнення, ви вказуєте випадкові ліси через карету? Якщо це так, ви повинні зробити це ДУЖЕ чітко в документації. Пакет caret використовує іншу статистику розщеплення вузлів, ніж оригінальне визначення Breiman (2001). Статистика слідує за Strobl et al. (2007), і де запропонована статистика може бути дійсною, я ніколи не купував її умови моделювання. Крім того, спостережувана упередженість базується на різниці у факторних рівнях. Я віддаю перевагу оригінальній статистиці ентропії і як такий не використовую карет.
Джефрі Еванс

Привіт Джефрі, боюся, що я не автор пакету. Його деталі можна знайти за посиланням, яке я надав.
JPD


0

Оскільки проблема тут полягала в класифікації зображення CIR із високою роздільною здатністю, я пропоную не використовувати традиційний підхід (на основі пікселів), який використовується для супутникових даних, а зробити аналіз сегментації повітряного зображення і потім використовувати класифікатор (RF).


3
Якщо це цілком справедливий підхід, не слід робити припущення, що класифікація на основі агрегації відповідає потребам користувача. Сегментацію слід застосовувати не лише для вирішення простежуваності обчислень, а для досягнення конкретних аналітичних цілей. Це не метод збивання кошика, який автоматично замінює методи на основі пікселів. Потрібно збалансувати втрату інформації, обумовлену статистичним / просторовим згладжуванням, перед наміченим результатом. Якщо вас цікавить просторова варіація, сегментація може її видалити. Результати можуть також сильно залежати від параметрів сегментації.
Джефрі Еванс

Я повністю згоден з вами, адже кожен метод повинен бути орієнтований на конкретні цілі. Ось чому я припустив, що із зображеннями СІР високої роздільної здатності (які, ймовірно, мають обмежені спектральні смуги), набір змінних GEOBIA, що включає допоміжні дані або значення текстури, може значно підвищити кінцеву точність класифікації, особливо в поєднанні з класифікаторами, такими як РЧ.
Вінсент
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.