Làm thế nào để thực hiện phân loại che phủ rừng ngẫu nhiên?


32

Đây là phần tiếp theo của bài trước: Thuật toán học máy cho phân loại che phủ đất .

Có vẻ như phương pháp phân loại Rừng ngẫu nhiên (RF) đang đạt được nhiều động lực trong thế giới viễn thám. Tôi đặc biệt quan tâm đến RF do nhiều điểm mạnh của nó:

  • Một cách tiếp cận không tham số phù hợp với dữ liệu viễn thám
  • Độ chính xác phân loại báo cáo cao
  • Tầm quan trọng của biến được báo cáo

Với những thế mạnh này, tôi muốn thực hiện phân loại đất rừng ngẫu nhiên bằng hình ảnh 4 dải có độ phân giải cao. Có rất nhiều tài liệu và nghiên cứu đề cập đến những lợi thế của Rừng ngẫu nhiên, nhưng có rất ít thông tin tồn tại về cách thực sự phân tích phân loại. Tôi quen thuộc với hồi quy RF khi sử dụng R và muốn sử dụng môi trường này để chạy thuật toán phân loại RF.

Làm cách nào để tôi thu thập, xử lý và nhập dữ liệu huấn luyện (tức là dựa trên hình ảnh trên không CIR độ phân giải cao) vào thuật toán Rừng ngẫu nhiên bằng R? Bất kỳ lời khuyên khôn ngoan nào về cách sản xuất một raster che phủ đất được phân loại sẽ được đánh giá rất cao.


Tôi đang cố gắng hiểu phân loại raster này, vì tôi đang làm việc trên lớp RF (để phân phối loài) với hình ảnh có độ phân giải 10cm. Vì vậy, tôi nghĩ rằng tôi không thể nhập hình dạng điểm, nhưng chỉ raster. Làm cách nào tôi có thể tiến hành với * png hoặc * tif -files?
steveomb

Câu trả lời:


29

Tôi không chắc chắn rằng tôi hiểu ý của bạn khi "thu thập" dữ liệu. Nếu bạn đang đề cập đến số hóa và phân công các lớp học, thì điều này được thực hiện tốt nhất trong một hệ thống GIS. Có nhiều tùy chọn miễn phí sẽ phù hợp (ví dụ: QGIS, GRASS). Lý tưởng nhất là bạn sẽ có dữ liệu thực địa để đào tạo phân loại của bạn.

Quy trình phân loại sử dụng Rừng ngẫu nhiên khá đơn giản. Bạn có thể đọc trong dữ liệu huấn luyện của bạn (ví dụ, một shapefile điểm) sử dụng "rgdal" hoặc "maptools", đọc dữ liệu quang phổ của bạn sử dụng raster::stack, chuyển nhượng các giá trị raster đến các điểm đào tạo của bạn sử dụng raster:extractvà sau đó chuyển thông tin này đếnrandomForest. Bạn sẽ cần phải ép cột "lớp" của mình thành một yếu tố để RF nhận ra mô hình là một thể hiện phân loại. Khi bạn có một mô hình phù hợp, bạn có thể sử dụng chức năng dự đoán, chuyển nó vào ngăn xếp raster. Bạn sẽ cần phải vượt qua các đối số tiêu chuẩn để dự đoán ngoài các đối số cụ thể cho chức năng dự đoán raster. Gói raster có khả năng xử lý các raster "hết bộ nhớ" và như vậy là an toàn cho bộ nhớ, ngay cả với các raster rất lớn. Một trong những đối số trong chức năng dự đoán raster là "tên tệp" cho phép raster ghi vào đĩa. Đối với một vấn đề đa lớp, bạn sẽ cần đặt type = "reply" và index = 1, nó sẽ xuất ra một raster số nguyên của các lớp của bạn.

Có một số lưu ý cần lưu ý:

  1. Bạn không thể có nhiều hơn 32 cấp độ trong biến trả lời ( y ) hoặc bất kỳ yếu tố nào ở bên phải của phương trình ( x )
  2. Các lớp học của bạn phải được cân bằng. Quy tắc 30% là một quy tắc tốt để tuân theo, đó là nếu bạn có nhiều hơn 30% quan sát trên một lớp so với bất kỳ vấn đề nào khác, vấn đề của bạn trở nên mất cân bằng và kết quả có thể bị sai lệch
  3. Đó là một cách hiểu sai rằng RF không thể vượt quá. Nếu bạn quá tương quan với bộ đồng phục của bạn, bạn có thể phù hợp với mô hình. Một cách tốt để tránh điều này là chạy một mô hình sơ bộ và vẽ sơ đồ ổn định lỗi. Theo nguyên tắc thông thường, tôi chọn gấp 2 lần số bootstraps cần thiết để ổn định lỗi cho tham số ntree. Điều này là do tương tác biến ổn định ở tốc độ chậm hơn lỗi. Nếu bạn không bao gồm nhiều biến trong mô hình, bạn có thể thận trọng hơn nhiều với tham số này.
  4. Không sử dụng độ tinh khiết của nút làm thước đo tầm quan trọng của biến. Nó không được cho phép như độ chính xác giảm trung bình.

