보스턴 하우징 데이터 – 랜덤포레스트 방법의 회귀앙상블 모형
1) 데이터 읽기
> Boston$chas=factor(Boston$chas)
> Boston$rad=factor(Boston$rad)
> str(Boston)
'data.frame': 506 obs. of 14 variables:
$ crim : num 0.00632 0.02731 0.02729 0.03237 0.06905 ...
$ zn : num 18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
$ indus : num 2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
$ chas : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ nox : num 0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
$ rm : num 6.58 6.42 7.18 7 7.15 ...
$ age : num 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
$ dis : num 4.09 4.97 4.97 6.06 6.06 ...
$ rad : Factor w/ 9 levels "1","2","3","4",..: 1 2 2 3 3 3 5 5 5 5 ...
$ tax : num 296 242 242 222 222 222 311 311 311 311 ...
$ ptratio: num 15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
$ black : num 397 397 393 395 397 ...
$ lstat : num 4.98 9.14 4.03 2.94 5.33 ...
$ medv : num 24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...
Factor 함수를 이용하여 범주형으로 변경하고, medv 변수를 목표변수로 다른 변수를 입력변수로 사용한다.
2) 랜덤포레스트 방법의 실행
>library(randomForest)
> rf.boston<-randomForest(medv~.,data=Boston,ntree=100,mtry=5,importance=T,na.action=na.omit)
> rf.boston
Call:
randomForest(formula = medv ~ ., data = Boston, ntree = 100, mtry = 5, importance = T, na.action = na.omit)
Type of random forest: regression
Number of trees: 100
No. of variables tried at each split: 5
Mean of squared residuals: 9.743395
% Var explained: 88.46
> summary(rf.boston)
Length Class Mode
call 7 -none- call
type 1 -none- character
predicted 506 -none- numeric
mse 100 -none- numeric
rsq 100 -none- numeric
oob.times 506 -none- numeric
importance 26 -none- numeric
importanceSD 13 -none- numeric
localImportance 0 -none- NULL
proximity 0 -none- NULL
ntree 1 -none- numeric
mtry 1 -none- numeric
forest 11 -none- list
coefs 0 -none- NULL
y 506 -none- numeric
test 0 -none- NULL
inbag 0 -none- NULL
terms 3 terms call
함수 설명
ntree=100, 분류기 개수. 디폴트는 500개
mtry=5, 중간노드마다 랜덤하게 선택되는 변수들의 개수. 디폴트는 분류나무의 경우 sqrt(p), 회귀나무의 경우 p/3
importance=T, 변수의 중요도 계산, 디폴트는 F
na.action=na.omit, 결측치를 처리하는 방법, 변수의 중요도를 계산하게 하고, 결측치는 필요한 경우에만 삭제.
names()함수를 통해 rf.boston에 저장된 오브젝트의 리스트를 불러내어, $predicted를 이용하여 훈련 데이터의 예측 집단을 출력할 수 있다.
> names(rf.boston)
[1] "call" "type" "predicted" "mse" "rsq"
[6] "oob.times" "importance" "importanceSD" "localImportance" "proximity"
[11] "ntree" "mtry" "forest" "coefs" "y"
[16] "test" "inbag" "terms"
> head(rf.boston$predicted,30)
1 2 3 4 5 6 7 8 9 10
28.25382 22.55963 34.14192 35.45333 34.06798 26.81151 21.01950 16.78839 17.80599 19.23591
11 12 13 14 15 16 17 18 19 20
21.02440 21.23466 21.80889 20.05162 19.30557 20.21721 21.61349 18.46000 18.14724 19.96174
21 22 23 24 25 26 27 28 29 30
14.10136 18.55984 16.05801 15.04825 16.70996 15.70548 17.84748 14.82048 18.88633 20.64939
importance()함수를 통해 계산된 입력변수의 중요도를 알 수 있다.
> importance(rf.boston,type=1)
%IncMSE
crim 8.325232
zn 2.061869
indus 5.130483
chas 1.030915
nox 9.211906
rm 17.090802
age 5.229782
dis 8.322716
rad 5.342500
tax 4.604745
ptratio 7.102056
black 5.292651
lstat 14.652271
결과를 보면 rm변수과 lstat 변수의 중요도가 가장 높음을 알 수 있다.
함수 설명
type=1,은 정분류율의 평균감소값, 2는 불순도의 평균감소값을 이용하여 계산
목표변수의 적합값을 구하고 평가하기 위해 평균오차제곱합(mse)를 계산.
> names(Boston)
[1] "crim" "zn" "indus" "chas" "nox" "rm" "age" "dis" "rad"
[10] "tax" "ptratio" "black" "lstat" "medv"
> Boston$medv.hat = predict(rf.boston,newdata=Boston)
> mean((Boston$medv-Boston$medv.hat)^2) #mean square error(mse)
[1] 1.915207
기존 선형회귀 한 회귀 분류 나무 모형 결과의 평균오차제곱합 mean((Boston$medv-Boston$medv.hat)^2) = 10.8643 대비 랜덤포레스트의 평균오차제곱합이 1.915207로 설명력이 매우 증가되었음을 알 수 있다. 랜덤포레스트의 경우 부트스트랩을 이용하기 때문에 확률임의추출에 의한 변동성이 있을 수 있다. 따라서 모델링을 할 때 마다 결과가 다르기 때문에, 랜덤포레스트를 수차례 반복 시행하고 예측결과의 평균값을 취하는 경우도 있다.
(기존 보스턴 하우징 데이터 회귀나무모형 사례 분석 링크 바로가기)
랜덤 포레스트 회귀앙상블의 적합값과 실제값의 일치도를 보자. 예측일치도가 우수함을 알 수 있다.
> plot(Boston$medv,Boston$medv.hat,xlab='Observed Values',ylab='Fitted Values')
> abline(0,1)
기존 분류 회귀의 나무모형의 적합값과 실제값의 일치도와 비교해봐도 매우 우수함을 알 수 있다.
이 의사결정 나무를 활용하여 30% 검증 데이터에 적용시켜서 분류예측치를 구해보자. 그리고 그 예측치를 구해보자.
> set.seed(1234)
> nrow(Boston)
[1] 506
> i=sample(1:nrow(Boston),round(nrow(Boston)*0.7))
> Boston.train = Boston[i,] #70% for training data 훈련 데이터
> Boston.test = Boston[-i,] #30% for test data 검증 데이터
> rf.train.boston<-randomForest(medv~.,data=Boston.train,ntree=100,importance=T,na.action=na.omit)
#obtain the predicted values
> medv.hat.test<-predict(rf.train.boston,newdata=Boston.test)
> mean((Boston.test$medv-medv.hat.test)^2) #predicted mean square error
[1] 4.114596
검증 데이터에 대한 평균오차제곱합 mse는 4.11로 계산되었다. 기존 회귀 분류 나무모형 의 검증 데이터 오분류율 13.95258와 비교해보면 상당히 향상된 결과임을 알 수 있다.
(기존 보스턴 하우징 데이터 회귀나무모형 사례 분석 링크 바로가기)
출처: 데이터마이닝(장영재, 김현중, 조형준 공저)
'KNOU > 2 데이터마이닝' 카테고리의 다른 글
제4장 앙상블 모형 - 분류앙상블모형 - 부스팅 (0) | 2016.11.07 |
---|---|
제4장 앙상블 모형 - 분류앙상블모형 - 배깅 (0) | 2016.11.03 |
제4장 앙상블 모형 (0) | 2016.11.02 |
제3장 나무모형 - 회귀나무모형 (0) | 2016.10.26 |
제3장 나무모형 - 분류나무모형 (4) | 2016.10.18 |