RSNNS 패키지 역시 몇 개의 결과로 나눠지는 예측 모델을 학습할 수 있습니다. 앞서 학습했던 PIMA 인디언 당뇨 데이터로 확인해 보겠습니다. ( https://blog.naver.com/jjy0501/221448894556 참조)
library(RSNNS)
library(mlbench)
data(PimaIndiansDiabetes)
pima <- pimaindiansdiabetes="" span="">->
pima<-pima age="" c="" diabetes="" glucose="" mass="" pedigree="" pregnant="" pressure="" span="">-pima>
pima=subset(pima,glucose>0)
pima=subset(pima,pressure>0)
pima=subset(pima,mass>0)
set.seed(1234)
data1<-scale c="" pima="" span="">-scale>
data2<-pima c="" span="">-pima>
data=cbind(data1,data2)
data<-data .frame="" data="" span="">-data>
n = nrow(data)
train <- 600="" n="" sample="" span="">->
test <- data="" span="" train="">->
train <- data="" span="" train="">->
학습 데이터 전처리는 이전과 동일한 방법으로 준비하고 이를 RSNNS 로 학습하기 위해 입력 변수와 결과 변수로 나눕니다.
input_train=train[,c("pregnant","glucose","pressure","mass","pedigree","age")]
output_train=train[,c("data2")]
input_test=test[,c("pregnant","glucose","pressure","mass","pedigree","age")]
output_test=test[,c("data2")]
그런데 여기에서 0과 1로 입력되는 결과 변수를 학습시키기 위해서 이분형 매트릭스로 바꿔줄 필요가 있습니다.
output_train<-decodeclasslabels output_train="" span="">-decodeclasslabels>
output_test<-decodeclasslabels output_test="" span="">-decodeclasslabels>
output_test/train을 환경 창에서 클릭하면 다음과 같이 변환되었다는 사실을 알 수 있습니다.
이제 이를 학습시켜 결과를 구해 봅니다. 결과값은 소수점 이하까지 나오기 때문에 반올림을 위해서 round를 걸어줍니다.
mod<-mlp input_train="" maxit="300)</span" output_train="" size="c(5,5),">-mlp>
summary(mod)
mod
predictions <- input_test="" mod="" predict="" span="">->
round(predictions)
> round(predictions)
[,1] [,2]
3 0 1
4 1 0
5 0 1
18 1 0
24 1 0
25 0 1
28 1 0
30 1 0
41 0 1
47 0 1
56 1 0
58 1 0
59 0 1
62 1 0
68 0 1
70 1 0
80 1 0
94 1 0
95 1 0
99 1 0
101 0 1
106 1 0
116 0 1
117 0 1
122 1 0
123 1 0
130 1 0
141 1 0
154 1 0
165 0 1
185 0 1
195 1 0
212 0 1
216 0 1
217 1 0
219 1 0
227 1 0
229 0 1
231 1 0
233 1 0
234 1 0
235 1 0
237 0 1
239 0 1
244 0 1
247 1 0
252 1 0
261 0 1
269 1 0
271 0 1
273 1 0
276 1 0
280 1 0
284 1 0
286 1 0
295 1 0
304 0 1
305 1 0
306 1 0
310 0 1
315 0 1
316 1 0
317 1 0
320 0 1
323 1 0
325 1 0
328 0 1
329 1 0
334 1 0
355 1 0
368 1 0
374 1 0
384 1 0
402 1 0
414 1 0
428 0 1
430 0 1
이하 생략
결과를 해석하기 위해서 한 번 더 처리가 필요합니다.
pred<-round predictions="" span="">-round>
result<-cbind output_test="" pred="" span="">-cbind>
result<-data .frame="" result="" span="">-data>
result$V5=ifelse(result$X1==result$V3,1,0)
sum(result$V5)/124
> pred<-round predictions="" span="">-round>
>
> result<-cbind output_test="" pred="" span="">-cbind>
> result<-data .frame="" result="" span="">-data>
> result$V5=ifelse(result$X1==result$V3,1,0)
> sum(result$V5)/124
[1] 0.75
여기서는 결과를 pred라는 객체에 넣은 후 result에 본래 값과 합쳐 데이터 프레임으로 바꿔주고 결과와 예측값이 같은 경우를 살펴봤습니다. 그 결과 분류 정확도가 75%라는 결과를 얻었습니다. 나쁘지는 않지만, nnet 과 유사한 수준입니다. 여러 층의 은닉층을 만들 수 있지만, 결과가 딱히 더 좋지는 않은 셈입니다.
역시 여러 가지 옵션을 바꿀 수 있는데, 흥미롭게도 은닉층을 더 늘린다고 해서 더 좋은 결과가 나오지는 않습니다.
mod<-mlp input_train="" maxit="300)</span" output_train="" size="c(5,5,5),">-mlp>
summary(mod)
mod
predictions <- input_test="" mod="" predict="" span="">->
round(predictions)
output_test
pred<-round predictions="" span="">-round>
result<-cbind output_test="" pred="" span="">-cbind>
result<-data .frame="" result="" span="">-data>
result$V5=ifelse(result$X1==result$V3,1,0)
sum(result$V5)/124
> result<-cbind output_test="" pred="" span="">-cbind>
> result<-data .frame="" result="" span="">-data>
> result$V5=ifelse(result$X1==result$V3,1,0)
> sum(result$V5)/124
[1] 0.6774194
마지막으로 시각화 툴 역시 사용이 가능합니다.
library(devtools)
source_url('https://gist.githubusercontent.com/fawda123/7471137/raw/466c1474d0a505ff044412703516c34f1a4684a5/nnet_plot_update.r')
mod<-mlp input_train="" maxit="300,linOut=T)</span" output_train="" size="c(5,5),">-mlp>
par(mar=numeric(4),family='serif')
plot.nnet(mod)
여기에서도 두 가지 결과 변수를 선택하는 신경망이라는 점을 알 수 있습니다.
다음에는 로지스틱 회귀 분석에 대한 이야기를 해보겠습니다.
댓글
댓글 쓰기