Buomsoo Kim

케라스와 함께하는 쉬운 딥러닝 (2) - 다층 퍼셉트론 2 (Classification with MLP)

|

다층 퍼셉트론 1 (Regression with MLP)

Objective: 케라스로 다층 퍼셉트론 모델을 만들고, 이를 분류(classification) 문제에 적용해 본다

다층 퍼셉트론이란?

가장 기본적인 형태의 인공신경망(Artificial Neural Networks) 구조이며, 하나의 입력층(input layer), 하나 이상의 은닉층(hidden layer), 그리고 하나의 출력층(output layer)로 구성된다.

지난 포스트에서 MLP를 회귀 과업에 적용하는 방법에 대해 익혔다. 이번 포스팅에서는 분류 과업을 위해 MLP를 활용해 보자!

다층 퍼셉트론의 분류 과업 적용

  • 분류 과업(classification task)은 머신러닝에서 예측하고자 하는 변수(y)가 카테고리 속성을 가질 때(categorical)를 일컫는다.
  • 이미지 분류(image classification), 이탈/잔존(churn/retention) 예측 등

  • 손실 함수(loss function)를 위해서는 cross-entropy (혹은 softmax) loss가 흔히 사용되며 평가 지표(evaluation metric)로는 정확도(accuracy)가 가장 널리 사용된다.


Breast cancer 데이터 셋 가져오기

  • 총 569개의 데이터 인스턴스(양성 357개, 악성 212개)를 포함
  • 30개의 피쳐(feature)를 통해 각 데이터 인스턴스가 양성(benign)인지 악성(malign)인지를 “분류(classify)”한다.
  • documentation
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

whole_data = load_breast_cancer()

X_data = whole_data.data
y_data = whole_data.target

X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size = 0.3, random_state = 7) # 학습 데이터(0.7)와 검증 데이터(0.3)로  전체 데이터 셋을 나눈다

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
(398, 30), (171, 30), (398,), (171,)

모델 만들기

  • 회귀 과업 때와 동일하다. Sequential Model API를 통해 레이어가 하나하나 순서대로 추가되는 모델을 만들 수 있다
  • Sequential()로 모델을 생성하며, 생성한 직후에는 아무런 레이어가 추가되지 않은 ‘빈 모델’이다. (add()함수로 레이어를 추가해야 함)
  • documentation
from keras.models import Sequential
model = Sequential()      # 현재 이 모델은 레이어가 하나도 추가되어 있지 않음

레이어 추가하기

  • 생성된 모델에 레이어를 하나하나 추가한다.
  • add() 함수를 활용하여 레고 블럭을 쌓듯이 하나하나 추가해 나간다.
  • 회귀 과업 때와는 다르게 분류 문제에서는 마지막 레이어에 sigmoid가 추가되는 것에 유의한다(결과값을 [0, 1] 확률로 변환하기 위함)
from keras.layers import Activation, Dense
model.add(Dense(10, input_shape = (30,)))    # 입력층 => input_shape이 명시되어야 함
model.add(Activation('sigmoid'))
model.add(Dense(10))                         # 은닉층 1
model.add(Activation('sigmoid'))
model.add(Dense(10))                         # 은닉층 2
model.add(Activation('sigmoid'))
model.add(Dense(1))                          # 출력층 => output dimension == 1 (regression problem)
model.add(Activation('sigmoid'))             

혹은 레이어 추가를 아래와 같이 더 간단하게 실행할 수 있다(결과는 위와 같음).

model.add(Dense(10, input_shape = (30,), activation = 'sigmoid'))
model.add(Dense(10, activation = 'sigmoid'))
model.add(Dense(10, activation = 'sigmoid'))
model.add(Dense(1, activation = 'sigmoid'))

모델 컴파일

from keras import optimizers
sgd = optimizers.SGD(lr = 0.01)    # stochastic gradient descent optimizer
model.compile(optimizer = sgd, loss = 'binary_crossentropy', metrics = ['acc'])   

