59doit

[ R ] 인공신경망 #2 neuralnet 패키지이용 본문

통계기반 데이터분석

[ R ] 인공신경망 #2 neuralnet 패키지이용

yul_S2 2022. 12. 1. 11:25
반응형

neuralnet

LMS 머신러닝 교과교재

75-77pg

 

neuralnet패키지는 역전파(Backpropagation)알고리즘을 적용할 수 있다. 또한 가중치 망을 시각화하는 기능도 제공한다.

 

neuralnet()함수 : neuralnet(formula, data, hidden = 1, threshold = 0.01, stepmax = 1e+05, rep = 1, startweights = NULL, learningrate.limit = NULL, algorithm = "rprop+") 

formula: y ~ x형식으로 반응변수와 설명변수 식

data: 모델 생성에 사용될 데이터 셋

hidden = 1: 은닉층(hidden layer)의 수 지정

threshold = 0.01: 경계값 지정

stepmax = 1e+05: 인공신경망 학습을 위한 최대 스텝 지정

rep = 1: 인공신경마의 학습을 위한 반복 수 지정

startweights = NULL: 랜덤으로 초기화된 가중치를 직접 지정

learningrate.limit = NULL: backpropagation 알고리즘에서 사용될 학습비율을 지정

algorithm = "rprop+": backpropagation과 같은 알고리즘 적용을 위한 속성

 

 

 

ex ) neuralnet패키지를 이용한 인공신경망 모델 생성

 

#1  패키지 설치

install.packages("nnet")
library(nnet)

 

#2  데이터 셋 생성

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

dim(training_iris)
# [1] 105   5

dim(testing_iris)
# [1] 45  5

 

 

 

# 수치형으로 컬럼 생성

table(iris$Species)
# setosa versicolor  virginica 
# 50         50         50 
levels(iris$Species)
#[1] "setosa"     "versicolor" "virginica" 

table 함수 또는 levels 함수를 사용하여 iris Species 안의 세가지로 setosa versicolor  virginica 가 존재하는걸 먼저 확인한다.

 

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)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species2
# 123          7.7               2.8                6.7              2.0        3
# 45            5.1               3.8                1.9              0.4        1
# 104          6.3               2.9                5.6              1.8        3
# 105          6.5               3.0                5.8              2.2        3
# 126          7.2               3.2                6.0              1.8        3
# 23            4.6               3.6                1.0              0.2        1

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)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species2
# 1             5.1                3.5                1.4               0.2        1
# 6             5.4                3.9                1.7               0.4        1
# 7             4.6                3.4                1.4               0.3        1
# 8             5.0                3.4                1.5               0.2        1
# 12           4.8                3.4                1.6               0.2        1
# 13           4.8                3.0                1.4               0.1        1

Species2 에 각 변수 수치형으로 바꾸어서 담는다

training_iris$Species <- NULL 을 이용하여 컬럼명을 지운다

taininge_iris 와 testing_iris본다.

 

 

#4  <데이터 정규화>

#4 - 1 정규화 함수 정의

normal <- function(x) {
  return((x - min(x)) / (max(x) - min(x)))
}

정규화(Normalization): 데이터의 분포가 특정 범위 안에 들어가도록 조정하는 방법

( 모든 값을 0과 1 사이의 값으로 재표현, 확률값)      ( X – Min(X) ) / ( Max(X) – Min(X) )

 

cf) 표준화(Standardization): 동일한 평균을 중심으로 관측값들이 얼마나 떨어져 있는지를 나타내는 방법

( 표준화 변수 Z를 이용하여 N(0,1)로 표현)     (X – Xbar) / 표준편차

 

#4 - 2 정규화 함수를 이용하여 학습데이터/검정데이터 정규화

training_nor <- as.data.frame(lapply(training_iris, normal))
summary(training_nor)
# Sepal.Length     Sepal.Width      Petal.Length      Petal.Width         Species2     
# Min.   :0.0000   Min.   :0.0000   Min.   :0.00000   Min.   :0.00000   Min.   :0.0000  
# 1st Qu.:0.2222   1st Qu.:0.2727   1st Qu.:0.08475   1st Qu.:0.08333   1st Qu.:0.0000  
# Median :0.4167   Median :0.3636   Median :0.57627   Median :0.54167   Median :0.5000  
# Mean   :0.4288   Mean   :0.4056   Mean   :0.45811   Mean   :0.45317   Mean   :0.4762  
# 3rd Qu.:0.5833   3rd Qu.:0.5455   3rd Qu.:0.69492   3rd Qu.:0.70833   3rd Qu.:1.0000  
# Max.   :1.0000   Max.   :1.0000   Max.   :1.00000   Max.   :1.00000   Max.   :1.0000  


