본문 바로가기

R

신경망

728x90
반응형

신경망

*신경망과 서포트 백터 머신

 

목차

1.  활성화 함수 소개

2. 신경망 실습1 ( 콘크리트 데이터 )

3. 신경망 실습2 ( 필기체 데이터 )

4. 신경망 실습3 ( boston 생산량 데이터 )

 

 

p.306

신경망의 이해

인공신경망ANN(Artificial Neural Network) 일련의 입력 신호와 출력 신호 사이의 관계를 모델링하며,

생물학적 뇌가 감각 입력의 자극에 대해 어떻게 반응하는지를 이해해

유도한 모델을 이용한다.

 

 

1. 활성화 함수 소개

활성화 함수란?

입력신호의 합이 활성화를 일으킬지를 정하는 역할을 하는 함수

 

k  =  x0*w0  +  x1*w1  + 

y = f(k)

1 : 신호가 흐른다.

0 :신호가 흐른다.

 

*활성화 함수의 종류

1. 계단 함수

2. 시그모이드 함수

3. 렐루 함수

 

 

 

 

문제242.

R relu 함수를 만들고 relu 함수 그래프를 그리시오 !

 

파이썬 코드 :

 

import  numpy  as  np

 

def  relu(x):

    return  np.where(x>0, x, 0)  # 0보다 크면 x그대로, 0이하면 0으로!

print (relu(-2))

print (relu(0.3))

 

↓↓↓↓↓↓↓↓↓↓↓↓

 

relu<-function(x){

  ifelse(x>0,x,0)

}

 relu(-2)
[1] 0
> relu(0.3)
[1] 0.3

 

 

x<-seq(-10, 10, 0.01)

plot(x, relu(x), col="red")

# seq() : 일정한 구조/순차 데이터 생성

 

 

 

 

문제243.

계단함수를 R 구현하고 계단함수 그래프를 그리시오

 

*계단함수란?

f(0.3) = 1, f(-0.2) = 0

0 임계치로 해서 임계치 이상이면 1

아니면 0 출력하는 함수로 생성하시오

 

step<-function(x){

  ifelse(x>=0,1,0)

}

 

step(-0.5)

step(0.5)

x<-seq(-5,5,0.01)  # (-5, 5, 1) 설정하면, 선이 아닌 점의 형태로 나타남.

default 값이 점이라 그러함.

plot(x, step(x), col='red', type='l') # 그래서 여기서 type Line 약자로

 

 

 

 

문제244. 시그모이드 함수를 R 구현하고 그래프로 그리시오

파이썬 :

x = np.arange(-5,5,0.1)

print (x)

def  sigmoid(x):

    return 1 / (1 + np.exp(-x) )

y = sigmoid(x)

 

 

R코드:

sigmoid<-function(x){

  1/(1+exp(-x) )

}

x<-seq(-5,5,0.01)

plot(x, sigmoid(x), col='red')

 

 

 

 

신경망 실습1(콘크리트 데이터)

p.322

"콘크리트의 강도를 예측하는 신경망을 만드는 실습"

 

자갈, 모래, 시멘트 등을 비율로 섞었을 어느정도의 강도가

나오는지 예측하는 신경망

 

1.  콘크리트 데이터 소개

 

* 콘크리트 데이터

 

 1. mount of cement: 콘크리트의 총량

 2. slag  :  시멘트

 3. ash   :  (시멘트)

 4. water : 

 5. superplasticizer :  고성능 감수재(콘크리트 강도를 높이는 첨가제)

 6. coarse aggregate :  굵은 자갈

 7. fine  aggregate :  자갈

 8. aging time  :  숙성시간

 9. strength : 강도

 

2.  콘크리트 데이터를 R 로 로드한다.

 

 -  머신러닝 데이터 116

 

concrete <- read.csv("concrete.csv")

str(concrete)

 

3.  정규화 함수로 데이터를 정규화 작업

 

normalize <- function(x) {

    return ( (x-min(x)) / (max(x) - min(x) ) )

                         }

 

concrete_norm <- as.data.frame(lapply(concrete,normalize) )

 

 

4.  0~1사이로 데이터가 잘 변경되었는지 확인

 

summary( concrete_norm$strength)

summary(concrete_norm$strength)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
 0.0000  0.2664  0.4001  0.4172  0.5457  1.0000

 

# 본래 데이터의 최소값, 최대값과 비교

summary( concrete$strength)

 

 

 

5.  훈련 데이터,테스트 데이터를 나눈다 (8:2)

 

concrete_train <- concrete_norm[1:773, ]

concrete_test  <- concrete_norm[774:1030, ]

 

 

6.  neuralnet 패키지를 설치한다.

 

install.packages("neuralnet")

library(neuralnet)

 

 

