# ------------------
# 본 장은 R에서 Keras를 실습하는 과정입니다.  
# 딥러닝에 대한 자세한 이론 설명은 별도로 하지 않습니다. 
# 추후 딥러닝 강좌 개설 시, 중요 개념들에 대해 짚고 넘어갑니다. 
# ------------------


1단계: 패키지 설치

R에서 패키지 설치 진행은 아래와 같이 진행하시면 됩니다. 

파이썬이 없는 경우 자동으로 설치를 도와주기 때문에 큰 걱정은 안하셔도 됩니다. 

 

# 패키지는 H2O와 다르게 쉽습니다. 
devtools::install_github("rstudio/keras")
library(keras)

R의 다른 패키지와 달리, keras는 실행함수가 하나 더 있습니다. 

# 텐서플로우 설치: tensorflow를 벡엔드로 사용하기 때문. 
install_keras()

Collecting package metadata (current_repodata.json): ...working... done
Solving environment: ...working... done

# All requested packages already installed.



==> WARNING: A newer version of conda exists. <==
  current version: 4.7.12
  latest version: 4.8.2

Please update conda by running

    $ conda update -n base -c defaults conda


Requirement already up-to-date: tensorflow==2.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (2.0.0)
Requirement already up-to-date: keras in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (2.3.1)
Requirement already up-to-date: tensorflow-hub in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (0.7.0)
Requirement already up-to-date: h5py in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (2.10.0)
Requirement already up-to-date: pyyaml in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (5.3)
Requirement already up-to-date: requests in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (2.23.0)
Requirement already up-to-date: Pillow in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (7.0.0)
Requirement already up-to-date: scipy in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (1.4.1)
Requirement already satisfied, skipping upgrade: wheel>=0.26 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.34.2)
Requirement already satisfied, skipping upgrade: gast==0.2.2 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.2.2)
Requirement already satisfied, skipping upgrade: keras-preprocessing>=1.0.5 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.1.0)
Requirement already satisfied, skipping upgrade: opt-einsum>=2.3.2 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (3.2.0)
Requirement already satisfied, skipping upgrade: termcolor>=1.1.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.1.0)
Requirement already satisfied, skipping upgrade: google-pasta>=0.1.6 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.1.8)
Requirement already satisfied, skipping upgrade: tensorboard<2.1.0,>=2.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (2.0.2)
Requirement already satisfied, skipping upgrade: tensorflow-estimator<2.1.0,>=2.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (2.0.1)
Requirement already satisfied, skipping upgrade: wrapt>=1.11.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.12.1)
Requirement already satisfied, skipping upgrade: grpcio>=1.8.6 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.27.2)
Requirement already satisfied, skipping upgrade: keras-applications>=1.0.8 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.0.8)
Requirement already satisfied, skipping upgrade: numpy<2.0,>=1.16.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.18.1)
Requirement already satisfied, skipping upgrade: six>=1.10.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (1.14.0)
Requirement already satisfied, skipping upgrade: astor>=0.6.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.8.1)
Requirement already satisfied, skipping upgrade: absl-py>=0.7.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (0.9.0)
Requirement already satisfied, skipping upgrade: protobuf>=3.6.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorflow==2.0.0) (3.11.3)
Requirement already satisfied, skipping upgrade: chardet<4,>=3.0.2 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests) (3.0.4)
Requirement already satisfied, skipping upgrade: idna<3,>=2.5 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests) (2.9)
Requirement already satisfied, skipping upgrade: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests) (1.25.8)
Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests) (2019.11.28)
Requirement already satisfied, skipping upgrade: setuptools>=41.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (45.2.0.post20200210)
Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.2.1)
Requirement already satisfied, skipping upgrade: werkzeug>=0.11.15 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.0.0)
Requirement already satisfied, skipping upgrade: google-auth-oauthlib<0.5,>=0.4.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.4.1)
Requirement already satisfied, skipping upgrade: google-auth<2,>=1.6.3 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.11.2)
Requirement already satisfied, skipping upgrade: requests-oauthlib>=0.7.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (1.3.0)
Requirement already satisfied, skipping upgrade: rsa<4.1,>=3.1.4 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (4.0)
Requirement already satisfied, skipping upgrade: pyasn1-modules>=0.2.1 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.2.8)
Requirement already satisfied, skipping upgrade: cachetools<5.0,>=2.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (4.0.0)
Requirement already satisfied, skipping upgrade: oauthlib>=3.0.0 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (3.1.0)
Requirement already satisfied, skipping upgrade: pyasn1>=0.1.3 in /Users/jihoonjung/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (from rsa<4.1,>=3.1.4->google-auth<2,>=1.6.3->tensorboard<2.1.0,>=2.0.0->tensorflow==2.0.0) (0.4.8)

Installation complete.

위와 같은 표시가 나오면 R에서도 keras를 사용할 수 있습니다. 


2단계: 데이터 불러오기

간단하게 iris 데이터를 활용하도록 합니다. iris 데이터를 활용하는 이유는, R은 데이터프레임에 최적화된 언어이고, 대부분의 사용자가 데이터프레임에 익숙합니다. 따라서, 데이터프레임 데이터를 어떻게 적용하는 것이 궁금하실 것 같아서 일부러 쉬운 데이터를 적용했습니다. 

 