모델 서머리

  • summary() 함수로 자신이 생성한 모델의 레이어, 출력 모양, 파라미터 개수 등을 체크할 수 있다.
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_13 (Dense)             (None, 10)                310       
_________________________________________________________________
activation_7 (Activation)    (None, 10)                0         
_________________________________________________________________
dense_14 (Dense)             (None, 10)                110       
_________________________________________________________________
activation_8 (Activation)    (None, 10)                0         
_________________________________________________________________
dense_15 (Dense)             (None, 10)                110       
_________________________________________________________________
activation_9 (Activation)    (None, 10)                0         
_________________________________________________________________
dense_16 (Dense)             (None, 1)                 11        
_________________________________________________________________
activation_10 (Activation)   (None, 1)                 0         
=================================================================
Total params: 541
Trainable params: 541
Non-trainable params: 0
_________________________________________________________________

모델 학습

  • fit() 함수를 통해 학습 데이터와 기타 파라미터를 명시하고 모델 학습을 진행할 수 있다.
    • batch_size: 한 번에 몇 개의 데이터를 학습할 것인가
    • epochs: 모델 학습 횟수
    • verbose: 모델 학습 과정을 표시할 것인가(0인 경우 표시 안함, 1인 경우 표시함)
model.fit(X_train, y_train, batch_size = 50, epochs = 100, verbose = 1)

모델 평가

  • evaluate() 함수를 활용해 모델을 평가할 수 있다.
    • 파라미터로 학습 데이터(X_train)과 학습 레이블(y_train)을 넣어준다.
    • 결과는 리스트([손실, 정확도])로 반환한다.
    • 분류 문제에서는 정확도(accuracy)로 평가하는 것에 유의한다.
results = model.evaluate(X_test, y_test)

print(model.metrics_names)     # 모델의 평가 지표 이름
print(results)                 # 모델 평가 지표의 결과값

print('loss: ', results[0])
print('accuracy: ', results[1])
['loss', 'acc']
[0.63870607063784235, 0.67836257240228481]
loss:  0.638706070638
accuracy:  0.678362572402

분류 문제의 경우 검증 데이터 인스턴스 중에 몇 개를 맞추었는가(정확도)로 모델을 평가하다 보니, 회귀 문제에 비해 훨씬 직관적인 평가 방법이라고 할 수 있다. 위의 모델의 경우 클래스가 2개(0/1)인 이진 분류 문제(binary classification problem)인데 검증 정확도가 67.8%이므로 찍는 경우(예상 정확도 0.5)에 비해서는 높은 정확도를 보이지만 그리 높은 정확도는 아니라고 할 수 있다.

이제 앞으로 이어지는 세션에서 어떻게 모델의 학습 과정과 성능을 개선시킬 수 있는지에 대해서 알아본다.

전체 코드

본 실습의 전체 코드는 여기에서 열람하실 수 있습니다!

케라스와 함께하는 쉬운 딥러닝 (1) - 다층 퍼셉트론 1 (Regression with MLP)

|

Update (2020/11/15):텐서플로 최신 버전과 Google Colab 지원을 위해 본 포스팅 시리즈의 소스 코드가 업데이트 되었습니다. Github Repo의 ipynb 파일을 확인해 주시기 바랍니다!

다층 퍼셉트론 1 (Regression with MLP)

Objective: 케라스로 다층 퍼셉트론 모델을 만들고, 이를 회귀(regression) 문제에 적용해 본다

다층 퍼셉트론이란?

가장 기본적인 형태의 인공신경망(Artificial Neural Networks) 구조이며, 하나의 입력층(input layer), 하나 이상의 은닉층(hidden layer), 그리고 하나의 출력층(output layer)로 구성된다.

물론, 각 층에서 뉴런(neuron)의 개수에는 제약이 없다.

은닉층이 하나인 다층 퍼셉트론 구조