testing_nor <- as.data.frame(lapply(testing_iris, normal))
summary(testing_nor)
# Sepal.Length     Sepal.Width      Petal.Length      Petal.Width        Species2     
# Min.      :0.0000   Min.       :0.0000   Min.   :0.00000   Min.   :0.0000   Min.   :0.0000  
# 1st Qu. :0.2121   1st Qu.  :0.3182   1st Qu.:0.07407   1st Qu.:0.1250   1st Qu.:0.0000  
# Median :0.4242   Median  :0.4545   Median :0.51852   Median :0.4583   Median :0.5000  
# Mean    :0.4370   Mean    :0.4434   Mean   :0.47901   Mean   :0.4694   Mean   :0.5556  
# 3rd Qu. :0.5758   3rd Qu. :0.5455   3rd Qu.:0.74074   3rd Qu.:0.7083   3rd Qu.:1.0000  
# Max.     :1.0000   Max.     :1.0000   Max.   :1.00000   Max.   :1.0000   Max.   :1.0000

# Error :  구조를 안맞춰 주면 error 뜬다 

training_iris$Species <- NULL
testing_iris$Species <- NULL

위의 두 과정을 만약 한쪽만 했다면 

testing_nor <- as.data.frame(lapply(testing_iris, normal))
# Error in Summary.factor(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, : 
#                             요인(factors)에 대하여 의미있는 ‘min’가 아닙니다.

testing_nor <- as.data.frame(lapply(testing_iris, normal)) 를 실행하였을때 오류가 발생한다.


 

#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
#                      [,1]
# [1,] -0.04753223
# [2,] -0.01084682
# [3,] -0.05053968
# [4,] -0.03421785
# [5,] -0.00307221
# [6,] -0.05055162
# [7,] -0.03987519
# [8,]  0.03050403
# [9,] -0.01122818
# [10,] -0.08698749
# [11,] -0.06260709
# [12,] -0.03774105
# [13,]  0.03761866
# [14,]  0.42838488
# [15,]  0.53462884
# [16,]  0.43568448
# [17,]  0.41630971
# [18,]  0.40699672
# [19,]  0.45935099
# [20,]  0.52433497
# [21,]  0.43765997
# [22,]  0.39649107
# [23,]  0.43846670
# [24,]  0.52815355
# [25,]  0.37442339
# [26,]  0.45152868
# [27,]  0.48836856
# [28,]  0.96689688
# [29,]  0.85128432
# [30,]  1.02088403
# [31,]  1.06855958
# [32,]  0.74965960
# [33,]  0.91888712
# [34,]  1.07762780
# [35,]  0.94827363
# [36,]  0.81157579
# [37,]  1.06876212
# [38,]  0.75987797
# [39,]  0.83580129
# [40,]  0.67324337
# [41,]  1.05297395
# [42,]  0.72082403
# [43,]  1.04129835
# [44,]  0.85485770
# [45,]  0.77413010

 

#6 - 2  상관관계 분석 – 상관계수로 두 변수 간 선형관계의 강도 측정

cor(model_result$net.result, testing_nor$Species2)
#                  [,1]
# [1,] 0.9733882

 

#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)
#                  [,1]
# [1,] 0.9733882
  • Neuralnet()함수 내 lerningrate 속성은 역전파 알고리즘을 적용할 경우 학습비율을 지정하는 속성

 

 

(2) 데이터 셋 구조 보기

  • 데이터 셋의 구조를 확인하는 함수: names(), attributes(), str()함수
  • names()함수 데이터 셋의 컬럼명 조회
  • attributes(): 열과 행 이름 및 자료구조 정보
  • str()함수: 자료구조, 관측치, 칼럼명과 자료형을 동시에 확인

 

반응형
Comments