반응형
https://archive.ics.uci.edu/ml/datasets/ozone+level+detection
이번에는 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일치의 데이터를 자기고 다음날의 오존 레벨을 예측하는 것 역시 어느정도 유의미한 결과를 얻어낼 수 있다는 것을 알게 되었습니다.
하지만, 과연 실제 상황에 적용한다면, 얼마나 유의미한 결과를 얻을 수 있을지 활용해본다면, 좋을 것 같습니다.
반응형
'SW > Python' 카테고리의 다른 글
Python : APScheduler : missed job : 에러, 원인, 해결법 (0) | 2020.02.13 |
---|---|
Python : Keras : RNN : 대사 주고 받는 인공지능 : 예제, 사용법, 활용법 (0) | 2020.02.11 |
Python : Keras : pretrain model : transfer learning : 활용, 예제, 방법 (0) | 2020.02.09 |
Python : Keras : CIFAR10 : 예제, 실습, 사용법 (0) | 2020.02.08 |
Python : Keras : 콘크리트 강도 분류 예측하기 : 예제, 방법, 컨셉 (0) | 2020.02.07 |