위의 MLP 네트워크에서 뉴런의 개수는 다음과 같다

  • 입력층의 뉴런 개수: 3
  • 은닉층의 뉴런 개수: 4
  • 출력층의 뉴런 개수: 2

은닉층이 두 개인 다층 퍼셉트론 구조

위의 MLP 네트워크에서 뉴런의 개수는 다음과 같다

  • 입력층의 뉴런 개수: 3
  • 첫 번째 은닉층의 뉴런 개수: 4
  • 두 번째 은닉층의 뉴런 개수: 4
  • 출력층의 뉴런 개수: 1

다층 퍼셉트론의 회귀 과업 적용

  • 회귀 과업(regression task)은 머신러닝에서 예측하고자 하는 변수(y)가 실수 값을 가질 때(continuous)를 일컫는다.
  • 사람의 키(height), 지능(IQ), 연봉(salary) 등을 예측하는 과업을 예로 들 수 있다.

  • 손실 함수(loss function)과 평가 지표(evaluation metric)을 위해서는 예측치와 실제 값을 뺀 후에 제곱하여 평균한 평균 제곱 오차(MSE; Mean Squared Error)가 흔히 활용된다.


Boston housing 데이터 셋 가져오기

  • 총 506개의 데이터 인스턴스(학습 데이터 404개, 검증 데이터 102개)를 포함
  • 13개의 피쳐(feature)를 통해 특정 위치에 있는 집들의 중앙값(“the median values of the houses at a location”)을 예측
  • documentation
from keras.datasets import boston_housing

(X_train, y_train), (X_test, y_test) = boston_housing.load_data()
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
(404, 13), (102, 13), (404,), (102,)

모델 만들기

  • Sequential Model API를 통해 레이어가 하나하나 순서대로 추가되는 모델을 만들 수 있다
  • Sequential()로 모델을 생성하며, 생성한 직후에는 아무런 레이어가 추가되지 않은 ‘빈 모델’이다. (add()함수로 레이어를 추가해야 함)
  • documentation
from keras.models import Sequential
model = Sequential()      # 현재 이 모델은 레이어가 하나도 추가되어 있지 않음

레이어 추가하기

  • 생성된 모델에 레이어를 하나하나 추가한다.
  • add() 함수를 활용하여 레고 블럭을 쌓듯이 하나하나 추가해 나간다.
from keras.layers import Activation, Dense
model.add(Dense(10, input_shape = (13,)))    # 입력층 => input_shape이 명시되어야 함
model.add(Activation('sigmoid'))
model.add(Dense(10))                         # 은닉층 1
model.add(Activation('sigmoid'))
model.add(Dense(10))                         # 은닉층 2
model.add(Activation('sigmoid'))
model.add(Dense(1))                          # 출력층 => output dimension == 1 (regression problem)

혹은 레이어 추가를 아래와 같이 더 간단하게 실행할 수 있다(결과는 위와 같음).

model.add(Dense(10, input_shape = (13,), activation = 'sigmoid'))
model.add(Dense(10, activation = 'sigmoid'))
model.add(Dense(10, activation = 'sigmoid'))
model.add(Dense(1))

모델 컴파일

from keras import optimizers
sgd = optimizers.SGD(lr = 0.01)    # stochastic gradient descent optimizer
model.compile(optimizer = sgd, loss = 'mean_squared_error', metrics = ['mse'])   

모델 서머리

  • summary() 함수로 자신이 생성한 모델의 레이어, 출력 모양, 파라미터 개수 등을 체크할 수 있다.
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_9 (Dense)              (None, 10)                140       
_________________________________________________________________
activation_4 (Activation)    (None, 10)                0         
_________________________________________________________________
dense_10 (Dense)             (None, 10)                110       
_________________________________________________________________
activation_5 (Activation)    (None, 10)                0         
_________________________________________________________________
dense_11 (Dense)             (None, 10)                110       
_________________________________________________________________
activation_6 (Activation)    (None, 10)                0         
_________________________________________________________________
dense_12 (Dense)             (None, 1)                 11        
=================================================================
Total params: 371
Trainable params: 371
Non-trainable params: 0
_________________________________________________________________

