Python Keras를 이용한 Linear regression 예측 (Sample code)
Python Keras는 Tensorflow, CNTK 등의 Deep Learning Library를 기반으로 보다 쉽게 인공지능 모델을 구성할 수 있는 Library입니다. Tensorflow 2.0으로 오면서 Keras는 Tensorflow의 핵심 부분으로 자리를 잡았고, 사실상 Tensorflow를 사용하기 위해서는 Keras를 사용해야 합니다. Keras의 code 자체의 양은 많지 않지만, machine learning 알고리즘에 대한 이해가 필요합니다. 이론적인 내용보다는 Keras code를 잘 활용하기 위한 샘플 코드 위주로 설명할 예정입니다.
1. Keras 설치와 모듈 import
이전 버전에서는 Keras를 설치하더라도 Backend의 Tensorflow 설치가 필요했지만, 현재 Tensorflow 2.0부터는 Tensorflow에 Keras 모듈이 포함되어 있어 tensorflow만 설치하면 Keras를 사용할 수 있습니다. 또한 Keras 모듈 import 시에서 keras lib를 직접 가져올 필요 없이 tensorflow.keras를 사용하는 것이 오류를 줄일 수 있습니다. 현재 Keras 2.4.3 버전과 tensorflow 2.5.0 조합에서는 keras 모듈을 직접 사용하는 경우 populate_dict_with_module_objects 함수가 정의가 없다는 에러가 발생하고 있어, tensorflow.keras를 사용하는 것을 추천드립니다.
# Requires the latest pip
$ sudo pip3 install --upgrade pip
# Current stable release for CPU and GPU
$ sudo pip3 install keras tensorflow
수정 전
# from keras.models import Sequential
# from keras.layers import Dense
# from keras import optimizers
수정 후
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import optimizers
에러 메시지: import keras를 사용하는 경우
File "/Users/kibua20/git/DevDocs/keras/01_linear_regression.py", line 11, in <module>
from keras.models import Sequential
File "/usr/local/lib/python3.9/site-packages/keras/__init__.py", line 20, in <module>
from . import initializers
File "/usr/local/lib/python3.9/site-packages/keras/initializers/__init__.py", line 124, in <module>
populate_deserializable_objects()
File "/usr/local/lib/python3.9/site-packages/keras/initializers/__init__.py", line 82, in populate_deserializable_objects
generic_utils.populate_dict_with_module_objects(
AttributeError: module 'keras.utils.generic_utils' has no attribute 'populate_dict_with_module_objects'
2. Keras 분석 단계
Keras 분석에 있어서 전체적인 흐름은 다음과 같습니다. x_data를 독립 변수로 설정하고, y_data를 종속변수로 하는 Y=aX+b 형태의 Linear regression의 실제 Keras 코드는 다음과 같습니다.
- Data set 구성과 Preprocessing: Data Set에서 독립 변수와 종속 변수를 구분하고 Estimation 할 수 있도록 데이터를 전처리를 선행합니다. Machine learing에서는 Feature, Feature Vector, Feature Set 용어가 자주 사용되고 있습니다. Feature는 종속 변수의 각각의 요소이고, 아래 예제에서는 Column의 이름이고, Feature set의 feature의 실질적인 값들의 모임입니다. 실무에서는 전처리에 많은 시간이 소요되지만, 현 단계에서는 전처를 모두 완료되었다고 가정합니다.
- Model 정의: 입력 값 (Feature set, 독립 변수), 출력 값 (output, 종속변수)을 정의하고, 예측 방법을 설정합니다.
- Model Compile: Model compile 단계에서는 최적 값을 찾기 위한 알고리즘을 설정합니다. SGD(확률적 경사 하강법), GD (경사 하강법) 등의 여러 알고리즘을 사용하고 있습니다.
- Model Fit: 앞서 정의한 입력/출력 데이터와 Model의 최적화 알고리즘에 따라서 최적화 기준에 맞는 값을 찾아가는 과정입니다.
- Mdel Estimation: 예측 모델의 정확도를 평가합니다.
- Prediction: 예측 모델을 가지고 임의 값에 대한 prediction 값을 설정합니다.
2.1. Keras의 Model과 Layers
Keras의 핵심 데이터 구조는 Model과 Layer입니다. 가장 간단한 모델은 Linear regression의 Squential Model로 아래와 같이 정의할 수 있습니다.
# model: linear regression input dense with dim =1
model = Sequential()
model.add(Dense(1, input_dim = 1, activation='linear'))
Sqeuential Model은 하나의 독립 변수가 하나의 종속 변수에 영향을 주는 layer가 여러 개 있는 경우 적합합니다. (A Sequential model is appropriate for a plain stack of layers where each layer has exactly one input tensor and one output tensor.) Model에 Layer를 추가하기 위해서는 model.add() 함수를 사용합니다.
Dense layer는 독립 변수(입력 값)와 종속 변수 (아웃풋)의 dimension을 정의하고, activation 함수 등을 정의합니다. Keras 문서에 소개된 Dense 설명은 아래 그림과 같습니다. Linear regression인 경우에는 activation function을 'linear'로 정의하고 Hidden layer를 추가하는 경우에는 'relu'로 설정합니다. 입력 값과 출력 값이 모두 1차원 변수이기 때문에 units=1, imput_dim =2로 설정합니다.
2.2. Keras Model Compile과 Fit
Keras의 Model을 정의하고, learing process의 설정을 정의하기 위해서 model.compile() 함수를 사용합니다.
# model compile: SGD learning_rate of 0.01sgd = optimizers.SGD(learning_rate = 0.01)
model.compile(loss='mse',optimizer=sgd, metrics=['accuracy'])
# model fit
history = model.fit(x_data, y_data, epochs=20, batch_size=1, shuffle=False, verbose=1)
Keras에서는 최대한 간단하게 함수를 표현하지만, 개발자에게 많은 설정을 제공하고 있습니다. Optimizer는 SDG, RMSprop, Adam, Adadelta, Adagrad, Adamax, Nadam, Ftrl 등의 알고리즘을 제공하고 있습니다. Model.fit() 함수에서는 설정한 batch_size 만큼 데이터를 training 할 수 있습니다. epochs는 전체 데이터를 Training 회수를 의미합니다. epochs는 Model fit의 evaluation 결과 (loss 값 or mse 값)이 만족할 수 있는 값으로 설정합니다. Model compile과 Fit에 설정이 필요한 parameter를 요약하면 다음과 같습니다.
- epochs: 전체 데이터 셋에 대한 학습을 완료 횟수
- Learning rate: 학습률 (보폭, step)
- SGD (Stochastic Gradient Decent), GD (Gradient Descent)가 있음
- SDG : 일부 sample만 가지고 계산, GD는 전체 데이터
- batch size : 한번 학습에 사용할 데이터 개수 (row의 개수)
2.3. Keras Model의 Prediction
model.predict()함수에 예측하고자 하는 독립 변수(X 값)를 입력하여 예측 값 얻을 수 있습니다.
model.predict([7])
3. Keras로 Linear Prediction 실행 결과
Model.summary() 함수를 통해서 모델 Layer와 Parameter 개수를 파악할 수 있습니다. 본 예제에서는 x=7에 대한 예측 값이 y_est = 69.580536 값으로 예측되었으며, Loss (mse) 값은 0.55 값입니다. epochs (training 회수)가 증가함에 따라서 예측 모델의 loss 값도 줄어듬을 알 수 있습니다. Epochs에 대한 loss를 graph로 표현하며 아래와 같습니다.
4. Sample Code
Keras로 Linear regression에 필요한 Sample code는 Git Hub에 공유하였습니다. Sample code 출처는 https://www.edwith.org/pnu-deeplearning/lecture/57302/ 이며, 최신 Keras 버전에서 에러 나는 부분을 수정하고, Graph 생성 부분을 추가하였습니다.
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import optimizers
# from keras.models import Sequential
# from keras.layers import Dense
# from keras import optimizers
import matplotlib.pyplot as plt
# data set
x_data = np.array([1,2,3,4,5,6,])
y_data = np.array([10,20,30,40,50,60])
# model: linear regression input dense with dim =1
model = Sequential()
model.add(Dense(1, input_dim = 1, activation='linear'))
# model compile: SGD learning_rate of 0.01
sgd = optimizers.SGD(learning_rate = 0.01)
model.compile(loss='mse',optimizer=sgd, metrics=['accuracy'])
# model fit
history = model.fit(x_data, y_data, epochs=20, batch_size=1, shuffle=False, verbose=1)
# prediction
print (model.predict([7]))
# print model summary
model.summary()
# 학습 정확성 값과 검증 정확성 값을 플롯팅 합니다.
#print(history.history)
plt.plot(history.history['accuracy'])
plt.plot(history.history['loss'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Accuracy', 'Loss'], loc='upper left')
plt.savefig('tran_result.png')
#plt.show()
관련 글:
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Pandas로 Excel과 CSV 파일 입출력 방법
[SW 개발/Python] - Python 정규식(Regular Expression) re 모듈 사용법 및 예제
[SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Panda Dataframe 날짜 기준으로 데이터 조회 및 처리하기
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - CSV 파일에서 MariaDB(또는 MySQL)로 데이터 가져오는 방법