아래 이전 포스팅에서 Logistics regression에 대한 개념과 Keras 예제를 확인하였습니다. 본 포스팅에서 다수의 독립 변수(X)와 단일의 종속 변수(Y)인 Wine Quality 예제를 설명하도록 하겠습니다.
Wine Quality 예제의 데이터 구성
Wine Quality 예제의 출처는 링크입니다. Red Wine과 White Wine의 12개 항목(산도, 등급, 맛)을 49K 샘플을 측정한 데이터입니다. 원본 파일에서 Red Wine과 White Wine 데이터를 하나의 파일로 합치고, 마지막 column에 1(Red Wine), 0 (White wine) 값을 추가하여 Wine.csv (파일 출처: 블로그)을 만들어 사용하는 예제입니다.
1 - fixed acidity (주석산 농도)
2 - volatile acidity (아세트산 농도)
3 - citric acid (구연산 농도)
4 - residual sugar (잔류 당도)
5 - chlorides (염화나트륨 농도)
6 - free sulfur dioxide (유리 아황산 농도)
7 - total sulfur dioxide (총 아황산 농도)
8 - density (밀도)
9 - pH (농도)
10 - sulphates (황화 칼슘)
11 - alcohol (알코올)
12 - quality (score between 0 and 10) (등급)
Wine.csv 내용을 테이블로 도식화하면 아래 그림과 같습니다. 12개의 독립 변수와 1개 종속 변수를 가지고 있고, 12개의 항목에 따라서 Red Wine또는 White Wine으로 구분됩니다. 각각의 항목에 대한 영향도를 선형으로 표현하고 각 독립 변수의 가중치에 따라서 Y 값이 결정되는 형태로 예측을 진행할 수 있수 있습니다. (물론 신경망 같이 보다 성능이 우수한 알고리즘도 사용 가능합니다.) 주어진 데이터를 기반으로 독립 변수의 가중치는 예측 값과 살제 값의 차이가 가장 작은 에러 값(evaluation function)을 찾습니다. 새로운 측정값이 있으면 앞서 계산된 가중치에 따라서 와인의 종류를 예측(predit)할 수 있습니다.
Python Keras로 Wine Quality 예측
Keras로 Wine Quality 예측을 구현은 앞서 설명한 Logistics regression 과 Linear Regression와 전제적인 흐름은 동일하고, Data Set 설정, 활성화 함수 (activation function), loss 함수에 차이가 있습니다.
- Data Set: wine.csv 파일을 pandas dataframe으로 구성하고 x_data와 y_data를 할당
- 모델 구성: 독립 변수의 12개이기 때문에 input_dim에 12로 설정하고, 활성화 함수(activation function)는 sigmoid로 설정합니다. 종속 변수가 1, 0이기 때문에 sigmoid를 사용해야 합니다.
- Model compile: loss함수는 'binary_crossentropy' 로 설정합니다. 종속 변수가 1과 0의 binary 결과만 가지는 경우에는 binary_crossentropy로 설정하고, 여러 값을 사용하는 경우에는 'categorical_entropy' loss 함수를 사용합니다.
- Model Fit: 반복 학습 회수 (epochs)와 batch_size는 loss 값을 측정하면 적절한 값으로 설정합니다.
- Prediction: 임의의 Sample data를 가져와서 Fit 된 결과 값을 확인합니다.
Wine Quality 예측 실행 결과
Wine Quality Sample예 대한 데이터 로딩하면 아래와 같습니다. Column index 없이 0 행부터 실제 값으로 채워져 있고, 행은 0부터 6495 개로 구성되어 있습니다.
model.summary()로 기계 학습 모델의 정보를 확인하면 13개의 Parameter로 구성되어 있고, 입력은 12개의 dim 이고, 최종 output shape 은 1차원입니다. model.compile() 함수를 통해서 loss 함수를 정의하고, loss 함수를 최적화하는 parameter를 model.fit() 함수로 찾습니다.
학습 반복 횟수 ephochs에 따라서 loss 함수 (binary_crossentropy) 결과는 아래와 같습니다. epochs가 작을 때문에 loss 값이 일시적으로 증가하다가 40 이후에는 안정화됩니다.
임의 독립 변수 (입력 값)에 때한 Predicition 결과는 다음과 같습니다. Sigmoid 함수이기 때문에 출력 값은 0~1 사이의 값을 가지고, 0.5 값이 이상인 경우에는 1로 판단하고 0.5 보다 작은 경우에는 0으로 판단합니다.
Wine Quality 예측 Sample code (Logitic regression)
앞에서 설명한 Sample code는 GitHub에 올렸고, code는 아래와 같습니다. Sample code 출처는 https://www.edwith.org/pnu-deeplearning/lecture/57302/ 이며, 최신 Keras 버전에서 에러 나는 부분을 수정하고, Graph 생성 부분을 추가하였습니다.
참고로, Keras로 구현한 내용을 잘 정리 해 놓은 블로그도 있으니 참고하세요.
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import optimizers
import matplotlib.pyplot as plt
# data set
df = pd.read_csv('./wine.csv')
x_data = df.values[:, 0:12]
y_data = df.values[:, 12]
print ('Wine quality samples:')
print (df)
# model: linear regression input dense with dim =1
model = Sequential()
model.add(Dense(1, input_dim = 12, activation='sigmoid'))
# model compile: SGD learning_rate of 0.01
sgd = optimizers.SGD(learning_rate = 0.01)
model.compile(loss='binary_crossentropy', optimizer=sgd)
# model fit
history = model.fit(x_data, y_data, epochs=100, batch_size=5, shuffle=False)
loss_and_metric = model.evaluate(x_data, y_data)
print ('Evaluate:\n', loss_and_metric)
# prediction
x_est0 = [7.1,0.39,0.35,12.5,0.044,26,72,0.9941,3.17,0.29,11.6,5]
x_est1 = [7.8,0.58,0.02,2,0.073,9,18,0.9968,3.36,0.57,9.5,7]
print ('Predict of sample 0 : %f' % (model.predict([x_est0])[0][0]) )
print ('Predict of sample 1 : %f' % (model.predict([x_est1])[0][0]) )
# print model summary
print ('Model summary:\n')
model.summary()
# 학습 정확성 값과 검증 정확성 값을 플롯팅 합니다.
# #print(history.history)
plt.plot(history.history['loss'])
plt.ylabel('Loss (binary_crossentropy)')
plt.xlabel('Epochs')
plt.savefig('03_train_logistic_reg_wine.png')
#plt.show()
plt.clf()
# plt.plot (x_data, model.predict(x_data), 'b', x_data, y_data, 'k.')
# plt.show()
관련 글:
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Keras를 이용한 Linear regression 예측 (Sample code)
[SW 개발/Data 분석 (RDB, NoSQL, Dataframe)] - Python Pandas로 Excel과 CSV 파일 입출력 방법
[SW 개발/Python] - Python 정규식(Regular Expression) re 모듈 사용법 및 예제
댓글