이번 포스팅에선 변수에 따라 콘크리트 강도를 예측하는 모델을 신경망을 통해서 만들어 보겠다.
샘플 데이터는 아래 링크에서 다운로드할 수 있다.
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퍼)의 상관계수를 가진다.
'데이터분석 > with R' 카테고리의 다른 글
[R] R로 구현하는 서포트 벡터 머신(SVM) (0) | 2017.12.29 |
---|---|
[R] SVM 서포트 벡터 머신의 정의와 설명 (0) | 2017.12.28 |
[R] 암상자 기법과 신경망이론의 정의 및 구성 (0) | 2017.12.19 |
[R] 유클리드 거리 정의와 계산법 (0) | 2017.12.17 |
[R] R로 구현하는 KNN(게으른 학습) 알고리즘 - (2) (0) | 2017.12.16 |