R에서도 당연히 이미지 분류 등이 가능합니다. 

#### 2단계: 데이터 불러오기 ####
iris <- iris

3단계: 간단하게 상관관계 그래프 그리기

사실 여기는 굳이 하지 않으셔도 됩니다. 다만, 분석가는 늘 데이터를 시각화해서 데이터의 관계 등을 확인하는 EDA(탐색적 자료 분석)을 꼭 진행하는 걸 권장합니다. 

#### 3단계: 상관관계 그래프 작성하기 (옵션) #### 
library(corrplot)

# 수치형 데이터를 상관관계수로 변환하기
M <- cor(iris[,1:4])

# 상관관계 그래프 작성하기
corrplot(M, method="circle")

 

이렇게 나오면 됩니다. 


4단계: 데이터 전처리 및 가공

 

여기가 핵심입니다. 분류 모형이지만, 딥러닝은 행렬로 연산하기 때문에, 매트릭스 형태로 변환해야 합니다. 또한 데이터 정규화도 같이 진행합니다. 본 장에서는 왜 이러한 작업을 하는지는 구체적으로 설명하지 않습니다. 

 

추후 딥러닝 이론은 요약해서 올릴 예정입니다. 

# (1) 데이터프레임을 행렬로 변환 -------------------
# 범주형을 숫자로 바꿔야 한다. 
# 딥러닝은 데이터프레임이 아니라 행렬형태로 데이터를 받는다. 
iris[,5] <- as.numeric(as.factor(unlist(iris[,5]))) -1
iris <- as.matrix(iris)
dimnames(iris) <- NULL

# (2) 데이터 정규화 -------------------
# keras 패키지에는 normalize 함수가 있다. 
iris_x <- normalize(iris[,1:4])

# 정규화가 진행된 데이터를 다시 5 column과 합친 코드이다. 
iris_mat <- cbind(iris_x, iris[,5])
head(iris_mat)

# 아래는 결과 값입니다. 
          [,1]      [,2]      [,3]       [,4] [,5]
[1,] 0.8037728 0.5516088 0.2206435 0.03152050    0
[2,] 0.8281329 0.5070201 0.2366094 0.03380134    0
[3,] 0.8053331 0.5483119 0.2227517 0.03426949    0
[4,] 0.8000302 0.5391508 0.2608794 0.03478392    0
[5,] 0.7909650 0.5694948 0.2214702 0.03163860    0
[6,] 0.7841750 0.5663486 0.2468699 0.05808704    0

5단계: 딥러닝 모형 데이터셋 분리

# 데이터 셋 나누기 index 
ind <- sample(2, nrow(iris_mat), replace=TRUE, prob=c(0.67, 0.33))

# 모형 설계행렬
iris.training <- iris_mat[ind==1, 1:4]
iris.test <- iris_mat[ind==2, 1:4]

# 모형 예측변수
iris.trainingtarget <- iris_mat[ind==1, 5]
iris.testtarget <- iris_mat[ind==2, 5]

# One-Hot 인코딩: 훈련예측변수
iris.trainLabels <- to_categorical(iris.trainingtarget)

# One-Hot 인코딩: 검증예측변수
iris.testLabels <- to_categorical(iris.testtarget)

6단계: 딥러닝 모형 개발

데이터에 적합한 딥러닝 모형을 적용해야 하는데 신경망 계층(layer)은 몇층으로 할지, 노드는 몇개로 할지, 활성화(activation) 함수는 무엇으로 할지, 하이퍼 모수 학습률(learning rate)은 어떻게 정할지, 이렇게 다양한 조합이 모형의 성능에 영향을 미치게 된다. 그런 점에서 케라스는 모형자체에 개발자가 집중할 수 있도록 함으로써 큰 도움을 주고 있다.

 

일단 잘 모르겠다. 

 

그냥 한번 만들어 보자. 

set.seed(777)
# (1) 모형 초기화
model <- keras_model_sequential()

# 여기에 우선적으로 아래와 같이 신경망 계층을 만듭니다. 
# output 값이 3개입니다. (versicolor, virginica, setosa)
# 8 hidden notes를 만들었고, input shape = 4개로 만들었는데, 
# 이유는 4개의 column이 존재하기 때문입니다. 

model %>% 
  layer_dense(units = 8, activation = 'relu', input_shape = c(4)) %>% 
  layer_dense(units = 3, activation = 'softmax')
2020-03-12 22:46:36.235402: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2020-03-12 22:46:36.297796: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fa12eb3fe50 executing computations on platform Host. Devices:
2020-03-12 22:46:36.297819: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): Host, Default Version

# 모형 요약
summary(model)
Model: "sequential"
_______________________________________________________________________________
Layer (type)                       Output Shape                    Param #     
===============================================================================
dense (Dense)                      (None, 8)                       40          
_______________________________________________________________________________
dense_1 (Dense)                    (None, 3)                       27          
===============================================================================
Total params: 67
Trainable params: 67
Non-trainable params: 0
_______________________________________________________________________________

