728x90
오늘부터 keras 인공신경망을 이용해서 기상변수 예측 모델을 만들어보겠습니다
현재는 프로토 타입같은 초기 모델입니다
아직 딥러닝을 공부해가는 중이고 파이썬으로는 어느 정도의 정확성이 가능한지 알아보려고 합니다
모델을 수정해보고 결과가 좋아질 때마다 포스팅을 할 계획이기 때문에 꽤 길게 이어질 것 같습니다
먼저 사용한 자료는 ASOS 종관기상관측 자료를 사용했습니다
104 북강릉 지점에 2020년 7월 31일 00시부터 2023년 7월 31일 00시까지 3년 자료를 사용했습니다
사용한 기상변수는 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/3data.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
1840/1840 [==============================] - 17s 6ms/step - loss: 12.0910 - val_loss: 10.9964
Epoch 2/100
1840/1840 [==============================] - 9s 5ms/step - loss: 10.9911 - val_loss: 10.9868
Epoch 3/100
1840/1840 [==============================] - 4s 2ms/step - loss: 10.9889 - val_loss: 10.9869
Epoch 4/100
1840/1840 [==============================] - 4s 2ms/step - loss: 10.9853 - val_loss: 10.9844
Epoch 5/100
1840/1840 [==============================] - 6s 3ms/step - loss: 10.9824 - val_loss: 10.9770
Epoch 6/100
1840/1840 [==============================] - 4s 2ms/step - loss: 10.9808 - val_loss: 10.9756
Epoch 7/100
1840/1840 [==============================] - 4s 2ms/step - loss: 10.9790 - val_loss: 10.9740
Epoch 8/100
1840/1840 [==============================] - 6s 3ms/step - loss: 10.9771 - val_loss: 10.9825
Epoch 9/100
1840/1840 [==============================] - 5s 2ms/step - loss: 10.9751 - val_loss: 10.9702
Epoch 10/100
1840/1840 [==============================] - 4s 2ms/step - loss: 10.9735 - val_loss: 10.9692
.
.
.
Epoch 90/100
1840/1840 [==============================] - 5s 2ms/step - loss: 1.8904 - val_loss: 1.8672
Epoch 91/100
1840/1840 [==============================] - 4s 2ms/step - loss: 1.8909 - val_loss: 1.8665
Epoch 92/100
1840/1840 [==============================] - 7s 4ms/step - loss: 1.8902 - val_loss: 1.8667
Epoch 93/100
1840/1840 [==============================] - 5s 3ms/step - loss: 1.8906 - val_loss: 1.8676
Epoch 94/100
1840/1840 [==============================] - 4s 2ms/step - loss: 1.8899 - val_loss: 1.8681
Epoch 95/100
1840/1840 [==============================] - 6s 3ms/step - loss: 1.8905 - val_loss: 1.8666
Epoch 96/100
1840/1840 [==============================] - 5s 3ms/step - loss: 1.8899 - val_loss: 1.8682
Epoch 97/100
1840/1840 [==============================] - 4s 2ms/step - loss: 1.8898 - val_loss: 1.8689
Epoch 98/100
1840/1840 [==============================] - 6s 3ms/step - loss: 1.8900 - val_loss: 1.8693
Epoch 99/100
1840/1840 [==============================] - 4s 2ms/step - loss: 1.8895 - val_loss: 1.8667
Epoch 100/100
1840/1840 [==============================] - 4s 2ms/step - loss: 1.8903 - val_loss: 1.8708
<keras.callbacks.History at 0x7d46216c3d90>
다음은 predict 함수입니다
def predict(data):
result = wfm.predict(data)
print("1시간 뒤 기상변수 예측")
print("기온 : ", result[0,0], "degreeC")
print("풍속 : ", result[0,1], "m/s")
print("습도 : ", result[0,2], "%")
print("기압 : ", result[0,3], "hPa")
print("시정 : ", result[0,4]*10, "m")
print("이슬점 온도 : ", result[0,5], "degreeC")
예측 결과입니다
8월 2일 16시 자료를 사용해서 예측했습니다
1시간 간격 자료이기 때문에 5시 결과입니다
predict(n)
1/1 [==============================] - 0s 63ms/step
1시간 뒤 기상변수 예측
기온 : 0.0 degreeC
풍속 : 0.6889498 m/s
습도 : 74.21076 %
기압 : 1230.3738 hPa
시정 : 19479.130859375 m
이슬점 온도 : 0.0 degreeC
실제 관측값입니다
#실제
#기온 : 33.4
#풍속 : 2.2
#습도 : 50
#해면기압 : 1004.2
#시정 : 19880
#이슬점온도 : 21.5
아직 오차가 많이 큰 것 같습니다
계속 수정해보겠습니다
728x90
'파이썬 > 딥러닝' 카테고리의 다른 글
keras 인공신경망으로 기상변수 예측 모델 만들기4 (0) | 2023.08.07 |
---|---|
keras 인공신경망으로 기상변수 예측 모델 만들기3 (과소적합) (0) | 2023.08.07 |
keras 인공신경망으로 기상변수 예측 모델 만들기2 (0) | 2023.08.03 |