본문 바로가기
실전머신러닝

신경망분석(Neural Net) with R - 실전편

by 다빈치스탁 2020. 9. 10.
728x90
반응형

이론적 백그라운드는 지난번 포스트 2020/09/10 - [머신러닝 with R/데이터마이닝 with R] - 신경망분석(Neural Net) with R - 이론편 에서 상세히 다루었으니 이번에는 바로 실전에 돌입한다. 

 

우선 뉴널넷과  SVM의 성능비교를 위해서 stepwise 회귀분석과 비교를 실행해 보았다. 아래의 코드에서는 학습데이터와 테스트 데이터를 이분화하지 않고 단순히 잔차제곱합과 R^2 값만 계산하여 모델의 성능을 비교해봤지만 과적합 여부 등을 판단하기 위해서는 predict를 테스트데이터에 적용하여 어느 정도의 적중도가 있는지를 함께 검토해봐야 한다.

 

Python 에서는 train, test split 이런 api 도 제공을 하지만 R에서는 직접 만들어줘야 한다. 엄청 번거롭다. 그래서 다루지는 않았지만 시간적 여유가 되는 사람은 한번씩 해보면 좋다. mydatat 를 잘라서 한 300개는 학습시키고 나머지 200개 정도는 테스트 데이터로 쓰면 된다. 응용은 각자 알아서 진행하도록.

 

만약 아래의 3가지 방법 중 예측형 모델로 사용을 한다면 이론적 배경에서도 살펴보았듯이 좀 더 일반화된 추정방법인 SVM을 쓸 것 같다. 물론 어떻게 고도화하고 검증하는가에 따라 잘못된 선택일 수도 있다. 판단은 스스로 하시길.

#작업경로를 지정하는 명령어
setwd("")

#데이터 끌어오기(중회귀자료, 다수의 독립변수와 하나의 종속변수)
mydatat<-read.csv("multi.csv",
                  header=TRUE, na.strings = "")
mydatat
str(mydatat)

#install.packages("nnet")
library(nnet)

########################################################## STEPWISE
#우선 처음에 전체 데이터를 전부 입력해준다.
model1<-lm(mydatat$삼성전자~.,data=mydatat[,1:22])
#독립변수를 하나씩 제거해가면서 AIC가 최소가 되는 모델을 찾아본다.
model1<-step(model1,direction = "backward", trace=T)
summary(model1)

########################################################## NNET
yy<-as.matrix(mydatat$삼성전자,498,1)
xx<-as.matrix(mydatat[,1:22],498,22)
#여기서 size란 히든레이어의 수로 많이 늘릴수록 모델의 설명력은
#높아질수 있지만 과적합의 문제도 고려해야 한다. 적당히 하자. 
#파이썬의 경우 신경망을 설계할 때 dropout을 R은 decay로
#딱히 정해진 것은 없다. 인공지능을 학습할 때 이런 것들을
#key parameter 라고 부르는데 히든레이어를 무엇으로할지
#decay 드랍아웃 비율을 어느정도로 할지 등인데 이 파라메터에 대한
#정확한 답은 없다. 그저 많이 해보고 그 안에서 직관을 얻는 수 밖에.
nn<-nnet(yy~xx, size=3, decay=0.001, linout=T)
summary(nn)

cbind(yy, fitted.values(nn),residuals(nn))

#잔차의 제공ㅎ
sum(residuals(nn)^2)합
#nnet은 r^2 값을 summary에서 제공하지 않는다.
#모델의 설명력 : 일반94% vs 인공지능90% -> 별 차이없고 과적합도 의심.
1-var(residuals(nn))/var(yy)


########################################################## SVM
#install.packages("e1071")
library(e1071)
#svm 모델링 : type 은 분류인지 회귀인지 잘 정의를 해주어야 한다.
ss<-svm(yy~xx, type="eps-regression")
cbind(yy, predict(ss), yy-predict(ss))

#모델의 설명력 : 일반94% vs 인공지능90% vs SVM82%
#개인적으로 이게 더 설득력이 있어보인다.
#앞선 이론과정에서도 살펴보았듯  SVM은 좀 더 일반화된 
#회귀식을 추론하는 것과 유사해 단순히 모델의 설명력만
#가지고 판단하는 것보다는 훨씬 설득력이 있어보인다.
1-var(yy-predict(ss))/var(yy)

multi.csv
0.14MB

728x90
반응형

댓글