■ 신경망
*신경망과 서포트 백터 머신
░ 목차
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))
# 0과1 사이에 범위 확인
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) )
안올라감