7.  neuralnet 패키지에 콘크리트 훈련 데이터를 넣어서

    모델을 생성한다.

 

concrete_model <- neuralnet(formula=strength ~ cement + slag + ash  +

water +superplastic + coarseagg  + fineagg  + age,

 data =concrete_train)  

# neuralnet . 찍어서 번에 하는 작업이 안됨 !

 

9. 모델(신경망) 을 시각화

 

plot(concrete_model )

 

 

 

 

10. 만든 모델로 테스트 데이터를 가지고 테스트 한다

 

model_results <-  compute(concrete_model, concrete_test[1:8])

 

# compute 함수 : 모델 성능 평가(예측) predict 같은 기능!

 

names(model_results)
[1] "neurons"    "net.result"

 

훈련 과정과 훈련된 신경망에 대한 기본 정보는 nn에 저장되었다.

이것은 시작 가중치의 예와 마찬가지로 결과를 재현하기 위해 알아야만 하는
모든 정보가 포함된다.

      • net.result, 전체 결과를 가지는 목록, i.e. 출력, 응답(replication)에서 신경망.
      • weights, 응답(replication)에서 신경망의 적합된 가중치를 가지는 목록.
      • generalized.weights, 응답(replication)에서 신경망의 일반화 가중치를 가지는 목록
      • result.matrix, 에러를 가지는 메트릭, 도달한 임계점, 필요한 단계, AIC 그리고 BIC (likelihood=TRUE 경우 계산) 그리고 응답(replication)에서 추정 가중치. 열은 하나의 응답(replication) 나타낸다.
      • startweights, 응답(replication)에서 시작 가중치를 가지는 목록.

 

 

predicted_strength <-  model_results$net.result

 

# model_results$net.result 찍어보면

예상값이 주르륵 나오는 있다.

 

 

 

11.  예측값과 실제값간의 상관관계를 확인

    

cor(predicted_strength, concrete_test$strength)

 0.806285848

 

 

 

12. 모델의 성능개선

concrete_model2<-neuralnet(formula=strength~cement+slag+ash+water+superplastic+

                             coarseagg+fineagg+age,

                           data = concrete_train, hidden=c(5,2))

설명:

hidden = c(5 ,           2)

                           

은닉1층의 노드수       은닉2층의 노드수

 

plot(concrete_model2)

 

model_results2<-compute(concrete_model2, concrete_test[1:8])

predicted_strength2<-model_results2$net.result

cor(predicted_strength2, concrete_test$strength)

[1,] 0.9238724

 

 

 

 

회귀트리일 사용했던 와인 데이터를 신경망에 넣고 테스트

회귀트리 모델의 결과(상관관계) : 0.53

 

신경망 실습 2(와인 데이터 )

 

 신경망 R 패키지 : 1. neuralnet 패키지(콘크리트 데이터)

                        2. nnet  패키지 (와인 데이터)

 

1. nnet 패키지를 설치한다

 

install.packages("nnet")

library(nnet)

 

 

 

2. wine 데이터를 로드한다

 

wine <- read.csv("wine2.csv")

head(wine)

str(wine)

 

3. 표준화 작업을 진행한다

 

wine_norm <- cbind(wine[1], scale(wine[-1]) )

size <- nrow(wine_norm)

size

 

summary(wine_norm)

 

4. 7:3으로 훈련데이터와 테스트 데이터를 분리한다

 

set.seed(100)

index <- c( sample(1:size, size *0.7) )

length(index) 

 

train <- wine_norm[index, ]

test  <- wine_norm[-index, ]

 

 

 

5. 훈련 데이터로 신경망 모델을 생성한다.

 

wine_model <- nnet(Type ~ ., data = train, size=2,

                   decay=5e-04 , maxit=200 )

 

# maxit 에폭수 ! 200에폭 돌리겠다라는

 

설명 :  size =2 은닉층의 뉴런수

        decay = 5e-04 가중치감소  *오버피팅 예방

  

 

 

6. 테스트 데이터를 모델에 넣어서 결과를 예측한다.

 

library(gmodels)

predicted_result2 <- predict(wine_model,test, type='class')

head(predicted_result2)

 

 

 

7. 이원 교차표를 그리고 정확도를 확인한다.

 

actual <- test$Type

table(actual, predicted_result2)

model.confusion.matrix <- table(actual, predicted_result2)

CrossTable(model.confusion.matrix)

1 맞췄다!

 

 

 

 

문제245.

위에 신경망의 뉴런수를 늘려서 1 맞춘것도

맞추게 100% 정확도가 있도록 성능을 높이시오!

(뉴런수를 늘려보시오)

 

wine_model <- nnet(Type ~ ., data = train, size=10,

                   decay=5e-04 , maxit=200) 

 

전부 맞춘 확인할 있다.

 

 

 

 

 

