이번 포스팅에선 변수에 따라 콘크리트 강도를 예측하는 모델을 신경망을 통해서 만들어 보겠다.

샘플 데이터는 아래 링크에서 다운로드할 수 있다.


https://archive.ics.uci.edu/ml/datasets/Concrete+Compressive+Strength




총 1030개의 데이터가 있으며, cement ~ age등의 정도에 따른 콘크르티의 strength 변수의 예측 모델을 만드는 것이 목표이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
## step.1 preparing the data #####
# 데이터 읽기와 구조 확인
concrete <- read.csv("concrete.csv",stringsAsFactors = TRUE)
str(concrete) # 신경망은 정규화를 해줘야 한다 
 
View(concrete)
#  정규화 함수
normalize<-function(x){
  return ((x-min(x))/(max(x)-min(x)))
}
 
# 전체 데이터 프레임에 정규화 적용
concrete_norm<-as.data.frame(lapply(concrete,normalize))
 
 
# 0과1 사이에 범위 확인
summary(concrete_norm$strength)
 
# 본래 데이터의 최소값, 최대값 비교
summary(concrete$strength)
 
# 훈련과 테스트 데이터 생성
concrete_train<-concrete_norm[1:773,]
concrete_test<-concrete_norm[774:1030,]
View(concrete_test)
cs


위는 데이터 전처리 과정에 대한 코드이다.


우선 csv를 불러오고, str로 살펴본 결과 데이터가 퍼져 있으며로 정규화 함수를 이용하여 정규화를 진행한다 

(KNN 구현 포스팅에 더 자세히 있다).


lapply 함수는 lapply(적용하고싶은 대상 변수, 적용할 함수) 식으로 구성하면 된다.

이렇게 정규화를 끝냈으면 이를 다시 7대 3으로 훈련용 데이터와 테스트 데이터로 분류한다


1
2
3
4
5
6
7
8
9
10
## Step 2: Training a model on the data ----
# neuralnet 모델 훈련
#install.packages("neuralnet")
library(neuralnet)
 
# 하나의 은닉 뉴런에 대한 단순한 ANN
concrete_model<- neuralnet(strength ~ 
                             cement + slag  + ash + water + superplastic + coarseagg +fineagg + age,
                           data = concrete_train)
 
cs


오늘 사용할 라이브러리는 neuralnet 라이브러리를 사용할 것이다.


neuralnet에서 신경망을 통한 모델 생성 역할을 담당하고 있는 라이브러리는 "neuralnet" 함수이다

(라이브러리 이름과 동일하다)

neuralnet 함수의 구성은 아래와 같다.



좀 더 자세히 설명하면,


neuralnet 함수의 제일 앞부분에는 target 변수(예측 하고싶은 변수 - 우리의 경우는 strength 이다) 

predictors 부분에는 위 타겟변수를 예측하는데 활용할 변수들을 쓴다


구분 기호는 위 예시처럼 +를 사용하면 되며, 다시 예를들어 neuralnet(A ~ B + C + D) 라고 한다면, 

A 변수를 B, C, D를 조합하여 예측한다는 것이다.


data 는 학습용 데이터 셋을 써주면 되고, hidden은 몇 개의 은닉층을 가질 것이냐에 대한 것이다.

(이 역시 이전 포스팅에 더 자세히 나와있다)


1
2
3
4
5
6
7
8
9
# 망(network) 시각화
plot(concrete_model)
 
## Step 3: Evaluating model performance ----
# 모델 결과
model_results<-compute(concrete_model, concrete_test[1:8]) #9는 예측값 
 
# 강도값 예측
predicted_strength<-model_results$net.result #예측값을 봐야하기때문에 net.result
cs


망 시각화를 해보고싶다면 plot 함수를 사용할 수 있지만, 어차피 봐도 모른다.


compute는 모델을 평가하는데 쓰이는 함수로, compte(평가에 사용할 모델,이 모델을 활용하여 분석할 변수들(cement ~ age))로 사용가능하다.

이렇게 결과를 model_results 변수에 담고, 이를 마지막으로 평가하기 위해서 net.result를 활용하여 예측된 강도값을 담는다


참고로 net.result 값 (예측된 strength 값들은 다음과 같다) 


이걸 수동으로 진짜 값과 맞는지 대조해볼수는 없는 노릇이다.

따라서 아래와 같이 예측값에 대한 평균적인 상관계수를 구할수 있다. 


1
2
3
4
# 예측값과 실제값간의 상관 관계 확인
# 결과 값이 다양하게 측정됨(매번 다르게 측정)
cor(predicted_strength,concrete_test$strength)
  #1에 가까울수록 좋다 
cs




즉 오늘 우리가 만든 모델은 0.8 (80퍼)의 상관계수를 가진다.




+ Recent posts