본문 바로가기
Study/Python

[서울시 기온 예측 해커톤] Neuralprophet

by p-jiho 2024. 1. 5.

데이콘 서울시 기온 예측 해커톤의 데이터로 공부한 모델이다.

나는 GRU나 LSTM을 사용해 성능을 높이는 경험을 하고 싶어 참여하였는데 생각보다 성능이 좋아지지 못했다.

그래서 다른 분의 공유 코드를 보고 시도해보았다.

이번 대회에서 성능을 높이는데 도움을 준 모델은 아니었지만 이 모델을 쓰시는 분들이 참고하셨으면 한다.

 

Neural Prophet 이란?

: 유명한 분석 패키지 중 하나인 Prophet를 시계열 분석 모델을 관심있게 보신 분이라면 들어는 보셨을 것이다.

페이스북에서 개발한 Neural Prophet은 기존의 Prophet에서 신경망을 추가한 모델이다.

 

Neural Prophet 설치

보통 패키지를 설치하면 !pip install 이 코드를 많이 쓸 것이다.

Neural Prophet을 설치하기 위해 !pip install neuralprophet를 사용하면 맨위에

error: subprocess-exited-with-error

위 메시지가 뜨는 엄청 긴 Error를 보게 될 것이다.

개인적으로 설치하는데 오래걸린다는 느낌을 받으며 기다렸는데 위 메시지를 보았을 때 굉장히 허탈했다.

 

Error가 뜨는 분들께 이 해결방법을 추천한다.

# 출처 : https://bigwaveai.tistory.com/35
!pip install git+https://github.com/ourownstory/neural_prophet.git

 

나는 이 코드로 설치를 완료하였다.

이때 바로 실행하진 못하였고 두번째 문제가 생겼다.

ERROR: Package 'neuralprophet' requires a different Python: 3.11.5 not in '<3.11,>=3.8'

내 파이썬 패키지는 3.11.5였다. 그런데 Neural Prophet을 사용하려면 버전이 3.11보다 낮고 3.8 이상이어야했다.

그래서 다운그레이드를 했다.

프로젝트를 할 땐 가상환경을 사용하는게 좋다고 한다. 바로 다운그레이드를 하면 없던 에러가 자꾸 생긴다.

 

데이터 받아오기

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

 

서울시 평균 기온 예측 해커톤 - DACON

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

dacon.io

내가 실습할 데이터는 위 해커톤의 데이터이다.

data = pd.read_csv("data/train.csv")
data = data.fillna(0)
data

 

데이터를 받아온다.

나는 이 데이터를 그대로 사용한 것은 아니고, 가공을 좀 했다.

전처리 코드는 Github에 올려두었다. 지금은 모델을 중점으로 한 글이니 따로 언급하지는 않을 것이다.

그래도 결측치가 있는 데이터를 그대로 사용할 수는 없으니 간단하게 0으로 전부 채워주었다.

 

모델 적용하기

data = data.rename(columns={'일시': 'ds', '평균기온': 'y'})

i = int(len(data)*0.8)
train = data.iloc[:i]
test = data.iloc[i:]

 

먼저 데이터에는 날짜와 예측할 값을 지정해야한다. 그리고 날짜는 ds, 예측할 값은 y로 이름을 지정해주어야한다.

모델의 정확도를 측정하기 위해 train과 test로 데이터를 분리하였다.

 

나는 이렇게 여러 개의 변수를 사용해 기온을 예측하는 그림을 상상하였다.

하지만 Neural Prophet은 보통 시계열 데이터를 예측하는 것이므로 보통 변수를 날짜, 예측할 값 두 가지만 사용한다.

 

m = NeuralProphet(
	growth='off',
	yearly_seasonality=True,
    	weekly_seasonality=False,
	daily_seasonality=False,
    	epochs=100,
	learning_rate=0.1
)

metrics = m.fit(train[["ds","y"]], freq='D', validation_df=test[["ds","y"]], progress='plot')

future = metrics.make_future_dataframe(test[["ds","y"]], periods=358)
pred = metrics.predict(future)

 

growth는 추세 유형을 설정해준다. linear, discontinuous로도 선택이 가능하다.

yearly_seasonality, weekly_seasonality, daily_seasonality는 각각 연간 계절성, 주간 계절성, 일간 계절성을 뜻한다.

epochs는 학습 횟수이고 learning_rate는 학습률이다.

fit 함수에서 freq는 예측을 하는 기준이다. 만약 D로 하면 하루 단위로 예측을 하고, H로 하면 한 시간 단위로 예측을 한다.

make_future_dataframe 함수의 periods의 의미는 358일을 예측한다는 것이다. 실행을 해보면 날짜가 358만큼 늘어난 데이터를 볼 수 있다.

그리고 예측을 해주면 된다. 평균기온만 가지고 예측을 한 것이다.

추가로 Neural Prophet의 다른 파라미터는 아래 링크를 확인하면 된다.

https://neuralprophet.com/how-to-guides/feature-guides/hyperparameter-selection.html

 

Selecting the Hyperparameters - NeuralProphet documentation

Previous Uncertainty Quantification

neuralprophet.com

 

나는 위에 말했듯이 다변량을 쓰고 싶었다. 그러려면 함수를 조금 바꿔줘야 한다.

col_lst=train.columns
col_lst=col_lst.drop(['ds','y'])
col_lst=list(col_lst)

m = NeuralProphet(
	growth='off',
    	n_forecasts=358,
	yearly_seasonality=True,
    	weekly_seasonality=False,
	daily_seasonality=False,
    	epochs=100,
	learning_rate=0.1
)

m = m.add_lagged_regressor(names=col_lst, normalize="minmax") 

metrics = m.fit(train, freq='D', validation_df=test, progress='plot')

pred = metrics.predict(test)

 

일단, 날짜, 예측할 값이 아닌 독립변수들의 이름을 추출해준다.

그리고 NeuralProphet 모델에 n_forecasts 파라미터를 넣어준다. 얼마 뒤를 예측할 것인지 지정해주는 것이다. default는 1이다.

그리고 add_lagged_regressor 함수를 이용해 독립변수를 추가해준다. col_lst에는 일시와 평균기온을 제외한 변수들의 이름이 들어있고, 이 변수들을 독립변수로 추가한다는 의미이다.

normalize는 독립변수들을 Min-Max Scaler로 표준화한다는 의미이다.

그리고 make_future_dataframe 는 사용하지 않는다. 사용하면 데이터프레임의 날짜가 늘어나게 되고, 평균기온뿐만 아니라 다른 독립변수도 결측치로 나오고 계속 Error가 생긴다.

 

상황에 따라 쓰는 데이터들이 다 다르고 그에 따른 코드들이 달라서 코드들을 상황에 맞춰 짜집기하였다.

처음엔 내가 원하는 결과가 나오지 않고 에러가 생기거나 상황에 맞지 않는 예측값이 나와서 힘들었다.

알고보니 좀 더 구글링을 해보니 내가 말한 위의 상황과 아래의 상황을 합쳐서 코드를 짠 것이었다.

Neural Prophet을 처음 쓰는 사람이 있다면 이 글이 도움이 되었으면 좋겠다.

 

'Study > Python' 카테고리의 다른 글

[Python] 시각화 3. Geocoding  (1) 2023.12.18
[Python] 시각화 2. Folium  (1) 2023.12.17
[Python] 시각화 1. Pyechart  (0) 2023.11.07
[Python] PyCharm에서 main.py  (1) 2023.10.22