[2회차 코드] 모델 수정

2024. 10. 23. 18:00데이콘/데이터·AI를 활용한 물가 예측 경진대회 : 농산물 가격을 중심으로

https://dacon.io/competitions/official/236381/overview/description

 

데이터·AI를 활용한 물가 예측 경진대회 : 농산물 가격을 중심으로 - DACON

분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.

dacon.io


2회차부터는 두 가지 방향에 대해 고민했습니다.

첫 번째는 meta 폴더에 있는 산지공판장과 전국도매 데이터를 추가시켜 학습하는 방법이었고, 두 번째는 모델을 수정하는 방법이었습니다.

meta 데이터를 살짝 훑어보았는데 있는 품목이 있고 없는 품목이 있었기 때문에 첫 번째는 보류한 뒤, 두 번째를 시도해보았습니다.


1. 모델 구조 수정

원래 사용하던 모델은 다음과 같았습니다.

# 시계열 예측을 위한 LSTM 모델 구축
model = Sequential()
model.add(Input(shape=(X.shape[1], 1)))  # Input 레이어 사용
model.add(LSTM(50, activation='relu', return_sequences=True))  # return_sequences=True 추가
model.add(LSTM(6, activation='relu'))
model.add(Dense(3))  # T+1, T+2, T+3 예측

 

두 개의 중첩 LSTM 레이어, 기울기 함수는 relu, 마지막 Dense 레이어에서 총 3개를 예측하는 구조였습니다.

 

우선 여기서 레이어층을 변환해보면 성능이 상승하지 않을까 싶어 아래처럼 수정해보았습니다.

# 시계열 예측을 위한 LSTM 모델 구축
model = Sequential()
model.add(Input(shape=(X.shape[1], 1)))  # Input 레이어 사용
model.add(LSTM(40, activation='relu', return_sequences=True))  # 첫 번째 LSTM 레이어
model.add(LSTM(20, activation='relu'))  # 두 번째 LSTM 레이어 유닛 수 증가
model.add(Dense(3))  # T+1, T+2, T+3 예측

2. 옵티마이저 수정

1회차에서 사용하던 옵티마이저는 adam으로, 기본 학습률이 0.001이었습니다.

학습률이 높으면 과적합될 확률이 높아지지만, 어디까지가 적당한 학습률인지는 모르니 이 값을 0.0001로 수정해보았습니다.

# 모델의 최적화는 Adam, 손실값은 MSE 사용
optimizer = Adam(learning_rate=0.0001)  # 학습률 조정
model.compile(optimizer=optimizer, loss='mse')

3. 검증 데이터 (20%) 설정

처음 시도했을 때 train을 모두 사용해도 생각보다 성능이 잘 나왔었습니다.

하지만 이러면 학습 데이터에만 너무 과적합된 모델이 생성될 가능성이 높죠. 따라서 검증 데이터를 설정해서 좀 더 일반적인 모델을 생성하면 어떨까? 하는 생각으로 접근해보았습니다.

# 모델 학습. 에포크 수 조정 및 검증 데이터 분할
history = model.fit(X_3d, y, epochs=100, batch_size=32, validation_split=0.2)

 

이제서야 알았는데 validation_split을 저렇게 설정하면 무작위로 20%가 추출되더라고요.

시계열 데이터는 순서가 중요한 만큼, 직접 검증 데이터셋을 만들어줄 걸 그랬습니다.


4. 점수 확인

 

성능은 오히려 떨어졌습니다.