xgBoost用于R中的土地覆被分类

迄今为止,我最喜欢的监督土地覆盖分类的方法是非常流行的随机森林。但是最近,我偶然发现了xgBoost算法,这使我感到非常好奇,因为它在机器学习竞赛平台Kaggle上获得了巨大的成功,在该平台上它赢得了好几次竞赛。因为我没有’我对这种方法不太了解,所以做了一些研究。总结本文,您将发现Random Forest和xgBoost之间的主要区别,以及使用R在Sentinel-2图像上运行xgBoost土地覆盖分类的最小示例。

 

随机森林vs.xgBoost

您可能会问什么不同?嗯,这两种方法都是基于决策树的集合,主要区别在于这些树的生长方式:

 

随机前额t是一个 装袋 减少方差的算法。我在下面找到了关于这个主题的很好的解释 stackexchange帖子:

假设您有非常不可靠的模型,例如决策树。 (为什么不可靠?因为如果您稍稍更改数据,则创建的决策树可能会大不相同。)在这种情况下,您可以通过以下方法构建健壮的模型(减少方差) 套袋 —套袋是指通过重新采样数据来创建不同的模型以使生成的模型更加健壮时。

我们称随机森林为应用于决策树的装袋法,但它’与其他套袋算法没什么不同。

你为什么想做这个?这取决于问题。但通常,非常需要模型稳定。

如果您仍然不是100%套袋的意思,这里有一个简短的说明 youtube视频 这将为您提供更多的见解。基本上可以说,Random Forst在 平行– each independently.

 

xgBoost 是一个 助推 算法,这是什么意思的很好解释,可以在相同的stackexchange帖子中找到:

