콘크리트 내구성 예측
인공신경망
콘크리트 압축 내구력에 대한 데이터
1030개의 콘크리트 예제, 구성요소를 나타내는 8개의 속성으로 이루어져 있음
mount of cement 콘크리트의 총량, slag 슬래그, ahs 회분, water 물superplasicizer 고성능감수제, coarse aggregate 굵은 골재fine aggregate 잔골재, aging time 숙성 시간
1. 데이터 준비와 탐구
> concrete = read.csv("C:/R/concrete.csv", header=T)
> str(concrete)
'data.frame': 1030 obs. of 9 variables:
$ cement : num 141 169 250 266 155 ...
$ slag : num 212 42.2 0 114 183.4 ...
$ ash : num 0 124.3 95.7 0 0 ...
$ water : num 204 158 187 228 193 ...
$ superplastic: num 0 10.8 5.5 0 9.1 0 0 6.4 0 9 ...
$ coarseagg : num 972 1081 957 932 1047 ...
$ fineagg : num 748 796 861 670 697 ...
$ age : int 28 14 28 28 28 90 7 56 28 28 ...
$ strength : num 29.9 23.5 29.2 45.9 18.3 ...
- 8개의 속성과 1개의 결과 변수(strength)로 구성되어 있다.
신경망은 입력 데이터가 0을 중심으로 좁게 형성되어 있을 때 잘 작동한다.
이를 위해 데이터를 정규화 or 표준화를 실시해주어야 한다.
- 데이터가 정규분포를 따른다면 scale() 함수를 통해 표준화
- 데이터가 비정규성을 따른다면 0~1로 정규화
cement 변수를 히스토그램으로 확인해보면 다음과 같다.
hist(concrete$cement)
normalize 함수를 만들어 모든 열들을 정규화 해주자
> # 정규화
> normalize = function(x){
+ return((x-min(x)) / (max(x)-min(x)))
+ }
> concrete_norm = as.data.frame(lapply(concrete, normalize))
> summary(concrete_norm$strength)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 0.2664 0.4001 0.4172 0.5457 1.0000
- strength를 확인해보면 0~1로 정규화 된 것을 볼 수 있다.
- lapply() 함수를 사용해 데이터의 각 열에 normalize 함수를 적용했다.
이제 train set와 test set을 3:1로 분리해주자
# train set, test set 3:1로 분리
concrete_train = concrete_norm[1:773, ]
concrete_test = concrete_norm[774:1030, ]
2. 데이터로 모델 훈련
concrete_train 데이터를 이용하여 모델을 훈련해주자
먼저 하나의 은닉 뉴런을 가진 단순한 신경망을 만들어볼 것이다.
> library(neuralnet)
> # 하나의 은닉 뉴런에 대한 단순한 ANN
> concrete_model = neuralnet(formula = strength ~ cement + slag +
+ ash + water + superplastic +
+ coarseagg + fineagg + age,
+ data = concrete_train)
> # network 시각화
> plot(concrete_model)
- plot(모델)을 이용하여 신경망을 시각화해볼 수 있다.
3. 모델 성능 평가
이 예제는 분류 문제가 아닌 수치 예측 문제이므로 모델의 정확도를 보기 위해 CrossTable을 사용할 수 없다.
모델의 성능을 평가하기 위해서는 예측된 콘크리트의 강도와 실제 값 사이의 상관관계를 측정해야 한다.
> # 모델 결과
> model_results = compute(concrete_model, concrete_test[, 1:8])
> # 강도값 예측
> predicted_strength = model_results$net.result
> # 예측값과 실제값의 상관 관계
> cor(predicted_strength, concrete_test$strength)
[,1]
[1,] 0.8063074
- compute(모델, 분석할 변수들) 함수를 사용해 test data에 대한 예측을 생성했다.
- 그 값의 net.results로 예측값을 predicted_strength에 저장해주었다.
- 예측값과 실제값의 상관계수를 cor을 통해 구하였다.
4. 모델 성능 향상 - 은닉 노드 수 늘리기
좀 더 복잡한 구성도를 가진 신경망은 어려운 개념을 학습하는 능력이 있다. (과적합의 위험도 있음)
이번에는 모델 성능을 향상 시키기 위해 은닉 노드 수를 1개에서 5개로 늘려보자
> # 5개 은닉 뉴런인 복잡한 뉴런망
> concrete_model2 = neuralnet(formula = strength ~ cement + slag +
+ ash + water + superplastic +
+ coarseagg + fineagg + age,
+ data = concrete_train, hidden = 5)
# network 시각화
> plot(concrete_model2)
- hidden = 5를 추가해주면 된다.
위에서 만들었던 신경망보다는 더 복잡해보인다!
위와 같이 모델의 성능을 평가해보면
> # 성능 평가
> model_results2 = compute(concrete_model2, concrete_test[, 1:8])
> predicted_strength2 = model_results2$net.result
> cor(predicted_strength2, concrete_test$strength)
[,1]
[1,] 0.9267753
- 은닉 노드 수를 늘리니 더 좋은 성능을 내는 것을 볼 수 있다.
5. 인공 신경망의 장단점
장점 | 단점 |
1. 디지털 컴퓨터에 인간 두뇌의 신경 연결을 흉내내 인간의 능력과 컴퓨터의 능력 사이의 간격을 좁힘 2. 인간들의 경험으로부터 학습하는 능력에 가까운 데이터 모방으로부터 일반화하고 학습하는 능력을 얻을 수 있음 |
1. 신경망의 훈련에 대한 결과는 신경망 내에 분포된 내부 가중치들이므로 사람의 사고과정을 설명하는 것과는 다르게 왜 그 대답이 유효한지에 대한 통찰을 제공하지 못함 2. 우리의 두뇌만큼 내부 동작이 미지에 둘러싸인 블랙박스임 |
'R > ML & DL 공부' 카테고리의 다른 글
[R] 와인 등급 예측 - 회귀트리, 모델트리 (0) | 2022.04.22 |
---|---|
[R] 의료비 예측 - 선형 회귀 (0) | 2022.04.22 |
[R] 휴대폰 스팸 분류 - Naive bayes (0) | 2022.04.20 |
[R] 독버섯 분류 - 분류 규칙 (OneR, Ripper) (0) | 2022.04.19 |
[R] 은행 대출 채무 여부 분류 - 의사결정트리 (0) | 2022.04.15 |