Pre-Processing Data LiDAR dan Landsat 8 OLI using Support Vector Regression (SVR)

Data Canopy Cover yang digunakan dapat didownload pada Folder “…” Berikut merupakan package yang digunakan dalam pre-processing data menggunakan RStudio:

# install.packages(c("packages_name"))
# library(dbscan, readxl, dplyr, e1071, Boruta, dismo, caret, raster, openxlsx)

Langkah 1 - Set lokasi penyimpanan dan load file excel

library(openxlsx)

setwd('C:/Users/Felix/Dropbox/FORESTS2020/00AllData/')
load_data <- read.xlsx("Data Canopy Cover.xlsx")
head(load_data)
##   FID Shape Class      kategori frci   Band_1   Band_2   Band_3   Band_4
## 1 544 Point     1 Sangat Rendah    0 0.119028 0.096263 0.088627 0.067901
## 2 684 Point     1 Sangat Rendah    0 0.113155 0.089109 0.072956 0.050277
## 3 686 Point     1 Sangat Rendah    0 0.124964 0.104814 0.095479 0.100075
## 4 723 Point     1 Sangat Rendah    0 0.120681 0.099382 0.089137 0.079335
## 5 739 Point     1 Sangat Rendah    0 0.113995 0.090231 0.077047 0.051841
## 6 742 Point     1 Sangat Rendah    0 0.114693 0.091302 0.083048 0.052883
##     Band_5   Band_6   Band_7   Band_9
## 1 0.356388 0.246095 0.124561 0.001402
## 2 0.299869 0.164176 0.080432 0.001548
## 3 0.237620 0.215206 0.135871 0.001697
## 4 0.288038 0.236145 0.133857 0.001737
## 5 0.352246 0.195241 0.088700 0.001420
## 6 0.381807 0.207427 0.092613 0.001679
summary(load_data)
##       FID            Shape               Class         kategori        
##  Min.   :   0.0   Length:1047        Min.   : 1.00   Length:1047       
##  1st Qu.: 261.5   Class :character   1st Qu.: 4.00   Class :character  
##  Median : 523.0   Mode  :character   Median : 7.00   Mode  :character  
##  Mean   : 523.0                      Mean   : 6.18                     
##  3rd Qu.: 784.5                      3rd Qu.: 9.00                     
##  Max.   :1046.0                      Max.   :10.00                     
##       frci            Band_1           Band_2            Band_3       
##  Min.   :0.0000   Min.   :0.1051   Min.   :0.08066   Min.   :0.06139  
##  1st Qu.:0.3355   1st Qu.:0.1112   1st Qu.:0.08642   1st Qu.:0.06958  
##  Median :0.6408   Median :0.1143   Median :0.08960   Median :0.07287  
##  Mean   :0.5680   Mean   :0.1139   Mean   :0.08948   Mean   :0.07382  
##  3rd Qu.:0.8128   3rd Qu.:0.1162   3rd Qu.:0.09168   3rd Qu.:0.07679  
##  Max.   :1.0000   Max.   :0.1360   Max.   :0.11716   Max.   :0.09990  
##      Band_4            Band_5           Band_6            Band_7       
##  Min.   :0.03673   Min.   :0.1778   Min.   :0.08948   Min.   :0.03179  
##  1st Qu.:0.04273   1st Qu.:0.2993   1st Qu.:0.13215   1st Qu.:0.05226  
##  Median :0.04547   Median :0.3253   Median :0.15375   Median :0.06280  
##  Mean   :0.04873   Mean   :0.3236   Mean   :0.15736   Mean   :0.06931  
##  3rd Qu.:0.05039   3rd Qu.:0.3508   3rd Qu.:0.17137   3rd Qu.:0.07383  
##  Max.   :0.10473   Max.   :0.4551   Max.   :0.29533   Max.   :0.21130  
##      Band_9        
##  Min.   :0.000918  
##  1st Qu.:0.001532  
##  Median :0.001736  
##  Mean   :0.001762  
##  3rd Qu.:0.001960  
##  Max.   :0.002959

Langkah 2 - Sleksi dan Balencing Data

Setelah data file berhasil diload selanjutnya data dipilih sesuai dengan kebutuhan. Dalam kasus ini atribut data yang akan digunakan adalah (“Class, frci dan Band_2 sampai Band_7”). Kemudian data yang telah dipilih berdasarkan atribut dilakukan balancing berdasarkan jumlah Class yang memiliki nilai frekuensi terkecil. Tahapan seleksi dan balancing data sebagai berikut:

# Tahapan seleksi dan Balancing Data
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data <- load_data[, c("Class", "frci", "Band_2", "Band_3",
                      "Band_4", "Band_5", "Band_6", "Band_7")]