신경망실습2(필기체 데이터)

*mnist 데이터


mnist_test<-read.csv("short_prac_test.csv")
> dim(mnist)
[1] 1000  785

 

> mnist_train<-read.csv("short_prac_train.csv")
> dim(mnist_train)
[1] 5000  785

 

mnist_test[,1] # 라벨확인

 

 

 

문제245.

nnet 패키지 신경망에 mnist 필기체 데이터를 넣고 정확도를 확인하시오

 

#setwd("d:\\data")

 

drat:::addRepo("dmlc")

cran <- getOption("repos")

cran["dmlc"] <- "https://s3-us-west-2.amazonaws.com/apache-mxnet/R/CRAN/"

 

options(repos = cran)

install.packages("mxnet",dependencies = T)

library(mxnet)

 

train<-read.csv('short_prac_train.csv')

test<-read.csv('short_prac_test.csv')

 

 

train<-data.matrix(train) #행렬형태로 변환한다

test<-data.matrix(test) #행렬형태로 변환한다

 

train.x<-train[,-1] #훈련데이터

train.y<-train[,1] #훈련데이터의 라벨

 

train.x<-t(train.x/255) #훈련데이터를 정규화

test_org<-test  # test데이터(오리지널 데이터=원본)

test<-test[,-1] # test 데이터의 라벨

test<-t(test/255)  # 정규화한 test데이터

 

 

 

# Deep NN

 

data <- mx.symbol.Variable("data")  # data 라는 변수 생성

 

fc1 <- mx.symbol.FullyConnected(data, name="fc1", num_hidden=128) # 완전연결계층 1

 

act1 <- mx.symbol.Activation(fc1, name="relu1", act_type="relu") # 렐루함수

 

fc2 <- mx.symbol.FullyConnected(act1, name="fc2", num_hidden=64) #FC 2

 

act2 <- mx.symbol.Activation(fc2, name="relu2", act_type="relu") # 렐루

 

fc3 <- mx.symbol.FullyConnected(act2, name="fc3", num_hidden=10) # FC 3

 

softmax <- mx.symbol.SoftmaxOutput(fc3, name="sm") # 소프트맥스 함수

 

devices <- mx.cpu()  # cpu 사용?

 

mx.set.seed(0)

 

model <- mx.model.FeedForward.create(softmax, X=train.x, y=train.y,                                    

                                     ctx=devices, num.round=10, array.batch.size=100,

                                                # num.round=에폭을 몇번 돌릴건가 정하는 값

                                    

                                     learning.rate=0.07, momentum=0.9,  eval.metric=mx.metric.accuracy,                                    

                                     initializer=mx.init.uniform(0.07),                                    

                                     epoch.end.callback=mx.callback.log.train.metric(100))

 

 

preds <- predict(model, test)

 

pred.label <- max.col(t(preds)) - 1

 

table(test_org[,1],pred.label)

 

sum(diag(table(test_org[,1],pred.label)))/1000  # 정확도 확인

sum(diag(table(test_org[,1],pred.label)))/1000  # 정확도 확인
[1] 0.945

 

 

 

 

문제246.

위의 신경망은 3 신경망인데, 4층으로 늘리면 정확도가 올라가는지

확인하시오

 

act3 <- mx.symbol.Activation(fc3, name="relu3", act_type="relu") # 렐루

fc4 <- mx.symbol.FullyConnected(act3, name="fc4", num_hidden=10) # FC 4

softmax <- mx.symbol.SoftmaxOutput(fc4, name="sm") # 소프트맥스 함수

sum(diag(table(test_org[,1],pred.label)))/1000  # 정확도 확인
[1] 0.938

 

정확도가 떨어졌다.

train data 오버피팅 되서 test에서 맞춘 !

 

 

 

 

 

문제247.

R CNN 구현해서 필기체 데이터의 정확도를 올리시오

 

#setwd("d:\\data")

 

drat:::addRepo("dmlc")

 

cran <- getOption("repos")

 

cran["dmlc"] <- "https://s3-us-west-2.amazonaws.com/apache-mxnet/R/CRAN/"

 

options(repos = cran)

 

#install.packages("mxnet",dependencies = T)

 

library(mxnet)

 

train<-read.csv('short_prac_train.csv')

 

test<-read.csv('short_prac_test.csv')

 

train<-data.matrix(train)

 

test<-data.matrix(test)

 

train.x<-train[,-1]

 

train.y<-train[,1]

 

train.x<-t(train.x/255)

 

test_org<-test

 

test<-test[,-1]

 

test<-t(test/255)

 

 

# Convolutional NN

data <- mx.symbol.Variable('data')

 

# first conv

conv1 <- mx.symbol.Convolution(data=data, kernel=c(5,5), num_filter=20)