Tôi có các chức năng lựa chọn mô hình, mất cân bằng lớp và xác nhận trong gói rfUtilities có sẵn trên CRAN.

Đây là một số mã đơn giản để giúp bạn bắt đầu.

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)

Tôi đã thấy kết quả khá tốt khi sử dụng RF và dự đoán () để xác định độ che phủ của tán cây. Tuy nhiên, tôi dường như không thể tạo ra kết quả tốt hơn so với thuật toán ISODATA. Tôi nghi ngờ các mẫu đào tạo của tôi bị sai lệch, hoặc có quá nhiều sự chồng chéo quang phổ. Có một triển khai RF không giám sát có thể tạo ra kết quả tốt hơn không? Có thể gán số lượng lớp cho đầu ra, như thuật toán ISODATA không?
Aaron

3
@Aaron, có thể chạy RF không nhãn (không được giám sát) nhưng kết quả rất khó xử lý. Tôi sẽ đề nghị xem xét phương pháp cắt bỏ RF có sẵn trong gói YaImpute. Điều này có thể giải quyết một số vấn đề sai lệch / mất cân bằng mà bạn đang gặp phải.
Jeffrey Evans

5

Tôi biết rằng chủ đề này hơi cũ, nhưng đối với bất kỳ ai muốn thử phân loại dữ liệu viễn thám R, một gói mới rất hứa hẹn đã được phát hành.

install.packages("RSToolbox")

Nó đi kèm với các chức năng cho cả phân loại không giám sát và giám sát (sử dụng rừng ngẫu nhiên). Thông tin chi tiết có thể được tìm thấy ở đây - http://bleutner.github.io/RStoolbox/


Điều này có vẻ rất hứa hẹn, cảm ơn cho công việc của bạn trên gói này. Một làm rõ, bạn đang chỉ định rừng ngẫu nhiên thông qua dấu mũ? Nếu vậy, bạn nên làm cho RẤT rõ ràng trong tài liệu này. Gói caret sử dụng một thống kê phân chia nút khác với định nghĩa ban đầu của Breiman (2001). Thống kê theo Strobl và cộng sự, (2007) và khi thống kê được đề xuất có thể hợp lệ, tôi chưa bao giờ mua điều kiện mô phỏng của cô ấy. Ngoài ra, độ lệch quan sát được dựa trên sự thay đổi ở cấp độ giai thừa. Tôi thích thống kê entropy ban đầu và như vậy không sử dụng dấu mũ.
Jeffrey Evans

Xin chào Jeffrey, sợ rằng tôi không phải là tác giả của gói. Thông tin chi tiết của anh ấy có thể được tìm thấy tại liên kết tôi cung cấp.
JPD


0

Vì vấn đề ở đây là phân loại hình ảnh CIR có độ phân giải cao, tôi khuyên bạn không nên sử dụng phương pháp truyền thống (dựa trên pixel) được sử dụng cho dữ liệu vệ tinh, mà để tạo ra phân tích phân đoạn hình ảnh trên không và sau đó sử dụng bộ phân loại (RF).


3
Trong trường hợp đây là một cách tiếp cận khá hợp lệ, người ta không được đưa ra giả định rằng phân loại dựa trên tổng hợp đáp ứng nhu cầu của người dùng. Phân khúc không nên được áp dụng chỉ để giải quyết khả năng tính toán mà là để đáp ứng các mục tiêu phân tích cụ thể. Đây không phải là một phương thức blanch giỏ hàng tự động thay thế các phương thức dựa trên pixel. Người ta phải cân bằng việc mất thông tin, do làm mịn thống kê / không gian, so với kết quả dự định. Nếu bạn quan tâm đến phân khúc biến thể không gian có thể loại bỏ nó. Kết quả cũng có thể phụ thuộc nhiều vào các tham số phân đoạn.
Jeffrey Evans

Tôi hoàn toàn đồng ý với bạn, thực sự mỗi phương pháp nên được định hướng cho các mục tiêu cụ thể. Đây là lý do tại sao tôi đề xuất rằng với hình ảnh CIR có độ phân giải cao (có lẽ có dải phổ hạn chế), một bộ biến GEOBIA bao gồm dữ liệu phụ trợ hoặc giá trị kết cấu, có thể cải thiện đáng kể độ chính xác cuối cùng của phân loại, đặc biệt là khi được kết hợp với phân loại như RF.
vincent
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.