提升可以减少方差,还可以减少偏差。由于您正在使用多个模型(装袋),因此可以减少差异。通过告诉后续模型哪些错误(增强部分)来训练后续模型,从而减少偏差。 […在这些合奏中,您的基础学习者 必须 虚弱。如果数据过拟合,将赢得’t是后续模型要建立的任何残差或误差。为什么这些好模型?嗯,像Kaggle这样的网站上的大多数比赛都是使用梯度增强树赢得的。数据科学是一门经验科学,“because it works” is good enough.

再次,这是一个简短的 youtube视频 可能会帮助您了解 提振 好一点。 xgBoost从以前的模型中学习并迭代增长(例如,通过查看残差逐步学习)。

 

xgBoost 101用于R中的土地覆盖

让’s快速地物分类!为此,我们需要两件事作为输入:

  • 卫星图像(我们将使用4 Band Sentinel-2堆栈作为最小示例)
  • 采样点

这是我使用QGIS可视化的输入数据的简短概述:

xgBoost分类的输入数据

xgBoost分类的输入数据

第1步– Load 数据 into R

library(raster)

shp <- shapefile("yourPath/samples.shp")
ras <- stack("yourPath/sentinel2_2348_clip.tif")

这就是我们的数据在R中的样子:

栅格

> ras
class : 栅格Stack 
dimensions : 1535, 1813, 2782955, 4 (nrow, ncol, ncell, nlayers)
resolution : 10, 10 (x, y)
extent : 624190, 642320, 5304770, 5320120 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=33 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
names : red, green, blue, nir 
min values : 820, 609, 377, 282 
max values : 3907, 3845, 5208, 5205

如您所见,栅格具有4个波段(红色,绿色,蓝色和nir),并且处于UTM 33投影状态。

形状文件

> shp
class : SpatialPointsDataFrame 
features : 346 
extent : 624751.2, 641951.9, 5304893, 5319267 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=33 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables : 1
names : class 
min values : 1 
max values : 5

shapefile包含346个点,并具有5​​个类:

  • 1 – Water
  • 2 – Reeds
  • 3 – Agriculture
  • 4 – Built-up
  • 5 – Forest

第2步–安装xgBoost软件包

在开始之前,我们需要做最后一件事:xgBoost R软件包–安装起来真的很简单,只需键入以下内容,然后再加载:

install.packages("xbgoost")
library(xgboost)

第三步–准备训练数据

现在我们需要准备训练数据:我们要做的第一件事是从栅格中提取每个采样点的值:

vals <- extract(ras,shp)

根据样本数量和栅格大小,这可能需要一段时间。如果花太长时间去喝杯咖啡! ðŸ™,现在我们应该将数据保存在数据框中。对于每个采样点(行),我们应该具有每个层(列)的光谱信息:

 red green blue nir
 [1,] 1484 1464 1115 375
 [2,] 1471 1468 1119 371
 [3,] 1493 1474 1151 376
 [4,] 1470 1435 1097 397
...

现在我们将数据框转换为矩阵–这对于xgBoost是必需的:

train <- 数据.matrix(vals)

我们几乎准备开始培训。最后一件事:记住我的班级如何从班级1开始到最多5? xgBoost是“diva” and doesn’这样。对于像我们这样的多类分类,类需要从0开始并转到n-1。让’s take care of this:

# We 必须 convert factors to numeric
# They 必须 be starting from number 0 to use multiclass
# For instance: 0, 1, 2, 3, 4...
classes <- as.numeric(as.factor(shp@data$class)) - 1

步骤4–训练xgBoost模型

训练xgBoost的过程比randomForest复杂得多,因为还有更多的超参数需要调整。找出正确的参数对于取得良好和稳定的结果非常重要。如果您对此主题感兴趣,请告诉我,我将为此撰写一篇指定的博客文章。现在,我将向您介绍几个很好地涵盖了此主题的网站(包括R代码):

众所周知,我将向您展示如何使用标准参数设置培训:

xgb <- xgboost(data = train, 
               label = classes, 
               eta = 0.1,
               max_depth = 6, 
               nround=100, 
               objective = "multi:softmax",
               num_class = length(unique(classes)),
               nthread = 3)

数据参数采用我们先前创建的从栅格提取的值矩阵。标签是我们重新分类的类,从0到4缩放。其他参数(以及可选的其他参数)需要在模型中分别进行调整。

第5步–使用模型对栅格进行分类

为此,您可以使用预测功能–就我而言,是一个小巧的版本:

# prediction on the raw 栅格 yielded an error. That's why I extract the values from the 栅格 and predict on them.
# Note: works only with small 栅格 or huge RAM. 让 me know if it works for you.
result   <- predict(xgb, ras[1:(nrow(ras)*ncol(ras))])

#create dummy result 栅格
res      <- 栅格(ras)

#fill in results and add a "1" to them (to get back to inital class numbering! - see above "Prepate 数据" for more information)
res      <- setValues(res,result+1)

Voila! We are done. 让s have a look at our result in QGIS:

xgboost_result-分类为R

xgboost_result– classified in R

 

分类看起来非常均匀(没有盐和胡椒粉效果)。特别是要记住,我们有相当复杂的类别,例如芦苇和农业,并且仅采样了约300个样本,并使用了4个输入频段。令人印象深刻!为了获得更好的结果,可能需要使用多个季节,增加波段或样本的数量并调整超参数。

Good luck building your classifier! 让 me know if you have any questions.

干杯

马丁

关于作者

马丁出生于捷克共和国,就读于维也纳自然资源与生命科学大学。他目前在GeoVille(一家位于奥地利的地球观测公司)工作,专门从事土地监测。他的主要兴趣是:开源应用程序,例如R,(地理空间)统计和数据管理,Web映射和可视化。他喜欢旅行,寻宝,摄影和运动。

11条留言

您可以在这篇文章中发表评论。


  • 优秀的帖子,非常有用。感谢分享!对于步骤5,您是否尝试过使用栅格数据包中的预测函数?另外raster :: beginCluster()和endCluster()可以通过并行化来加快预测速度。我在博客中(amsantac .co)写了一篇文章,展示了如何在您感兴趣的情况下实施该示例。再次感谢您的贡献!一世’我期待阅读您的下一篇文章!

    阿里 3年前 回复


    • 嘿,阿里!感谢您的好评!
      我实际上尝试过将栅格预测功能也与clusterR结合使用,但是我无法使其运行。 (使用randomForest,它可以完美运行)。如果您了解更多信息,请告诉我。
      干杯!
      附注:很棒的博客!

      马丁 3年前 回复


      • 有没有人能够使用rgg :: predict多核函数使用xgboost模型来预测类?您可以骇客地预测栅格效果很好,但是它只需要比RandomForest或BRT模型的多核预测更长的时间。

        埃文 2年前 回复


  • 您需要将点用作训练地点还是可以使用多边形?

    詹姆斯·马吉迪 2年前 回复


  • 你好

    如果我想在多边形样本上而不是在点样本上训练模型,将有什么解决方案?

    先感谢您

    迪诺 2年前 回复


  • 感谢您的有趣帖子!
    作为James和Dino,我非常想知道如何使用多边形样本作为训练场来完成相同的工作。
    再次感谢!

    保罗·塔科尼特 2年前 回复


  • 嘿马丁
    维也纳的问候。我从您的帖子中受益匪浅。我有一个栅格,栅格的sal值为0到10。我可以将其转换为某些类别,例如c(“CL1”, CL2″….etc)的批准功能。问题是当我将栅格另存为ascii时,存储的属性表不再存在。
    您能否建议一些有关如何存储栅格类别的选项,以便以后可以在此类栅格上阅读和可视化

    最良好的祝愿
    开发者

    开发人员 2年前 回复


  • 嗨,马丁,
    很棒的帖子,对我更好地了解XGB很有帮助。一世’m当前正在使用具有8GB RAM的〜230 MB栅格,并且您的预测方法效果很好(当然,这需要一些时间–但可以完成工作!)。
    谢谢!

    罗伯特 2年前 回复


  • 嗨,马丁,非常感谢您的发表’我真的很感激ðŸ™,
    I’我们找到了加快预测的方法。
    首先,您需要将栅格转换为data.frame:
    中密度纤维板<-data.frame(rasterToPoints(ras))

    然后,您可以使用本机XGBoost过程:
    结果%
    dplyr :: select(-x,-y)))

    希望有帮助

    特里斯坦 1年前 回复


    • 谢谢你的提示!您对大型栅格的体验如何?

      马丁 7个月前 回复


  • 所以这些类被合并为一个形状文件

    加扎尔·巴哈德 8个月前 回复


发表回复

*