본문 바로가기
SW 개발/Data 분석 (RDB, NoSQL, Dataframe)

Python Keras를 이용한 Linear regression 예측 (Sample code)

by Kibua20 2021. 8. 1.

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 코드는 다음과 같습니다. 

Keras를 활용한 Linear regression 단계 

 

  1. Data set 구성과 Preprocessing:  Data Set에서 독립 변수와 종속 변수를 구분하고 Estimation 할 수 있도록 데이터를 전처리를 선행합니다.  Machine learing에서는 Feature, Feature Vector, Feature Set 용어가 자주 사용되고 있습니다. Feature는 종속 변수의 각각의 요소이고, 아래 예제에서는 Column의 이름이고, Feature set의 feature의 실질적인 값들의 모임입니다.  실무에서는 전처리에 많은 시간이 소요되지만, 현 단계에서는 전처를 모두 완료되었다고 가정합니다. 
  2. Model 정의: 입력 값 (Feature set, 독립 변수), 출력 값 (output, 종속변수)을 정의하고, 예측 방법을 설정합니다. 
  3. Model Compile: Model compile 단계에서는  최적 값을 찾기 위한 알고리즘을  설정합니다.  SGD(확률적 경사 하강법), GD (경사 하강법) 등의 여러 알고리즘을 사용하고 있습니다.
  4. Model Fit:  앞서 정의한 입력/출력 데이터와 Model의 최적화  알고리즘에 따라서 최적화 기준에 맞는 값을 찾아가는 과정입니다. 
  5. Mdel Estimation: 예측 모델의 정확도를 평가합니다.  
  6. Prediction: 예측 모델을 가지고 임의 값에 대한 prediction 값을 설정합니다. 

Feature, Feature vector, Feature set 차이점 출처: https://stats.stackexchange.com/questions/192873/difference-between-feature-feature-set-and-feature-vector

 

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로 설정합니다.

Dense layer 예제 (출처: https://keras.io/api/layers/core_layers/dense/)

 

2.2. Keras Model Compile과 Fit

Keras의 Model을 정의하고, learing process의 설정을 정의하기 위해서 model.compile() 함수를 사용합니다. 

# 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)


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로 표현하며 아래와 같습니다. 

 

예측 모델  요약:  model.summary()
Training 회수 (epochs)에 따른 loss 값 비교

 

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 Keras를 이용한 로직스틱 회귀 분석(logistics regression) 예제- Wine Quality 분석(Sample code)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Keras를 이용한 Logistic Regression 방법 및 개념 설명 (Sample code)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Keras를 이용한 다중회귀(Multiple regression) 예측 (Sample code)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Dataframe Visualization: matplotlib로 chart 그리기 (sample code)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Random Number를 가지는 Pandas Dataframe 생성 (좋은 code와 나쁜 code 비교)

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Pandas Dataframe Groupby() 함수로 그룹별 연산하기: Split, Apply, Combine

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Pandas로 Excel과 CSV 파일 입출력 방법

[SW 개발/Python] - Python 정규식(Regular Expression) re 모듈 사용법 및 예제

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python KoNLPy와 WordCloud를 활용하여 WordCloud 생성하기 (Sample code 포함)

[SW 개발/Python] - Python: JSON 개념과 json 모듈 사용법

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Panda Dataframe 날짜 기준으로 데이터 조회 및 처리하기

[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - CSV 파일에서 MariaDB(또는 MySQL)로 데이터 가져오는 방법

 

 




댓글