59doit
[ R ] 인공신경망 #2 neuralnet 패키지이용 본문
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 |
#3 수치형으로 컬럼 생성
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()함수: 자료구조, 관측치, 칼럼명과 자료형을 동시에 확인
'통계기반 데이터분석' 카테고리의 다른 글
[ R ] install.packages 오류 (0) | 2022.12.02 |
---|---|
[ R ] 서포트벡터머신 (SVM) (0) | 2022.12.01 |
[ R ] 인공신경망 #1 (0) | 2022.12.01 |
[ R ] 앙상블 #2 - 랜덤포레스트 예제 (0) | 2022.11.30 |
[ R ] 앙상블 #1 - 배깅 & 부스팅 & 랜덤포레스트 (0) | 2022.11.30 |