모델 학습

  • fit() 함수를 통해 학습 데이터와 기타 파라미터를 명시하고 모델 학습을 진행할 수 있다.
    • batch_size: 한 번에 몇 개의 데이터를 학습할 것인가
    • epochs: 모델 학습 횟수
    • verbose: 모델 학습 과정을 표시할 것인가(0인 경우 표시 안함, 1인 경우 표시함)
model.fit(X_train, y_train, batch_size = 50, epochs = 100, verbose = 1)

모델 평가

  • evaluate() 함수를 활용해 모델을 평가할 수 있다.
    • 파라미터로 학습 데이터(X_train)과 학습 레이블(y_train)을 넣어준다.
    • 결과는 리스트([손실, 오차])로 반환한다.
results = model.evaluate(X_test, y_test)

print(model.metrics_names)     # 모델의 평가 지표 이름
print(results)                 # 모델 평가 지표의 결과값

print('loss: ', results[0])
print('mse: ', results[1])
['loss', 'mean_squared_error']
[81.900110581341906, 81.900110581341906]
loss:  81.9001105813
mse:  81.9001105813

전체 코드

본 실습의 전체 코드는 여기에서 열람하실 수 있습니다!

Web Crawling and Text Mining with Python in Korean (파이썬 웹 크롤링 & 한국어 텍스트 분석)

|

Files in Google Colab ver: http://bit.ly/2I4XZBx

Web Crawling and Text Mining with Python in Korean (파이썬 웹 크롤링 & 한국어 텍스트 분석)

  • Lecture materials for SNU Big Data Academy / Urban Data Science Lab (UDSL) / etc
  • Materials are provided in Korean
  • Lecture Website: SNU Big Data Academy

Gitub repository

To access all lecture materials, click here

Contents

<Part 0> Preliminaries

  1. (lab) Python Preliminaries
  2. (lecture) Fundamentals of HTML & CSS / (lab) HTML/CSS


<Part 1> Web Crawling

  1. Web Crawling - 1: (lecture) Urllib & BeautifulSoup / (lab) Daum Dictionary Crawling
  2. Web Crawling - 2: (lab) Daum Movie Crawling
  3. Web Crawling - 3: (lecture) Splinter / (lab) Dictionary.com Crawling
  4. Web Crawling - 4: (lab) Daum Movie Crawling (using Splinter)


<Part 2> Text Analysis

  1. Text Analysis - 1: (lecture) Fundamentals of Text Analysis / (lab) Text Data Processing (KoNlPy)
  2. Text Analysis - 2: (lab) Text Data Processing (KoNlPy)
  3. Text Analysis - 3: (lab) Text Data Exploration (Nltk)
  4. Text Analysis - 4: (lab) Text Visualization (World Cloud & Network Graphs)
  5. Text Analysis - 5: (lab) Sentiment Analysis with Korean Movie Reviews

Importing files from Google Drive in Google Colab

|
Note: This posting describes how to import one file at a time from Google Drive with file ID. IF you want to import multiple files or have access to all content in Google Drive, please refer to this posting on mounting Google Drive

Importing files from Google Drive

In last posting, we have figured out how to import files from local hard drive.

In this posting, I will delineate how to import files directly from Google Drive. As you know Colab is based on Google Drive, so it is convenient to import files from Google Drive once you know the drills.

Note: Contents of this posting is based on one of Stackoverflow questions

1. Create file in Google Drive

Save file in any folder of your Google Drive. In my case, I put data.txt under Untitled folder.

One way to get access to your Google Drive file is via the shareable link. Press Get shareable link button and copy the link to your file.

3. Get file ID

Then, we create file ID from the shareable linked obtained in Step 2. In doing so, we use JavaScript. First, open javascript console in your Chrome browser (Press Ctrl + Shift + J).

