Data Analysis

R/머신러닝 & 딥러닝

[R] 인공신경망 관련 실습

Holy_Water 2022. 11. 10. 13:03

핵심함수

nnet(): 신경망 알고리즘을 만들어 주는 함수 

predict(): 분류예측치를 나타내는 함수

lappy(): lapply 함수는 list + apply를 의미하는 이름의 함수로, 실행 결과가 list 형태로 출력되는데, 리스트(list)의 인자는 length( 데이터 ) 만큼 생성된다.

neuralnet(): 인공신경망 모델 생성함수

cor(): 상관계수관련 값을 만드는 함수

 

 

#1단계: 패키지 설치

install.packages("nnet") #신경망 알고리즘 관련 페키지
library(nnet)

#2단계: 데이터 셋 생성

# 데이터프레임 생성 - 입력 변수(x)와 출력변수(y)

df = data.frame( 
  x2 = c(1:6),
  x1 = c(6:1),
  y = factor(c('no', 'no', 'no', 'yes', 'yes', 'yes'))
)
df
str(df)  #데이터 구조 확인

#3단계: 인공신경망 모델 생성
model_net = nnet(y ~ ., df, size = 1)  #신경망 알고리즘 만들기(size는 은닉층 수)

#4단계: 모델 결과 변수 보기
str(model_net) 

#5단계: 가중치(weights)보기
summary(model_net)

#6단계: 분류모델의 적합값 보기
model_net$fitted.values
model_net$fitted


#7단계: 분류모델의 예측치 생성과 분류 정확도
p <- predict(model_net, df, type = "class")
table(p, df$y)
p

#실습 (iris 데이터 셋을 이용한 인공신경망 모델 생성)
#1단계: 데이터 생성
data(iris)
idx = sample(1:nrow(iris), 0.7 * nrow(iris))
training = iris[idx, ]
testing = iris[-idx, ]
nrow(training)
nrow(testing)

#2단계: 인공신경망 모델(은닉층 1개와 은닉층 3개) 생성
model_net_iris1 = nnet(Species ~ ., training, size = 1)
model_net_iris1
model_net_iris3 = nnet(Species ~ ., training, size = 3)
model_net_iris3

#* 입력 변수의 갑들이 일정하지 않거나 값이 큰 경우에는 신경망 모델이 정상적으로 만들어지지 않기 때문에 입력 변수를 대상으로 정규화 과정이 필요하다.

 


#실습 (neuralnet패키지를 이용한 인공신경망 모델 생성)

#1단계: 패키지 설치

install.packages("neuralnet") 
library(neuralnet)

#2단계: 데이터 셋 생성

data('iris')
idx = sample(1:nrow(iris),0.7*nrow(iris))
training_iris = iris[idx,]
testing_iris = iris[-idx,]
dim(training_iris)
dim(testing_iris)

#3단계: 수치형으로 컬럼 생성

training_iris$Species2[training_iris$Species == 'setosa'] <- 1
training_iris$Species2[training_iris$Species == 'versicolor'] <- 2
training_iris$Species2[training_iris$Species == 'virginica'] <- 3

training_iris$Species <- NULL
head(training_iris)

testing_iris$Species2[testing_iris$Species == 'setosa'] <- 1
testing_iris$Species2[testing_iris$Species == 'versicolor'] <- 2
testing_iris$Species2[testing_iris$Species == 'virginica'] <- 3
testing_iris$Species <- NULL
head(testing_iris)

#4단계: 데이터 정규화
#4-1단계: 정규화 함수 정의

normal <- function(x) {
  return((x - min(x)) / (max(x) - min(x)))
}
#4-2단계: 정규화 함수를 이용하여 학습데이터/검정데이터 정규화
training_nor <- as.data.frame(lapply(training_iris, normal))
summary(training_nor)
testing_nor <- as.data.frame(lapply(testing_iris, normal))
summary(testing_nor)

#5단계: 인공신경망 모델 생성 – 은닉 노드 1개
model_net = neuralnet(Species2 ~ Sepal.Length + Sepal.Width + 
                        Petal.Length + Petal.Width,
                      data = training_nor, hidden = 1)
model_net
plot(model_net)

#6단계: 분류모델 성능 평가
#6-1단계: 모델의 예측치 생성 – compute()함수 이용

model_result <- compute(model_net, testing_nor[c(1:4)])
model_result$net.result

#6-2단계: 상관관계 분석 – 상관계수로 두 변수 간 선형관계의 강도 측정
cor(model_result$net.result, testing_nor$Species2)

#7단계: 분류모델 성능 향상 – 은닉층 노드 2개 지정, backprop속성 적용
#7-1단계: 인공신경망 모델 생성
model_net2 = neuralnet(Species2 ~ Sepal.Length + Sepal.Width +
                         Petal.Length + Petal.Width, 
                       data = training_nor, hidden = 2, 
                       algorithm = "backprop", learningrate = 0.01)

#7-2단계: 분류모델 예측치 생성과 평가
model_result <- compute(model_net, testing_nor[c(1:4)])
cor(model_result$net.result, testing_nor$Species2)