SW/Python

Python : Keras : Lstm : 오존 예측 : 예제, 사용법, 활용법

얇은생각 2020. 2. 10. 07:30
반응형

https://archive.ics.uci.edu/ml/datasets/ozone+level+detection

 

UCI Machine Learning Repository: Ozone Level Detection Data Set

Ozone Level Detection Data Set Download: Data Folder, Data Set Description Abstract: Two ground ozone level data sets are included in this collection. One is the eight hour peak set (eighthr.data), the other is the one hour peak set (onehr.data). Those dat

archive.ics.uci.edu

 

이번에는 lstm을 활용해 오존 레벨을 예측하는 예제를 활용해보도록 하겠습니다. 해당 데이터는 위 사이트에서 제공받을 수 있습니다.

 

 

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from keras.layers import *
from keras.models import *
from keras.utils import *
from sklearn.preprocessing import *

 

라이브러리들을 임포트합니다.

 

 

 

feat = ['feat_{}'.format(i) for i in range(74)]

df = pd.read_csv('eighthr.data', names=feat)

df

 

 

읽어온 데이터는 위와 같습니다.

 

 

 

df.dtypes

 

 

읽어온 데이터의 타입은 오브젝트 형태입니다.

 

 

 

df1 = df.apply(pd.to_numeric, errors='coerce')
df1 = df1.drop(['feat_0'], axis=1)
df1

 

 

따라서, 해당 데이터를 숫자형태로 바꾸어줍니다. 그리고, 날짜 데이터는 제거하였습니다.

 

 

 

df1.dropna(inplace=True)
df1

 

 

훈련 진행을 위해, Na 값이 들어있는 값들은 모두 제거하여줍니다. 

 

 

 

Y = df1['feat_73']
Y = to_categorical(Y)

df1.drop(['feat_73'], axis=1, inplace=True)

X_train = np.asarray(df1[:-100].values.tolist(), dtype=np.float64)
X_test = np.asarray(df1[-100:].values.tolist(), dtype=np.float64)

Y_train = Y[:-100]
Y_test = Y[-100:]

X_train = X_train[:1700]
Y_train = Y_train[:1700]

X_train = X_train.reshape(-1, 10, 72)
Y_train = Y_train.reshape(-1, 10, 2)
X_test = X_test.reshape(-1, 10, 72)
Y_test = Y_test.reshape(-1, 10, 2)

 

이제 읽어들인 데이터들을 훈련데이터와 테스트데이터로 나누어 줍니다. 그리고 형태에 맞게 shape를 변형해줍니다.

 

 

 

model = Sequential()
model.add(LSTM(128, input_shape=(10, 72,), return_sequences=True))
model.add(LSTM(256, return_sequences=True))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

"""
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_9 (LSTM)                (None, 10, 128)           102912    
_________________________________________________________________
lstm_10 (LSTM)               (None, 10, 256)           394240    
_________________________________________________________________
dense_8 (Dense)              (None, 10, 2)             514       
=================================================================
Total params: 497,666
Trainable params: 497,666
Non-trainable params: 0
_________________________________________________________________
"""

 

이제 lstm의 간단한 모델링을 진행합니다. 정보는 위와 같습니다.

 

 

 

print(X_train.shape)
hist = model.fit(X_train, Y_train, epochs=10, batch_size=1, validation_split=0.2)

"""
(170, 10, 72)
Train on 136 samples, validate on 34 samples
Epoch 1/10
136/136 [==============================] - 8s 60ms/step - loss: 0.3119 - acc: 0.9103 - val_loss: 0.1802 - val_acc: 0.9588
Epoch 2/10
136/136 [==============================] - 6s 45ms/step - loss: 0.2927 - acc: 0.9199 - val_loss: 0.2149 - val_acc: 0.9588
Epoch 3/10
136/136 [==============================] - 6s 46ms/step - loss: 0.2863 - acc: 0.9199 - val_loss: 0.2089 - val_acc: 0.9588
Epoch 4/10
136/136 [==============================] - 6s 44ms/step - loss: 0.2789 - acc: 0.9199 - val_loss: 0.2189 - val_acc: 0.9588
Epoch 5/10
136/136 [==============================] - 6s 45ms/step - loss: 0.2833 - acc: 0.9199 - val_loss: 0.1717 - val_acc: 0.9588
Epoch 6/10
136/136 [==============================] - 6s 43ms/step - loss: 0.2872 - acc: 0.9199 - val_loss: 0.1797 - val_acc: 0.9588
Epoch 7/10
136/136 [==============================] - 6s 42ms/step - loss: 0.2850 - acc: 0.9199 - val_loss: 0.1893 - val_acc: 0.9588
Epoch 8/10
136/136 [==============================] - 6s 42ms/step - loss: 0.2825 - acc: 0.9199 - val_loss: 0.2020 - val_acc: 0.9588
Epoch 9/10
136/136 [==============================] - 6s 41ms/step - loss: 0.2814 - acc: 0.9199 - val_loss: 0.1807 - val_acc: 0.9588
Epoch 10/10
136/136 [==============================] - 6s 42ms/step - loss: 0.2849 - acc: 0.9199 - val_loss: 0.1980 - val_acc: 0.9588
"""

 

훈련 결과 약 90프로의 확률의 정확도를 보여주고 있는 것을 알 수 있습니다. 약 10일치의 데이터를 자기고 다음날의 오존 레벨을 예측하는 것 역시 어느정도 유의미한 결과를 얻어낼 수 있다는 것을 알게 되었습니다.

하지만, 과연 실제 상황에 적용한다면, 얼마나 유의미한 결과를 얻을 수 있을지 활용해본다면, 좋을 것 같습니다.

반응형