"수집"데이터의 의미를 이해하고 있는지 잘 모르겠습니다. 헤드 업 디지타이징 및 수업 할당을 언급하는 경우 GIS에서 가장 잘 수행됩니다. 적합한 많은 무료 옵션이 있습니다 (예 : QGIS, GRASS). 분류를 훈련시키기위한 필드 데이터가있는 것이 이상적입니다.
랜덤 포레스트를 사용한 분류 절차는 매우 간단합니다. "rgdal"또는 "maptools"를 사용하여 학습 데이터 (예 : 점 모양 파일)를 읽고을 사용하여 스펙트럼 데이터를 읽고 raster::stack
래스터 값을 사용하여 학습 포인트에 할당 raster:extract
한 다음randomForest
. RF가 모델을 분류 인스턴스로 인식하게하려면 "클래스"열을 요인으로 강제 변환해야합니다. 맞는 모델이 있으면 예측 기능을 사용하여 래스터 스택을 전달할 수 있습니다. 래스터 예측 기능과 관련된 것 외에도 예측하려면 표준 인수를 전달해야합니다. 래스터 패키지에는 래스터를 "메모리 부족"으로 처리 할 수있는 기능이 있으므로 매우 큰 래스터에서도 메모리가 안전합니다. 래스터 예측 기능의 인수 중 하나는 "파일 이름"으로 래스터를 디스크에 쓸 수 있습니다. 멀티 클래스 문제의 경우 클래스의 정수 래스터를 출력하는 type = "response"및 index = 1을 설정해야합니다.
주의 해야 할 몇 가지 주의 사항 이 있습니다.
- 반응 변수 ( y ) 또는 방정식 오른쪽의 인자 ( x )에 32 개 이상의 수준을 가질 수 없습니다
- 수업은 균형을 이루어야합니다. 30 % 규칙은 따라야 할 좋은 규칙입니다. 즉, 다른 클래스보다 한 클래스에서 30 % 이상의 관측치가있는 경우 문제가 불균형 해지고 결과가 편향 될 수 있습니다.
- RF가 과적 합할 수 없다는 것은 잘못된 이름입니다. 앙상블을 과도하게 연관 시키면 모델을 과적 합시킬 수 있습니다. 이를 피하는 좋은 방법은 예비 모델을 실행하고 오류 안정화를 플로팅하는 것입니다. 일반적으로 ntree 매개 변수의 오류를 안정화하는 데 필요한 부트 스트랩 수를 2 배로 선택합니다. 이는 가변 상호 작용이 오류보다 느린 속도로 안정화되기 때문입니다. 모델에 많은 변수를 포함하지 않으면이 매개 변수를 사용하여 훨씬 더 보수적 일 수 있습니다.
- 가변 순도를 측정하기 위해 노드 순도를 사용하지 마십시오. 정확도의 평균 감소처럼 변경되지 않습니다.
CRAN에서 사용 가능한 rfUtilities 패키지 에 모델 선택, 클래스 불균형 및 유효성 검사 기능이 있습니다.
다음은 시작하기위한 간단한 코드입니다.
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)