블랙박스 : 입력값과 출력값만 알 수 있을 뿐, 구체적으로 시스템이 무슨 일을 하는지 모르는 것.
*+-
신경망의 학습 능력은 상호 연결된 뉴런의 토폴로지(또는 패턴과 구조)에 기인한다.
수많은 형태의 네트워크 구조가 있지만 세 개의 주요 특성에 따라 구별될 수 있다.
- 계층 개수
- 네트워크 정보가 역방향으로 이동할 수 있는지 여부
- 네트워크의 각 계층별 노드 개수
노드는 각각의 네모와 동그라미를 지칭한다.
입력층의 노드는 4개, 은닉층은 7개, 출력층은 3개의 노드를 가지고 있다.
계층은 연결되는 층의 수를 의미한다. 현 신경망은 총 4개의 계층을 가지며, 은닉층은 2개의 계층을 가진다.
# Artificial eural Network(인공지능 신경망)
#f(x) = 2, +1
curve(expr= 2 * x + 1, from= -5, to= 5)
# Sigmoid 함수: f(x) = 1/(1+exp(-x))
curve(expr=1/(1 + exp(-x)), from= -10, to = 10) # 0 ~ 1
# hypobolic tangent: f(x) = tanh(x)
curve(expr = tanh(x), from = -5, to =5) # -1 ~ 1
# 콘크리트의 강도 예측
# 1. 데이터 준비
concrete <- read.csv(file = 'mlwr/concrete.csv')
# 데이터 확인, 전처리
str(concrete)
#정규화(Normalization): 실제값 -> 0~1 사이의 값으로 변환
#표준화(Standardization): z-score 표준화(평균, 표준편차)
normalization <- function(x) {
return((x - min(x))/(max(x)-min(x)))
}
concrete_norm<- as.data.frame(lapply(concrete,normalization))
summary(concrete_norm)
l <- lapply(concrete, normalization)
>> 이것을 as.data.frame함수를 통해 데이터프레임으로 변환해주는 것 !
# 신경망 알고리즘을 적용하기 위한 패키지 : neuralnet
# 오차 역전파(backpropagation)를 사용해서 신경망을 훈련시키는 알고리즘
install.packages('neuralnet')
library(neuralnet)
#3. 모델 생성, 학습
# 학습 데이터 세트(75%)/ 테스트 데이터 세트(25%)
1030*0.75 #772.5
concrete_train <- concrete_norm[1:773,] # 훈련 데이터
concrete_test <- concrete_norm[774:1030,] # 테스트 데이터
> summary(concrete_train$strength)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 0.2655 0.3921 0.4152 0.5469 0.9894
# 신경망 모델 생성
set.seed(12345) # 수업용 난수 고정
# 생성된 NN을 확인 # 순환 망 그래프 출력
plot(concrete_model)
# 4. 만들어진 NN을 평가 - 테스트 데이터 세트에 적용
model_result <- compute(concrete_model, concrete_test[-9])
head(model_result) # 신경망 모델에 의해서 계산된 strength 예측값
summary(model_result)
predict_result <- model_result$net.result
# 예측 결과와 실제 값의 상관 관계 - 상관 계수
cor(predict_result, concrete_test$strength)
[,1]
[1,] 0.8064656
concrete_test[255:257,9]
[1] 0.5226112 0.6569079 0.6263859
# 평균 절대 오차
MAE <- function (actual, predict){ return(mean(abs(actual-predict))) }
MAE(concrete_test$strength, predict_result)
[1] 0.09334371
#모델 향상 # hidden node 증가!
model2 <- neuralnet(formula = strength ~.,
data = concrete_train,
hidden =2)
plot(model2)
# hidden node = 5
model5 <- neuralnet(formula = strength ~.,
data = concrete_train,
hidden =5)
plot(model5)
# 성과 측정 node 2
model2_result <- compute(model2, concrete_test[-9]) # 9열 strength 제외, 예측 모델을 담은 리스트
predict_result2 <- model2_result$net.result # 결과값만 떼어낸 배열
# 예측 결과와 실제 값의 상관 관계 - 상관 계수
cor(predict_result2, concrete_test$strength) #0.9024
concrete_test[255:257,9]
# 평균 절대 오차
MAE(concrete_test$strength, predict_result2) # 0.0686
# 성과 측정 node 5
model5_result <- compute(model5, concrete_test[-9])
predict_result5 <- model5_result$net.result
# 예측 결과와 실제 값의 상관 관계 - 상관 계수
cor(predict_result5, concrete_test$strength) #0.9280
concrete_test[255:257,9]
# 평균 절대 오차
MAE(concrete_test$strength, predict_result5) # 0.0574
# 역 정규화(정규화 -> 실제값) 함수 작성
max_st<-max(concrete$strength)
min_st<-min(concrete$strength)
max_st
min_st
denormalization <- function(x) {
max_str <- max(concrete$strength)
min_str <- min(concrete$strength)
return((x*(max_str-min_str))+min_str)
}
str(model_result$net.result)
concrete_denorm<- denormalization(model_result$net.result)
concrete_denorm2<- denormalization(model2_result$net.result)
concrete_denorm5<- denormalization(model5_result$net.result)
# concrete 원본과 비교한 상관계수 + 평균 절대 오차
concrete_strength <- as.data.frame(concrete$strength)
concrete_strength_test<- concrete_strength[774:1030,]
cor(concrete_denorm, concrete_strength_test) #cor1 0.8064
cor(concrete_denorm2, concrete_strength_test) #cor2 0.9024
cor(concrete_denorm5, concrete_strength_test) #cor5 0.9280
MAE(concrete_strength_test, concrete_denorm) #MAE 7.49
MAE(concrete_strength_test, concrete_denorm2) #MAE2 5.50
MAE(concrete_strength_test, concrete_denorm5) #MAE5 4.60
# neuralnet 함수의 파라미터 중에서
# hidden 파라미터는 은닉 노드와 은닉 계층의 갯수를 조정할 수 있고,
# act.fct 파라미터는 활성 함수를 바꿔줄 수 있습니다.
# 두 개의 파라미터를 활용해서 다른 신경망 모델을 만들어 보고,
# 예측 결과가 얼마나 개선되는 지 확인해 보세요.
set.seed(12345)
softsum <- function(x){
log(1 + exp(x))
}
curve(expr = softsum, from =-5, to = 5)
model <- neuralnet(formula = strength ~ .,
data = concrete_train, # 정규화된 데이터
hidden = c(5,3), # c(첫번째 층 노드 갯수, 두번째 층 노드 갯수)
act.fct = softsum # 활성함수
stepmax = 1e6)
algorithm did not converge in 1 of 1 repetition(s) within the stepmax
이런 오류 메세지가 뜨면 stepmax 값을 조정해 주어야 한다.
stepmax=1e5 가 기본값이다(105). 여기서 1e6(106), 1e7(107) 이런 방향으로 값을 올려준다.
plot(model)