number <- data %>%
  group_by(Class) %>%
  summarize(n())
sample <- data %>%
  group_by(Class) %>%
  sample_n(min(number$`n()`))
head(sample)
## # A tibble: 6 x 8
## # Groups:   Class [1]
##   Class   frci Band_2 Band_3 Band_4 Band_5 Band_6 Band_7
##   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1     1 0.0349 0.0946 0.0850 0.0626  0.353  0.230 0.116 
## 2     1 0.0405 0.0901 0.0781 0.0547  0.324  0.186 0.0905
## 3     1 0.0544 0.0937 0.0850 0.0580  0.375  0.234 0.110 
## 4     1 0.0783 0.105  0.0964 0.0964  0.249  0.227 0.139 
## 5     1 0.0769 0.0930 0.0782 0.0583  0.280  0.165 0.0861
## 6     1 0.0248 0.101  0.0849 0.0875  0.179  0.233 0.211
sample <- sample[-1] ## Hapus column Class
head(sample)
## # A tibble: 6 x 7
##     frci Band_2 Band_3 Band_4 Band_5 Band_6 Band_7
##    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 0.0349 0.0946 0.0850 0.0626  0.353  0.230 0.116 
## 2 0.0405 0.0901 0.0781 0.0547  0.324  0.186 0.0905
## 3 0.0544 0.0937 0.0850 0.0580  0.375  0.234 0.110 
## 4 0.0783 0.105  0.0964 0.0964  0.249  0.227 0.139 
## 5 0.0769 0.0930 0.0782 0.0583  0.280  0.165 0.0861
## 6 0.0248 0.101  0.0849 0.0875  0.179  0.233 0.211

Langkah 3 - Menghapus Data Pencilan Menggunakan DBSCAN

Data yang telah diproses dalam Langkah 2, selanjutnya dilakukan pembulatan 3 angka dibelakang koma dan proses membuang outlier atau data pencilan menggunakan algoritma DBSCAN. Proses dapat dilihat seperti dibawah ini:

  1. Proses pembulatan 3 Angka dibelakang koma
  2. Menentukan nilai epsilon untuk menghapus data pencilan
library(dbscan)
lst <- as.data.frame(lapply(sample, function(x) round(x, 3)))
head(lst)
##    frci Band_2 Band_3 Band_4 Band_5 Band_6 Band_7
## 1 0.035  0.095  0.085  0.063  0.353  0.230  0.116
## 2 0.041  0.090  0.078  0.055  0.324  0.186  0.091
## 3 0.054  0.094  0.085  0.058  0.375  0.234  0.110
## 4 0.078  0.105  0.096  0.096  0.249  0.227  0.139
## 5 0.077  0.093  0.078  0.058  0.280  0.165  0.086
## 6 0.025  0.101  0.085  0.087  0.179  0.233  0.211
dataSample <- lst
head(dataSample)
##    frci Band_2 Band_3 Band_4 Band_5 Band_6 Band_7
## 1 0.035  0.095  0.085  0.063  0.353  0.230  0.116
## 2 0.041  0.090  0.078  0.055  0.324  0.186  0.091
## 3 0.054  0.094  0.085  0.058  0.375  0.234  0.110
## 4 0.078  0.105  0.096  0.096  0.249  0.227  0.139
## 5 0.077  0.093  0.078  0.058  0.280  0.165  0.086
## 6 0.025  0.101  0.085  0.087  0.179  0.233  0.211
# Nilai Epsilon yang digunakan 0.045
kNNdistplot(dataSample, k = 5)
change_data <- 0.045
abline(h = change_data, col = "red", lty = 2)

res <- dbscan(dataSample, eps = change_data, minPts = 5)
# Ploting sebaran data FRCI terhadap nilai Band Reflektan
pairs(dataSample, col = res$cluster + 1L)

Dalam proses ini kita telah memperoleh new data frame (“cleanall”) yang kita angap bebas dari outlier atau data pencilan, sehingga data frame inilah yang akan digunakan untuk proses membuat model menggunakan SVR.

dataSample$cluster <- res$cluster
cleanall <- dataSample %>% filter(cluster > 0)

# Ploting data sebelum dan sesudah dihapus outlier
par(mfrow=c(1,2))
plot(dataSample$Band_4, dataSample$frci, xlab = 'Band 4 Reflektan',
     ylab = 'Nilai FRCI', main = 'Sebelum')
plot(cleanall$Band_4, cleanall$frci, xlab = 'Band 4 Reflektan',
     ylab = 'Nilai FRCI', main = 'Sesudah')