차밍이

[R] 딥러닝 neuralnet 라이브러리 활용 인공신경망 모델 생성 및 예측 본문

R/데이터 사이언스

[R] 딥러닝 neuralnet 라이브러리 활용 인공신경망 모델 생성 및 예측

2020. 2. 19. 12:56
반응형

neuralnet 라이브러리

R에서 딥러닝 모델을 생성해서 사용할 수 있는 라이브러리입니다. neuralnet을 사용하면 인공신경망을 구성해서 신경망을 바탕으로 한 기초적인 모델 생성과 예측을 진행하겠습니다.

캘리포니아 대학에서 무료 배포한 콘크리트 구성물 데이터를 사용했습니다. 콘크리트의 강도를 예측하는 모델을 만들어보겠습니다. 데이터 구성이 어떻게 되는지 확인해보겠습니다.

concrete <- read.csv("C:/rstudio_bc/Data/dataset_for_ml/concrete.csv")
concrete
str(concrete)

수치형 데이터로 나타나있는 것을 확인할 수 있습니다. 위의 데이터를 보면 데이터들 간의 편차가 상당히 큰 것을 확인할 수 있습니다. 어떤 col은 1000 단위이고 어떤 col은 10 단위인 것을 확인할 수 있습니다.

표준화 or 정규화

언제 표준화를 하고 언제 정규화를 할까?

데이터 단위를 맞출 떄 표준화나 정규화를 해주는 것이 일반적입니다. 그렇다면 언제 표준화를 하고 언제 정규화를 하는지 의문이 발생합니다.

이 부분에 대해서 정확한 정답은 없습니다만, 일반적인 경우로 얘기해보겠습니다.

  • 데이터가 정규분포를 따른다면 정규화를 하도록 합니다.
  • 만약 정규분포를 따르지 않는다면 표준화를 해줍니다.

데이터 정규화

normalize<-function(x){
  return((x-min(x))/(max(x)-min(x)))
}
concrete_norm<-as.data.frame(lapply(concrete,norma ize))
summary(concrete_norm)

최솟값이 0으로 최댓값이 1로 정규화된 것을 확인할 수 있습니다.

  • 데이터 샘플링
# sample 안하고 그냥 나눔
concrete_train<- concrete_norm[1:773,]
concrete_test<-concrete_norm[774:1030,]

신경망 구성

library(neuralnet)
# 종속변수 strength를 찾기위해 concrete_train의 나머지 모든 열을 사용합니다.
# 모델 생성
concrete_model <- neuralnet(formula = strength~., data=concrete_train)
# hidden 값을 늘려서 모델 생성
concrete_model2 <- neuralnet(formula = strength~., data=concrete_train,hidden=5)
# 그래프 확인
plot(concrete_model)

hidden=1 신경망 구성
hidden=5 신경망 구성

신경망을 늘려서 에러가 줄어든 것을 확인할 수 있습니다.

실제 오차와 결과를 확인해보겠습니다.

모델 적용 및 결과 확인

# 편차 제곱 구하기 위한 함수
diff <- function(x,y){
  (x-y)^2
}

# 모델 적용해서 예측
model_results <- compute(concrete_model, concrete_test[1:8])
#실제 예측 값은 net.result 에 들어있음
pre_str <- model_results$net.result
# 결과값과 예측값의 상관관계를 분석해서 어느정도 맞아 들어가는지 확인
cor(pre_str,concrete_test$strength)
>>0.8059657
# 예측값과 label의 평균 제곱근 오차(Root Mean Square Error; RMSE) 확인
d <- diff(pre_str,concrete_test$strength)
RMSE <- (sum(d)/length(d))^(1/2)
RMSE
>>0.1199874

# hidden layer를 늘린 모델 결과 확인
model_results2 <- compute(concrete_model2, concrete_test[1:8])
pre_str2 <- model_results2$net.result
cor(pre_str2, concrete_test$strength)
>>0.9342866
d2 <- diff(pre_str2, concrete_test$strength)
RMSE2 <- (sum(d2)/length(d2))^(1/2)
RMSE2
>>0.07220195

hidden layer를 늘렸을 때, 결괏값과 label값과의 상관관계가 더 높게 나타난 것을 확인할 수 있습니다. 0.93 정도의 상관관계면 매우 높은 양의 상관관계를 나타낸다고 볼 수 있습니다. 또한 평균 제곱근 오차 RMSE가 훨씬 줄어들어 개선된 것을 알 수 있습니다. 신경망이 어느 정도까지 깊어지면 더 결과가 좋아지는 지도 확인해보면 좋을 것 같습니다.

지금까지 콘크리트 데이터를 신경망을 구성해서 강도를 예측하는 모델을 작성하였습니다.

전체 소스코드

concrete <- read.csv("C:/rstudio_bc/Data/dataset_for_ml/concrete.csv")
concrete
str(concrete)
# 표준화 할 것인지 정규화 할 것인지 고민해봐야한다.
# 정규화
normalize<-function(x){
  return((x-min(x))/(max(x)-min(x)))
}
str(concrete)
concrete_norm<-as.data.frame(lapply(concrete,normalize))
summary(concrete_norm)


# sample 안하고 그냥 나눔, 기존에 랜덤으로 들어가있음
concrete_train<- concrete_norm[1:773,]
concrete_test<-concrete_norm[774:1030,]

# neural network library 신경망 구성하기
library(neuralnet)
?neuralnet
#neuralnet 사용방법
neuralnet(formula, data, hidden = 1, threshold = 0.01,
          stepmax = 1e+05, rep = 1, startweights = NULL,
          learningrate.limit = NULL, learningrate.factor = list(minus = 0.5,
                                                                plus = 1.2), learningrate = NULL, lifesign = "none",
          lifesign.step = 1000, algorithm = "rprop+", err.fct = "sse",
          act.fct = "logistic", linear.output = TRUE, exclude = NULL,
          constant.weights = NULL, likelihood = FALSE)
# formula 작성법
# 종속변수(y값) ~ 독립변수(x값)
cols <- colnames(concrete_train)
cols[1:8]
concrete_model <- neuralnet(formula = strength~., data=concrete_train)
plot(concrete_model)
# sse = 오차 제곱의 합 = sum of square error

concrete_test[1:8]
# predict 는 compute로 한다.
model_results <- compute(concrete_model, concrete_test[1:8])
str(model_results) 
#실제 예측 값은 net.result 에 들어있음
pre_str <- model_results$net.result
# 결과값과 예측값의 상관관계를 분석해서 어느정도 맞아 들어가는지 확인할 수 있다.
cor(pre_str,concrete_test$strength)


diff <- function(x,y){
  (x-y)^2
}
d <- diff(pre_str,concrete_test$strength)
RMSE <- (sum(d)/length(d))^(1/2)
RMSE



## 히든 레이어 추가해서 돌려보기
concrete_model2 <- neuralnet(formula = strength~., data=concrete_train,
                             hidden=5)
plot(concrete_model2)
model_results2 <- compute(concrete_model2, concrete_test[1:8])
pre_str2 <- model_results2$net.result
cor(pre_str2, concrete_test$strength)
d2 <- diff(pre_str2, concrete_test$strength)
RMSE2 <- (sum(d2)/length(d2))^(1/2)
RMSE2
반응형

관련된 글 보기

Comments