๊ฐ๋
- ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ์์ง๋ ๋ฐ์ดํฐ๋ก, ํน์ ์๊ฐ ๊ฐ๊ฒฉ์ ๋๊ณ ์ฐ์์ ์ผ๋ก ๊ด์ธก๋ ๊ฐ์ ์๋ฏธ
- ์๊ฐ์ ๋ฐ๋ฅธ ๋ณํ์ ํจํด์ ๋ถ์ํ๋ ๋ฐ ์ค์ ์ ๋๊ธฐ ๋๋ฌธ์, ์์ธก, ํธ๋ ๋ ๋ถ์, ์ด์ ํ์ง ๋ฑ์ ์ ์ฉํ๊ฒ ํ์ฉ
๋ชจ๋ธ
์ ํต์ ์ธ ์๊ณ์ด ๋ถ์ ๋ชจ๋ธ
- AR (Auto-Regressive) ๋ชจ๋ธ: ๊ณผ๊ฑฐ ๋ฐ์ดํฐ(์๊ธฐ ํ๊ท)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ๊ฐ์ ์์ธก
- MA (Moving Average) ๋ชจ๋ธ: ๊ณผ๊ฑฐ์ ์ค์ฐจ(์์ฐจ) ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ๊ฐ์ ์์ธก
- ARMA (Auto-Regressive Moving Average): AR๊ณผ MA ๋ชจ๋ธ์ ๊ฒฐํฉํ ๋ฐฉ์
- ARIMA (Auto-Regressive Integrated Moving Average) ๋ชจ๋ธ: ๋น์ ์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์ฐจ๋ถํ์ฌ ์์ ์ ์ผ๋ก ๋ง๋ ํ ์์ธกํ๋ ๋ชจ๋ธ
- SARIMA (Seasonal ARIMA) ๋ชจ๋ธ: ๊ณ์ ์ฑ์ ๊ณ ๋ คํ ARIMA ๋ชจ๋ธ
- VAR (Vector Auto-Regression) ๋ชจ๋ธ: ๋ค๋ณ๋ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ๋ชจ๋ธ
- Exponential Smoothing ๋ชจ๋ธ: ์ต๊ทผ ๋ฐ์ดํฐ์ ๋ ๋์ ๊ฐ์ค์น๋ฅผ ๋์ด ์์ธก
๋ฅ๋ฌ๋ ๋ชจ๋ธ
์ ํต์ ์ธ ํต๊ณ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๊ฐ ๋ง์ง ์๊ฑฐ๋ ํจํด์ด ๋ช ํํ ๋ ์ ์ฉํ ๋ฐ๋ฉด, ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๋ณต์กํ ํจํด๊ณผ ๋น์ ํ์ฑ์ ์ ํ์ตํ๋ ๋ฐ ๊ฐ์ ์ด ์๋ค.
- RNN: ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ธฐ์ตํ๋ฉฐ ํ์ตํ์ง๋ง ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ๋ก ์ธํด ์ฅ๊ธฐ ์ข ์์ฑ ํ์ต์ด ์ด๋ ค์
- LSTM: RNN์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ชจ๋ธ๋ก, ์ฅ๊ธฐ ์ข ์์ฑ์ ํ์ตํ ์ ์๋ ๊ตฌ์กฐ์ ๋ ฅ ๊ฒ์ดํธ, ๋ง๊ฐ ๊ฒ์ดํธ, ์ถ๋ ฅ ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํด ์ค์ํ ์ ๋ณด๋ง ์ ์ฅ
- GRU: LSTM๊ณผ ์ ์ฌํ์ง๋ง ๋ ๋จ์ํ ๊ตฌ์กฐ๋ก ๋น ๋ฅด๊ฒ ํ์ต ๊ฐ๋ฅ
- 1D CNN: ๊ตญ์์ ์ธ ํจํด์ ์ถ์ถํ๋ ๋ฐฉ์์ผ๋ก, ์๊ณ์ด ๋ฐ์ดํฐ์์๋ ์ฌ์ฉ๋จ
- TCN: CNN ๊ธฐ๋ฐ์ผ๋ก ์ฅ๊ธฐ ์ข ์์ฑ ํ์ต์ด ๊ฐ๋ฅํ ๋ชจ๋ธ
- Transformer ๊ธฐ๋ฐ ๋ชจ๋ธ: ์์ฐ์ด ์ฒ๋ฆฌ์์ ๋ฐ์ ํ ๋ชจ๋ธ
ํน์ง
- ์๊ฐ ์์กด์ฑ: ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๊ฐ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ์ฐ์์ ์ผ๋ก ๊ธฐ๋ก๋ ํํ์ด๋ฏ๋ก, ์ด์ ์์ ๊ณผ ์ดํ ์์ ๊ฐ์ ๊ด๊ณ๊ฐ ์ค์
- ์๊ธฐ ์๊ด์ฑ: ์ด์ ๊ฐ๋ค์ด ์ดํ ๊ฐ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝํฅ์ด ์์(์๊ธฐ ์๊ด์ฑ)
- ํธ๋ ๋์ ๊ณ์ ์ฑ: ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ์์น ๋๋ ํ๋ฝํ๋ ์ฅ๊ธฐ์ ์ธ ํธ๋ ๋, ๊ณ์ ์ ์ฃผ๊ธฐ ํจํด
1. ํธ๋ ๋(Trend)
- ์ฅ๊ธฐ์ ์ธ ๋ฐฉํฅ์ฑ. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ๊พธ์คํ ์ฆ๊ฐํ๊ฑฐ๋ ๊ฐ์ํ๋ ํจํด์ด ์์ ๋
- ํธ๋ ๋๋ ์ฅ๊ธฐ์ ์ธ ๋ณํ
- ์ฆ๊ฐ/๊ฐ์ํ๋ ์ผ์ ํ ๋ฐฉํฅ์ด ์์
2. ๊ณ์ ์ฑ(Seasonality)
- ์ผ์ ํ ์ฃผ๊ธฐ๋ง๋ค ๋ฐ๋ณต๋๋ ํจํด
- ๋ฐ๋ณต๋๋ ์ฃผ๊ธฐ์ ์ธ ํจํด์ด ์์
- ๊ณ์ ์ฑ์ด ์๋ค๊ณ ํด์ ๋ฐ๋์ ๊ณ์ ๊ณผ ๊ด๋ จ ์๋ ๊ฒ์ ์๋ (์ผ์ฃผ์ผ ๋จ์, ํ๋ฃจ ๋จ์ ์ฃผ๊ธฐ์ฑ๋ ํฌํจ)
3. ์๊ธฐ์๊ด(Autocorrelation)
- ๊ณผ๊ฑฐ ๋ฐ์ดํฐ์ ํ์ฌ ๋ฐ์ดํฐ ์ฌ์ด์ ์ ์๋ฏธํ ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ
- ์ด์ ๊ฐ์ด ํ์ฌ ๊ฐ์ ์ํฅ์ ์ฃผ๋ ํจํด
- ์ค๋์ ์จ๋๊ฐ ์ด์ ์ ๋น์ทํ ๊ฐ๋ฅ์ฑ์ด ๋์
- ์ฃผ์ ๊ฐ๊ฒฉ์ด ์ด์ ์ ๊ฐ๊ฒฉ๊ณผ ์ ์ฌํ ํ๋ฆ์ ๋ณด์ผ ๊ฐ๋ฅ์ฑ์ด ํผ
4. ์ก์(Noise)
- ํจํด์ด ์๊ณ ์์ธกํ ์ ์๋ ๋ฌด์์ ๋ณ๋
- ์ฃผ์ ์์ฅ์์ ์์์น ๋ชปํ ๋ด์ค๋ก ์ธํ ๊ธ๊ฒฉํ ๊ฐ๊ฒฉ ๋ณํ
import numpy as np
import matplotlib.pyplot as plt
# ์๊ณ์ด ๋ฐ์ดํฐ ์๊ฐํ ํจ์
def plot_series(time, series, format="-", start=0, end=None):
"""
์ฃผ์ด์ง ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ํ๋ก ์ถ๋ ฅํ๋ ํจ์
Parameters:
- time: ์๊ฐ ๋ฐฐ์ด (x์ถ)
- series: ์๊ณ์ด ๋ฐ์ดํฐ ๊ฐ (y์ถ)
- format: ๊ทธ๋ํ ์ ์คํ์ผ (๊ธฐ๋ณธ๊ฐ "-")
- start, end: ์ถ๋ ฅํ ๊ตฌ๊ฐ ๋ฒ์ ์ง์
"""
plt.plot(time[start:end], series[start:end], format)
plt.xlabel("Time")
plt.ylabel("Value")
plt.grid(True)
# ํธ๋ ๋ ํจ์
def trend(time, slope=0):
"""
์ฃผ์ด์ง ๊ธฐ์ธ๊ธฐ(slope)์ ๋ฐ๋ผ ์ ํ ํธ๋ ๋๋ฅผ ์์ฑํ๋ ํจ์
Parameters:
- time: ์๊ฐ ๋ฐฐ์ด
- slope: ๊ธฐ์ธ๊ธฐ (์์๋ฉด ์ฆ๊ฐ, ์์๋ฉด ๊ฐ์)
Returns:
- ํธ๋ ๋๊ฐ ๋ฐ์๋ ์๊ณ์ด ๋ฐ์ดํฐ
"""
return slope * time
# ๊ณ์ ํจํด ํจ์
def seasonal_pattern(season_time):
"""
๊ณ์ ์ฑ์ ๋ํ๋ด๋ ํจํด์ ์ ์ํ๋ ํจ์
Parameters:
- season_time: ๊ณ์ ๋ด ์๊ฐ ๋น์จ (0 ~ 1 ๋ฒ์)
Returns:
- ๊ณ์ ํจํด ๊ฐ (์์๋ก ์ค์ ๋ ํจํด)
"""
return np.where(season_time < 0.4, # ๊ณ์ ์๊ฐ ๋น์จ์ด 0.4๋ณด๋ค ์์ ๋
np.cos(season_time * 2 * np.pi), # ์ฝ์ฌ์ธ ํจ์ ์ฌ์ฉ
1 / np.exp(3 * season_time)) # ์ง์ ๊ฐ์ ํจํด
# ๊ณ์ ์ฑ ํจ์
def seasonality(time, period, amplitude=1, phase=0):
"""
์ฃผ์ด์ง ์ฃผ๊ธฐ(period)์ ๋ฐ๋ผ ๋ฐ๋ณต๋๋ ๊ณ์ ์ฑ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ํจ์
Parameters:
- time: ์๊ฐ ๋ฐฐ์ด
- period: ๊ณ์ ์ฃผ๊ธฐ (์: 365์ผ = 1๋
์ฃผ๊ธฐ)
- amplitude: ๊ณ์ ์ฑ ์งํญ (ํฌ๊ธฐ ์กฐ์ )
- phase: ์์ (์์ ์์น ์กฐ์ )
Returns:
- ๊ณ์ ์ฑ์ด ์ถ๊ฐ๋ ์๊ณ์ด ๋ฐ์ดํฐ
"""
season_time = ((time + phase) % period) / period # ์ฃผ๊ธฐ ๋จ์๋ก ์ ๊ทํ (0~1 ๋ฒ์)
return amplitude * seasonal_pattern(season_time) # ๊ณ์ ํจํด ์ ์ฉ
# ์ก์ ํจ์
def noise(time, noise_level=1, seed=None):
"""
์๊ณ์ด ๋ฐ์ดํฐ์ ๋๋ค ๋
ธ์ด์ฆ๋ฅผ ์ถ๊ฐํ๋ ํจ์
Parameters:
- time: ์๊ฐ ๋ฐฐ์ด
- noise_level: ์ก์์ ํฌ๊ธฐ
- seed: ๋์ ๊ณ ์ ๊ฐ (์ฌํ ๊ฐ๋ฅ์ฑ ๋ณด์ฅ)
Returns:
- ์ก์์ด ์ถ๊ฐ๋ ๋๋ค ๊ฐ ๋ฐฐ์ด
"""
rnd = np.random.RandomState(seed) # ๋์ ์์ฑ๊ธฐ (์๋ ๊ณ ์ ๊ฐ๋ฅ)
return rnd.randn(len(time)) * noise_level # ์ ๊ท๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๋์ ์์ฑ
# ์๊ณ์ด ๋ฐ์ดํฐ ์์ฑ
time = np.arange(4 * 365 + 1, dtype="float32")
baseline = 10 # ๊ธฐ๋ณธ๊ฐ (์ด๊ธฐ ๋ ๋ฒจ)
slope = 0.09 # ํธ๋ ๋ ๊ธฐ์ธ๊ธฐ (์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฆ๊ฐํ๋ ์ ๋)
amplitude = 15 # ๊ณ์ ์ฑ ํฌ๊ธฐ (ํจํด์ ์งํญ)
noise_level = 6 # ์ก์ ํฌ๊ธฐ (๋ณ๋์ฑ ํฌ๊ธฐ)
# ์๊ณ์ด ๋ฐ์ดํฐ ์กฐํฉ
series = baseline + trend(time, slope) # ํธ๋ ๋ ์ถ๊ฐ
series += seasonality(time, period=365, amplitude=amplitude) # ๊ณ์ ์ฑ ์ถ๊ฐ
series += noise(time, noise_level=noise_level, seed=42) # ์ก์ ์ถ๊ฐ
# ์๊ณ์ด ๋ฐ์ดํฐ ์๊ฐํ
plt.figure(figsize=(10, 6))
plot_series(time, series)
plt.title("Synthetic Time Series Data")
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# ์ด๋ ํ๊ท ๊ณ์ฐ (window_size = 5)
window_size = 5 # ์ด๋ ํ๊ท ์ ๊ณ์ฐํ ๋ ์ฌ์ฉํ ์๋์ฐ ํฌ๊ธฐ ์ค์
# series ๋ฐ์ดํฐ์ ๋ํด window_size 5๋ก ์ด๋ ํ๊ท ์ ๊ณ์ฐํ ํ, split_time - 5๋ถํฐ ๋๊น์ง ์๋ผ์ ์ ์ฅ
moving_avg = moving_average_forecast(series, window_size)[split_time-5:]
# ์๊ฐํ
plt.figure(figsize=(10, 6)) # ๊ทธ๋ํ ํฌ๊ธฐ ์ค์
plot_series(time_valid, x_valid) # ์ค์ ๊ฐ x_valid์ ์๊ฐ time_valid๋ฅผ ์๊ฐํ
plot_series(time_valid, moving_avg) # ๊ณ์ฐ๋ ์ด๋ ํ๊ท ๊ฐ moving_avg๋ฅผ ์๊ฐํ
์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ
์ด ๊ฐ์ diff_series์ ๋ํด 1๋ ์ฐจ์ด๋ฅผ ๊ตฌํ๊ณ , ๊ทธ์ ๋ํ 5์ผ ์ด๋ ํ๊ท ์ ๊ณ์ฐํ ํ, ์ต๊ทผ 1์ฃผ์ผ์ 5์ผ ์ด๋ ํ๊ท ์ ๋ํ ์์ธก๊ฐ
์๋ฌ์จ์ด ๊ฐ์ํ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๊ฑฐ๋ ์ด์ ์์ค ๊ณ์ ์ฑ์ ๋ค์ ์ค๊ฒ -> ๊ฒฐ๊ณผ์ ์ผ๋ก, diff_moving_avg_plus_smooth_past๋ ๊ณ์ ์ฑ์ ์ ์ธํ ์ฐจ๋ถ์น์ ์ต๊ทผ 1์ฃผ์ผ์ ๋ณํ๋ฅผ ์ถ๊ฐํ ๊ฐ์ผ๋ก, ๊ณ์ ์ฑ์ด ๋ฐ์๋ ์์ธก์ด ๋๋ค.
'๐ฆญ AI&Big Data > DL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฅ๋ฌ๋ (0) | 2025.03.05 |
---|