이번 포스팅에서는 저번과 모두 동일하지만 자료만 MinMaxScaler를 이용해서 정규화를 시킨 후에
학습하고 예측시켜보겠습니다
저번과 달라진 것은 전혀 없습니다
모델의 구조나 자료의 크기는 전부 같습니다
모델 생성 코드는 아래 링크에서 보시면 될 것 같습니다
https://dunggeul7843.tistory.com/120
작업32: keras 인공신경망으로 기상변수 예측 모델 만들기2
첫 번째 모델 수정입니다 이번에는 모델 구조와 은닉층의 갯수는 그대로 둔 채 자료의 갯수만 늘렸습니다 사용한 자료는 똑같이 ASOS 종관기상관측 자료를 사용했습니다 104 북강릉 지점에 2014년
dunggeul7843.tistory.com
이번 포스팅에는 MinMaxScaler 코드와 학습하는 과정이랑 결과만 보여드리겠습니다
정규화 코드입니다
from sklearn.preprocessing import MinMaxScaler
x = df1.values.astype(float)
scaler = preprocessing.MinMaxScaler()
x_scaled = scaler.fit_transform(x)
ss = pd.DataFrame(x_scaled)
학습 결과입니다
Epoch 1/100
6136/6136 [==============================] - 41s 6ms/step - loss: 0.1854 - val_loss: 0.1852
Epoch 2/100
6136/6136 [==============================] - 23s 4ms/step - loss: 0.1824 - val_loss: 0.1819
Epoch 3/100
6136/6136 [==============================] - 24s 4ms/step - loss: 0.1820 - val_loss: 0.1819
Epoch 4/100
6136/6136 [==============================] - 24s 4ms/step - loss: 0.0919 - val_loss: 0.0646
Epoch 5/100
6136/6136 [==============================] - 33s 5ms/step - loss: 0.0649 - val_loss: 0.0646
Epoch 6/100
6136/6136 [==============================] - 27s 4ms/step - loss: 0.0547 - val_loss: 0.0400
Epoch 7/100
6136/6136 [==============================] - 23s 4ms/step - loss: 0.0399 - val_loss: 0.0399
Epoch 8/100
6136/6136 [==============================] - 25s 4ms/step - loss: 0.0396 - val_loss: 0.0394
Epoch 9/100
6136/6136 [==============================] - 27s 4ms/step - loss: 0.0393 - val_loss: 0.0394
Epoch 10/100
6136/6136 [==============================] - 25s 4ms/step - loss: 0.0393 - val_loss: 0.0394
...
Epoch 90/100
6136/6136 [==============================] - 23s 4ms/step - loss: 0.0358 - val_loss: 0.0360
Epoch 91/100
6136/6136 [==============================] - 26s 4ms/step - loss: 0.0358 - val_loss: 0.0360
Epoch 92/100
6136/6136 [==============================] - 25s 4ms/step - loss: 0.0358 - val_loss: 0.0360
Epoch 93/100
6136/6136 [==============================] - 24s 4ms/step - loss: 0.0358 - val_loss: 0.0360
Epoch 94/100
6136/6136 [==============================] - 24s 4ms/step - loss: 0.0358 - val_loss: 0.0360
Epoch 95/100
6136/6136 [==============================] - 24s 4ms/step - loss: 0.0358 - val_loss: 0.0360
Epoch 96/100
6136/6136 [==============================] - 23s 4ms/step - loss: 0.0358 - val_loss: 0.0360
Epoch 97/100
6136/6136 [==============================] - 25s 4ms/step - loss: 0.0358 - val_loss: 0.0360
Epoch 98/100
6136/6136 [==============================] - 24s 4ms/step - loss: 0.0358 - val_loss: 0.0360
Epoch 99/100
6136/6136 [==============================] - 24s 4ms/step - loss: 0.0358 - val_loss: 0.0361
Epoch 100/100
6136/6136 [==============================] - 24s 4ms/step - loss: 0.0358 - val_loss: 0.0360
<keras.callbacks.History at 0x7caadaa98df0>
예측 결과입니다
n = pd.DataFrame({'T' : [35.2],
'WS' : [0.8],
'RH' : [48],
'P' : [1004.3],
'VS' : [1963],
'TD' : [22.5]})
now = (n - df1.min())/(df1.max() - df1.min())
predict(now)
1/1 [==============================] - 0s 162ms/step
1시간 뒤 기상변수 예측
기온 : 35.2 degreeC
풍속 : 0.8 m/s
습도 : 48.0 %
기압 : 1004.3 hPa
시정 : 19629.999999999996 m
이슬점 온도 : 22.50000000000001 degreeC
하지만 결과가 조금 이상했습니다
입력한 값을 그대로 내보냈습니다
혹시 입력한 값들이 정규화된 값을 넘어서는 값들인가 해서
train 데이터를 이용해서 예측 시켜보았지만
scaler.inverse_transform(x_train[1:2])
array([[ 2.8, 1.9, 54, 1028.5, 2000, -5.6]]
predict(x_train[1:2])
predict(x_train[1:2])
1/1 [==============================] - 0s 22ms/step
1시간 뒤 기상변수 예측
기온 : 2.7999999999999994 degreeC
풍속 : 1.9 m/s
습도 : 54.0 %
기압 : 1028.5 hPa
시정 : 20000.000000000004 m
이슬점 온도 : -5.599999999999999 degreeC
역시 같은 입력 값과 같은 결과는 내보냈습니다
이러한 경우를 과소적합이라고 합니다
모델이 학습을 제대로 끝내지 못했거나 train 데이터 조차 제대로 학습하지 못한 경우를 말합니다
정규화 하기 전에는 값들의 변동이 크고 학습할 수 있을만큼 의미있었지만
정규화를 한 후에는 0 ~ 1 사이의 값으로 바뀌게 되고 6개의 입력 변수들과
이 값들에서는 학습할 만한 패턴이나 변동이 없었던 것입니다
해결 방법은 입력 변수의 갯수를 늘리거나 모델의 복잡도를 높이는 법입니다
최대한 같은 상황에서 테스트 하기 위해 가장 변화가 클 데이터의 양은 그대로 두고
모델의 복잡도를 수정해보겠습니다
모델의 복잡도를 매우 많이 증가시켰습니다
wfm.add(Dense(12, input_dim = 6, activation = 'relu'))
wfm.add(Dense(12, activation = 'relu'))
wfm.add(Dense(24, activation = 'relu'))
wfm.add(Dense(48, activation = 'tanh'))
wfm.add(Dense(96, activation = 'tanh'))
wfm.add(Dense(96, activation = 'tanh'))
wfm.add(Dense(48, activation = 'tanh'))
wfm.add(Dense(24, activation = 'relu'))
wfm.add(Dense(12, activation = 'relu'))
wfm.add(Dense(12, activation = 'relu'))
wfm.add(Dense(6, activation = 'relu'))
wfm.add(Dense(6, activation = 'relu'))
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 12) 84
dense_1 (Dense) (None, 12) 156
dense_2 (Dense) (None, 24) 312
dense_3 (Dense) (None, 48) 1200
dense_4 (Dense) (None, 96) 4704
dense_5 (Dense) (None, 96) 9312
dense_6 (Dense) (None, 48) 4656
dense_7 (Dense) (None, 24) 1176
dense_8 (Dense) (None, 12) 300
dense_9 (Dense) (None, 12) 156
dense_10 (Dense) (None, 6) 78
dense_11 (Dense) (None, 6) 42
=================================================================
Total params: 22,176
Trainable params: 22,176
Non-trainable params: 0
_________________________________________________________________
기존 528개에서 22,176개로 약 40배 정도 증가시켰습니다
predict(now)
1/1 [==============================] - 0s 162ms/step
1시간 뒤 기상변수 예측
기온 : 35.2 degreeC
풍속 : 0.8 m/s
습도 : 48.0 %
기압 : 1004.3 hPa
시정 : 19629.999999999996 m
이슬점 온도 : 22.50000000000001 degreeC
하지만 같은 결과를 내보내줬습니다
이러한 경우는 모델의 복잡도로 인해 학습을 못한 것이 아니라
입력 변수의 부족으로 변수들 간의 관계를 제대로 학습하지 못한 것입니다
하지만 제가 이 문제를 해결하려고 찾아볼 때는 과소적합이라는 말은 전혀 찾을 수 없었고
stackoverflow에 질문을 해서 알게 되었습니다
코딩이 해답이 인터넷에 많은 것은 좋지만 실제로 겪은 에러나 예시들이 없어서
저는 너무 불편했기 때문에 제 글을 보고 참고하시면 좋겠다는 마음에 글을 씁니다
해결 방법을 알았으니 다음 포스팅에서 입력 변수를 증가시켜서 해보겠습니다
'파이썬 > 딥러닝' 카테고리의 다른 글
keras 인공신경망으로 기상변수 예측 모델 만들기4 (0) | 2023.08.07 |
---|---|
keras 인공신경망으로 기상변수 예측 모델 만들기2 (0) | 2023.08.03 |
keras 인공신경망으로 기상변수 예측 모델 만들기1 (Sequential) (0) | 2023.08.03 |