tanh1 <- mx.symbol.Activation(data=conv1, act_type="tanh")

pool1 <- mx.symbol.Pooling(data=tanh1, pool_type="max", kernel=c(2,2), stride=c(2,2))

 

# second conv

conv2 <- mx.symbol.Convolution(data=pool1, kernel=c(5,5), num_filter=50)

tanh2 <- mx.symbol.Activation(data=conv2, act_type="tanh")

pool2 <- mx.symbol.Pooling(data=tanh2, pool_type="max", kernel=c(2,2), stride=c(2,2))

 

# first fullc

flatten <- mx.symbol.Flatten(data=pool2)

fc1 <- mx.symbol.FullyConnected(data=flatten, num_hidden=500)

tanh3 <- mx.symbol.Activation(data=fc1, act_type="tanh")

 

 

# second fullc

fc2 <- mx.symbol.FullyConnected(data=tanh3, num_hidden=10)

 

# loss

lenet <- mx.symbol.SoftmaxOutput(data=fc2)

train.array <- train.x

dim(train.array) <- c(28, 28, 1, ncol(train.x))

test.array <- test

dim(test.array) <- c(28, 28, 1, ncol(test))

mx.set.seed(0)

tic <- proc.time()

device.cpu <- mx.cpu()

model <- mx.model.FeedForward.create(lenet, X=train.array, y=train.y,

                                     ctx=device.cpu, num.round=20, array.batch.size=100,

                                     learning.rate=0.05, momentum=0.9, wd=0.00001,

                                     eval.metric=mx.metric.accuracy,

                                     epoch.end.callback=mx.callback.log.train.metric(100))

 

 

 

preds <- predict(model, test.array)

 

pred.label <- max.col(t(preds)) - 1

 

table(test_org[,1],pred.label)

 

sum(diag(table(test_org[,1],pred.label)))/1000

 

 

 

 

 

보스톤 집값을 예측하는 신경망 구현하기

 

문제248.

회귀트리와 모델트리로 보스톤 집값을 예측하는 모델을 만들었을

최종상관정도 값을 출력해보았다

  

cor( p.m5p , boston_test$MEDV )

0.506185

이번에는 신경망코드를 이용해서 최종상관정도를 출력해보시오

 

#데이터 읽기와 구조 확인

boston<-read.csv("boston.csv")

str(boston)

head(boston)

 

 

# 정규화 함수

normalize <- function(x) {

  return((x - min(x)) / (max(x) - min(x)))

}

 

 

# 전체 데이터 프레임에 정규화 적용

boston_norm <- as.data.frame(lapply(boston, normalize))

 

 

# 01 사이에 범위 확인

summary(boston_norm$MEDV)

 

 

# 본래 데이터의 최소값, 최대값 비교

summary(boston$MEDV)

 

 

# 훈련과 테스트 데이터 생성

dim(boston_norm)

set.seed(1)

s_cnt<-round(0.7*(nrow(boston_norm)))

s_index<-sample(1:nrow(boston_norm), s_cnt, replace=F)

boston_train <- boston_norm[s_index, ]

boston_test <- boston_norm[-s_index, ]

head(boston_train)

 

 

 

## 3단계 : 데이터로 모델 훈련 ----

 

# neuralnet 모델 훈련

library(neuralnet)

 

 

# 하나의 은닉 뉴런에 대한 단순한 ANN

boston_model <- neuralnet(MEDV~CRIM+ZN+INDUS+CHAS+NOX+RM+

                            AGE+DIS+RAD+TAX+PTRATIO+B+LSTAT,

                          data=boston_train, hidden=10)

 

 

 

## 4단계 : 모델 성능 평가 ----

 

# 모델 결과

model_results <- compute(boston_model, boston_test[1:13])

 

 

# 강도값 예측

predicted_strength <- model_results$net.result

 

cor(predicted_strength, boston_test$MEDV)
          [,1]
[1,] 0.9340361

 

 

 

문제249.

hidden=10 파라미터를 조정해서 2층을 3층으로 늘리고

노드수도 늘려서 정확도가 올라가는지 테스트 하시오

 

hidden=c(         5,               2         )

                                   

은닉1층의 노드수    은닉2층의 노드수

 

 

boston_model <- neuralnet(MEDV~CRIM+ZN+INDUS+CHAS+NOX+RM+

                            AGE+DIS+RAD+TAX+PTRATIO+B+LSTAT,

                          data=boston_train, hidden=c(5  ,  2) )

 

안올라감

 

 

728x90
반응형

'R' 카테고리의 다른 글

연관규칙  (0) 2019.04.03
k-means  (0) 2019.04.03
회귀트리  (0) 2019.04.03
회귀(단순,다중)  (0) 2019.03.13
의사결정트리  (0) 2019.03.10