# 모형 configuration
get_config(model)
{'name': 'sequential', 'layers': ...} # 직접 콘솔에서 확인 바랍니다. 

#  layer configuration
get_layer(model, index = 1)
<tensorflow.python.keras.layers.core.Dense>

# List the model's layers
model$layers
[[1]]
<tensorflow.python.keras.layers.core.Dense>

[[2]]
<tensorflow.python.keras.layers.core.Dense>

# List the input tensors
model$inputs
[[1]]
Tensor("dense_input:0", shape=(None, 4), dtype=float32)

# List the output tensors
model$outputs
[[1]]
Tensor("dense_1/Identity:0", shape=(None, 3), dtype=float32)
  • output 값이 3개입니다. (versicolor, virginica, setosa)
  • 8 hidden notes를 만들었고, input shape = 4개로 만들었는데,
  • 이유는 4개의 column이 존재하기 때문입니다. 

7단계: 딥러닝 모형 컴파일

  • categorical_crossentropy는 다중 분류를 의미합니다. 
  • 만약 이중분류를 하고 싶다면, 'binary_crossentropy' 입력하면 됩니다.
  • 가장 많이 사용되는 최적화 알고리즘은 SGD (Stochastic Gradient Descent), ADAM 및 RMSprop입니다. 
model %>% compile(
  loss = 'categorical_crossentropy',
  optimizer = 'adam',
  metrics = 'accuracy'
)

8단계: 딥러닝 모형 적합

드디어 우리가 하려고 하는 것이 나왔습니다. 시간이 조금 걸립니다. 멋진 그래프가 움직이는 것을 보는 경험을 할 것입니다. 저는 처음에 조금 신기했습니다. 

model %>% fit(
  iris.training, 
  iris.trainLabels, 
  epochs = 500, 
  batch_size = 5,
  validation_split = 0.1
)

궁금하신 분만 보세요, 약 3분 45초 러닝타임 나옵니다. iris 데이터만 해도 3분 45초이니.. 다른 큰 데이터는 로컬 환경에서는 못할 듯 싶습니다. (참고로 맥북 에어로 작업중입니다!) 


9단계: 예측 모형 테스트

# 테스트 데이터를 활용한 예측값 산출
classes <- model %>% predict_classes(iris.test, batch_size = 128)

# 혼동행렬
table(iris.testtarget, classes)

# 결과표
               classes
iris.testtarget  0  1  2
              0 19  0  0
              1  0 13  2
              2  0  1 13

10단계: 모형 평가

# 테스트 데이터를 기반으로 모형을 평가한다. 
score <- model %>% evaluate(iris.test, iris.testLabels, batch_size = 128)

# loss 및 accuracy가 산출 된 것을 확인할 수 있다. 
print(score)

$loss
[1] 0.1443771

$accuracy
[1] 0.9375

 

자세한 내용은 keras 홈페이지에 참고하세요. https://keras.io/

 

Home - Keras Documentation

Keras: The Python Deep Learning library You have just found Keras. Keras is a high-level neural networks API, written in Python and capable of running on top of TensorFlow, CNTK, or Theano. It was developed with a focus on enabling fast experimentation. Be

keras.io


여기서부터 광고합니다. 

 

- 강사가 필요한 곳은 언제든지 연락 주세요. (2020년 6월부터 가능)

- 온라인 강의 제작도 가능합니다.

- Kaggle 데이터 시각화 위주로 공동으로 책 쓰실 분 찾습니다.

- 안타깝지만 개인 과외는 하지 않습니다!

 

연락처: j2hoon85@gmail.com

 

--- 커리큘럼은 아래와 같습니다. ---

* 소스코드 및 강의안 (PPT) 모두 준비 완료

1일차: 데이터 전처리와 시각화

- R & RStudio 설치 및 CRAN 생태계 설명

- 데이터 전처리: dplyr 활용

- 데이터 시각화: ggplot2 패키지 & 그외 동적 시각화 패키지

*웹크롤링, 몽고DB 연동, shiny 대시보드 연동 커리큘럼도 제작중입니다. 

 

2일차: 기초통계 및 회귀분석 ML모형

- 통계분석: 기술통계분석, 교차분석, 집단간 차이분석, 회귀분석 및 보고서 작성 요령

- 회귀모형개발: 선형회귀, 다중회귀, caret 패키지 활용

*통계분석은 지속적으로 업데이트 될 예정입니다.

 

3일차: 분류모형 및 h2o 패키지 소개

- 이상치 및 결측치 처리

- 이항 및 다항분류

- caret 패키지 & h2o 패키지 활용 모형 개발

 

4일차: 모형성능 향상 및 딥러닝 예제

- 통계적 preProcessing 절차 소개

- Parameter Tuning 절차 및 Sample 소개

- 딥러닝 소개 및 keras and tensorflow 2.0 Sample 튜토리얼

* shiny에서 머신러닝 모형 deploy 하는법도 올 상반기 중으로 준비중입니다 (GCP 서버 활용)

 

+ Recent posts