Neural Network은 인간 두뇌의 신경망을 흉내 내어 확보한 데이터로부터 반복적인 학습 과정을 거쳐 데이터에 숨어 있는 패턴을 찾아내는 모델링 기법이다.
매우 복잡한 구조를 가진 방대한 데이터 사이의 연관관계나 패턴을 찾아내고 이를 이용하여 향후를 예측하는 경우에 유용하다.
독립변수와 종속변수의 관계를 살피기가 어려운 복잡한 데이터에 대해서도 잘 분석된다.
분류나 예측 결과만을 제공할 뿐 어떻게 그러한 결과가 나왔는가에 대한 이유를 설명하지 못한다.
데이터의 여러 변수들간의 관계를 밝혀내는 데는 적합하지 않다.
## nnet package를 이용하여 iris 데이터를 Neural Network 분석기법으로
## 분류해 본다.
library(nnet)
## iris 데이터에 대하여 알아본다.
data(iris)
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
## iris 데이터를 7:3의 비율로 trainData와 testData로 샘플링한다.
set.seed(1234)
ind <- sample(2, nrow(iris), replace = TRUE, prob = c(0.7, 0.3))
trainData <- iris[ind == 1, ]
testData <- iris[ind == 2, ]
## iris 데이터를 NeuralNetwork 방법을 이용하여 분석한다.
iris.nn <- nnet(Species ~ ., data = trainData, size = 2, rang = 0.1, decay = 5e-04,
maxit = 200)
## # weights: 19
## initial value 123.260878
## iter 10 value 66.197847
## iter 20 value 51.290637
## iter 30 value 50.506591
## iter 40 value 50.176652
## iter 50 value 50.075896
## iter 60 value 43.167218
## iter 70 value 12.527819
## iter 80 value 8.006959
## iter 90 value 7.880312
## iter 100 value 7.819341
## iter 110 value 7.715604
## iter 120 value 7.279501
## iter 130 value 6.822335
## iter 140 value 6.437068
## iter 150 value 6.342601
## iter 160 value 6.126644
## iter 170 value 6.070501
## iter 180 value 6.058934
## iter 190 value 6.052817
## iter 200 value 6.042796
## final value 6.042796
## stopped after 200 iterations
summary(iris.nn)
## a 4-2-3 network with 19 weights
## options were - softmax modelling decay=5e-04
## b->h1 i1->h1 i2->h1 i3->h1 i4->h1
## 8.13 0.48 1.11 -1.70 -3.47
## b->h2 i1->h2 i2->h2 i3->h2 i4->h2
## 0.34 0.57 1.84 -3.05 -1.54
## b->o1 h1->o1 h2->o1
## -5.35 2.13 9.75
## b->o2 h1->o2 h2->o2
## -2.30 8.64 -8.79
## b->o3 h1->o3 h2->o3
## 7.65 -10.78 -0.96
## trainData에 대하여 설정한 Neural Network을 이용하여 예측한 값을
## 출력한다.
train.pred <- predict(iris.nn, newdata = trainData, type = "class")
train.pred
## [1] "setosa" "setosa" "setosa" "setosa" "setosa"
## [6] "setosa" "setosa" "setosa" "setosa" "setosa"
## [11] "setosa" "setosa" "setosa" "setosa" "setosa"
## [16] "setosa" "setosa" "setosa" "setosa" "setosa"
## [21] "setosa" "setosa" "setosa" "setosa" "setosa"
## [26] "setosa" "setosa" "setosa" "setosa" "setosa"
## [31] "setosa" "setosa" "setosa" "setosa" "setosa"
## [36] "setosa" "setosa" "setosa" "setosa" "setosa"
## [41] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [46] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [51] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [56] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [61] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [66] "virginica" "versicolor" "versicolor" "versicolor" "versicolor"
## [71] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [76] "versicolor" "versicolor" "versicolor" "virginica" "virginica"
## [81] "virginica" "virginica" "virginica" "virginica" "virginica"
## [86] "virginica" "virginica" "virginica" "virginica" "virginica"
## [91] "virginica" "virginica" "virginica" "virginica" "virginica"
## [96] "virginica" "virginica" "virginica" "virginica" "virginica"
## [101] "virginica" "versicolor" "virginica" "virginica" "virginica"
## [106] "virginica" "virginica" "virginica" "virginica" "virginica"
## [111] "virginica" "virginica"
## 실제 trainData값과 예측값을 비교하는 교차표를 출력한다.
table(train.pred, trainData$Species)
##
## train.pred setosa versicolor virginica
## setosa 40 0 0
## versicolor 0 37 1
## virginica 0 1 33
## testData에 대하여 설정한 Neural Network을 이용하여 예측한 값을
## 출력한다.
test.pred <- predict(iris.nn, newdata = testData, type = "class")
test.pred
## [1] "setosa" "setosa" "setosa" "setosa" "setosa"
## [6] "setosa" "setosa" "setosa" "setosa" "setosa"
## [11] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [16] "versicolor" "versicolor" "versicolor" "versicolor" "versicolor"
## [21] "versicolor" "versicolor" "virginica" "virginica" "virginica"
## [26] "virginica" "virginica" "virginica" "virginica" "virginica"
## [31] "virginica" "virginica" "virginica" "virginica" "virginica"
## [36] "virginica" "virginica" "virginica"
## 실제 testData값과 예측값을 비교하는 교차표를 출력한다.
table(test.pred, testData$Species)
##
## test.pred setosa versicolor virginica
## setosa 10 0 0
## versicolor 0 12 0
## virginica 0 0 16