728x90
첫 번째 모델 수정입니다
이번에는 모델 구조와 은닉층의 갯수는 그대로 둔 채 자료의 갯수만 늘렸습니다
사용한 자료는 똑같이 ASOS 종관기상관측 자료를 사용했습니다
104 북강릉 지점에 2014년 7월 31일 00시부터 2023년 7월 31일 00시까지 10년으로 자료 크기를 늘렸습니다
사용한 기상변수는 6개로 기온, 습도, 풍속, 기압, 시정, 이슬점온도 입니다
코드입니다
import numpy as np
import tensorflow as tf
import pandas as pd
from keras.models import Sequential
from keras.layers import Embedding, LSTM, GRU, Dense, Dropout
from keras.models import load_model
from keras.optimizers import Adam
from keras.preprocessing import sequence
from keras.callbacks import EarlyStopping
from sklearn.model_selection import train_test_split
df = pd.read_csv("/content/drive/MyDrive/10dt.csv", encoding = "cp949")
df1 = pd.DataFrame({'T' : df['기온(°C)'],
'WS' : df['풍속(m/s)'],
'RH' : df['습도(%)'],
'P' : df['해면기압(hPa)'],
'VS' : df['시정(10m)'],
'TD' : df['이슬점온도(°C)']})
#결측값 제거
#(전체 자료 양에 비해 결측값이 매우 작고 0으로 해도 영향을 크게 받지 않는 변수들이기 때문에
#fillna(0)을 이용해서 0으로 채움
df1 = df1.fillna(0)
from sklearn.preprocessing import MinMaxScaler
#label data를 만들어줌
label_data = df1.drop(df1.index[0])
label_data = pd.concat([label_data, df1.tail(1)])
#7:3의 비율로 훈련데이터와 테스트 데이터를 나눔
x_train, x_test, y_train, y_test = train_test_split(df1, label_data, test_size=0.3, shuffle=True)
#테스트 데이터를 다시 한 번 5:5의 비율로 validation을 만듬
x_test, x_val, y_test, y_val = train_test_split(x_test, y_test, test_size = 0.5,
random_state = 1, shuffle = False)
wfm = Sequential()
wfm.add(Dense(12, input_dim = 6, activation = 'tanh'))
wfm.add(Dense(12, activation = 'tanh'))
wfm.add(Dense(6, activation = 'relu'))
wfm.add(Dense(6, activation = 'relu'))
wfm.add(Dense(6, activation = 'relu'))
wfm.add(Dense(6, activation = 'relu'))
wfm.add(Dense(6, activation = 'relu'))
wfm.add(Dense(6, activation = 'relu'))
wfm.summary()
wfm.compile(loss = 'mean_squared_logarithmic_error', optimizer = tf.keras.optimizers.Adam(learning_rate = 0.001))
early_stopping = EarlyStopping(monitor = 'loss', patience = 100)
wfm.fit(x_train, y_train, epochs = 100, batch_size = 10,
validation_data = (x_val, y_val))
자료 전처리와 모델 생성 및 학습은 이렇게 진행했습니다
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 12) 84
dense_1 (Dense) (None, 12) 156
dense_2 (Dense) (None, 6) 78
dense_3 (Dense) (None, 6) 42
dense_4 (Dense) (None, 6) 42
dense_5 (Dense) (None, 6) 42
dense_6 (Dense) (None, 6) 42
dense_7 (Dense) (None, 6) 42
=================================================================
Total params: 528
Trainable params: 528
Non-trainable params: 0
_________________________________________________________________
summary 결과 입니다
fit 결과는 처음 10개와 마지막 10개만 올리겠습니다
학습 횟수가 500번이라 너무 많을거 같습니다
Epoch 1/100
6136/6136 [==============================] - 31s 4ms/step - loss: 1.6188 - val_loss: 1.0255
Epoch 2/100
6136/6136 [==============================] - 17s 3ms/step - loss: 1.0249 - val_loss: 1.0032
Epoch 3/100
6136/6136 [==============================] - 17s 3ms/step - loss: 1.0221 - val_loss: 1.0045
Epoch 4/100
6136/6136 [==============================] - 17s 3ms/step - loss: 1.0192 - val_loss: 1.0038
Epoch 5/100
6136/6136 [==============================] - 17s 3ms/step - loss: 1.0181 - val_loss: 0.9994
Epoch 6/100
6136/6136 [==============================] - 20s 3ms/step - loss: 1.0150 - val_loss: 0.9988
Epoch 7/100
6136/6136 [==============================] - 20s 3ms/step - loss: 1.0138 - val_loss: 1.0067
Epoch 8/100
6136/6136 [==============================] - 17s 3ms/step - loss: 1.0119 - val_loss: 0.9959
Epoch 9/100
6136/6136 [==============================] - 17s 3ms/step - loss: 1.0107 - val_loss: 0.9980
Epoch 10/100
6136/6136 [==============================] - 18s 3ms/step - loss: 1.0095 - val_loss: 1.0119
.
.
.
Epoch 90/100
6136/6136 [==============================] - 16s 3ms/step - loss: 0.8229 - val_loss: 0.8191
Epoch 91/100
6136/6136 [==============================] - 17s 3ms/step - loss: 0.8235 - val_loss: 0.8175
Epoch 92/100
6136/6136 [==============================] - 18s 3ms/step - loss: 0.8258 - val_loss: 0.8153
Epoch 93/100
6136/6136 [==============================] - 19s 3ms/step - loss: 0.8283 - val_loss: 0.8171
Epoch 94/100
6136/6136 [==============================] - 17s 3ms/step - loss: 0.8277 - val_loss: 0.8163
Epoch 95/100
6136/6136 [==============================] - 17s 3ms/step - loss: 0.8263 - val_loss: 0.8155
Epoch 96/100
6136/6136 [==============================] - 18s 3ms/step - loss: 0.8264 - val_loss: 0.8173
Epoch 97/100
6136/6136 [==============================] - 18s 3ms/step - loss: 0.8247 - val_loss: 0.8167
Epoch 98/100
6136/6136 [==============================] - 16s 3ms/step - loss: 0.8229 - val_loss: 0.8159
Epoch 99/100
6136/6136 [==============================] - 17s 3ms/step - loss: 0.8236 - val_loss: 0.8171
Epoch 100/100
6136/6136 [==============================] - 18s 3ms/step - loss: 0.8246 - val_loss: 0.8171
<keras.callbacks.History at 0x79e2db0b1960>
손실률을 보면 저번 3년치 학습과는 다르게 시작부터 1점대로 시작을 했고
결과적으로 0.8246으로 저번 결과보다 1정도 더 줄어들었습니다
예측 결과입니다
비교를 위해 똑같이 8월 2일 16시 자료를 사용해서 예측했습니다
1시간 간격 자료이기 때문에 5시 결과입니다
1/1 [==============================] - 0s 36ms/step
1시간 뒤 기상변수 예측
기온 : 9.108536 degreeC
풍속 : 1.7361615 m/s
습도 : 56.340523 %
기압 : 1022.05664 hPa
시정 : 13978.983154296875 m
이슬점 온도 : 3.3639815 degreeC
실제 관측값입니다
#실제
#기온 : 33.4
#풍속 : 2.2
#습도 : 50
#해면기압 : 1004.2
#시정 : 19880
#이슬점온도 : 21.5
이전 결과에 비해 오차가 많이 줄어들었습니다
이전에는 기온과 이슬점온도가 0으로 출력이 되는 현상이 나타났었습니다
이번에는 그러지 않았지만 너무 낮게 예측이 됐습니다
습도도 74.21076%로 예측했던 것과 다르게 56.340523으로 꽤 비슷하게 예측이 됐습니다
시정은 오히려 19479에서 13978로 오차가 더 커졌습니다
기압은 1230.3738에서 1022.05664로 오차가 줄어들었습니다
자료만 늘려도 꽤나 정확해진다는 것을 알았습니다
다음에는 자료를 정규화 시켜서 진행해보겠습니다
728x90
'파이썬 > 딥러닝' 카테고리의 다른 글
keras 인공신경망으로 기상변수 예측 모델 만들기4 (0) | 2023.08.07 |
---|---|
keras 인공신경망으로 기상변수 예측 모델 만들기3 (과소적합) (0) | 2023.08.07 |
keras 인공신경망으로 기상변수 예측 모델 만들기1 (Sequential) (0) | 2023.08.03 |