Then, type in below JavaScript code to obtain file ID.

var url = "your_shareable_link_to_file"
function getIdFromUrl(url) { return url.match(/[-\w]{25,}/); }
getIdFromUrl(url)

Now, remember the string that comes first in resulting list. This is the file ID that you are going to use when importing file in Colab.

Update (March 2020)

Alternatively, the file ID can be also obtained from the link. The file ID is alphanumeric characters between /d/ and /view?usp=sharing. For instance, let’s assume the shareable like to the file we want to import is as below.

https://drive.google.com/file/d/1HbEfAPN7nQVCXbvspwWayOSU7oPr/view?usp=sharing

Then, the file ID should be 1HbEfAPN7nQVCXbvspwWayOSU7oPr. I find this a more convenient way to get the file ID than the method above noawdays.

4. Install PyDrive

Now create and open any Google Colab document. First we need to install PyDrive, which can be easily done with pip install command.

!pip install PyDrive

5. Import modules

Some modules need to be imported in advance to create connection between Colab and Drive.

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

6. Authenticate and create the PyDrive client

auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

Authorize with your Google ID, and paste in the link that comes up and press Enter!

7. Get the file

Get the file using the Google Drive file ID that we created with JavaScript console in step 3.

downloaded = drive.CreateFile({'id':"your_file_ID"})   # replace the id with id of file you want to access
downloaded.GetContentFile('your_file_name.csv')        # replace the file name with your file

8. Read data

Now using Pandas, you can read data and save as DataFrame. As my file is in csv format, I have used read_csv() function, but you can replace it with read_excel() if it is in xlsx format.

import pandas as pd
data = pd.read_csv('your_file_name.csv')

9. Check & Finish

Check if your file is uploaded well, and start your journey with data imported!

Code

Code in this post can be exhibited by below link. \

Start machine learning with Google Colaboratory!

|

Google Colaboratory (Google Colab)

Google Colab is a free development tool for machine learning research and education. It is based on Jupyter but does not require installation of Jupyter, or even Python on your machine! You just need Google ID to use Google Colab service.

Reasons why you should use Google Colab

To be honest, I was pretty skeptical on using Google Colab for machine learning development when I initially learned about it. Actually, it was almost a year ago and Colab did not have most of great benefits that they are providing now. Such benefits include:

  • Easy As it is based on Jupyter, creating and coding with Colab is basically similar to doing so with Jupyter Notebook. Though you will need to get used to some technicalities, such as uploading a file or connecting to Google Drive, but they will pay off with great convenience shortly after you get familiar.

  • Free It is free to use and you can also use free GPU (NVIDIA Tesla K80) up to 12 consecutive hours! Training deep learning models with Colab is much faster than with my machine (with NVIDIA GTX 1060).

  • Accessible As long as you are connected to Internet and have Google ID, you can virtually use Google Colab anywhere, with any device. As mentioned, you do not need to install Python nor Jupyter, and also

  • Social As the name suggests, Google Colab is suited for collaborating with others. You can create and modify a Colab file with Google Drive, and as the file is automatically saved in your Google Drive, the file can be shared to your friends by sending only the Google Drive link to your file.

Google Colab 101

1. Connect with Colab application

If you are using Colab for the first time, you have to connect to the application. In any folder of your choice, press [NEW] > [More] > [+ Connect more apps]

Then in [Connect apps to Drive] window, search for colaboratory. By pressing [+CONNECT], you will be able to add Colaboratory to your Google Drive apps.

2. Create Colab file

Now, you can create Colab files in the same way you create Google Docs, Sheets, or Forms.

By choosing colaboratry, new Colab file (actually .ipynb file in your Drive) will appear in new window.

3. Code & Enjoy!

Now with a new Colab file, you can start coding without any further ado. As you could see, many data science packages including NumPy, Pandas, and Tensorflow are ready-to-go in any Colab environment.