대기질 예측 딥러닝 (Python LSTM)

중급 정량 분석 environmental python
예상 소요 시간 100분
사전 지식 Python 중급, 딥러닝 기초
표본 크기 기준 시간당 데이터 8,760개 이상
통계 가정 시계열 의존성, 정규화
난이도: 중급 — 실제 연구에 바로 적용 가능한 수준입니다.

개요

대기 오염도(PM2.5)를 예측하기 위해 LSTM(Long Short-Term Memory) 딥러닝 모델을 Python으로 구축한다. 시간당 기상 데이터를 입력으로 사용하여 다음 시점의 PM2.5 농도를 예측한다.

분석 절차

1단계: 데이터 전처리

MinMaxScaler로 모든 변수를 0~1 범위로 정규화한다. LSTM은 정규화된 데이터에서 더 안정적으로 학습한다.

2단계: 시퀀스 생성

과거 24시간 데이터를 입력으로, 다음 시점의 PM2.5를 출력으로 하는 시퀀스를 생성한다.

3단계: 모델 구축

2층 LSTM 구조(64→32 유닛)에 Dropout(0.2)으로 과적합을 방지한다. 출력층은 1개 유닛(회귀).

4단계: 학습

Adam 옵티마이저, MSE 손실 함수, 50 에포크로 학습한다. 검증 데이터로 조기 종료를 모니터링한다.

5단계: 예측 및 역정규화

테스트 데이터로 예측 후 scaler.inverse_transform으로 원래 단위로 변환한다.

코드 예제

import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from sklearn.preprocessing import MinMaxScaler

# 데이터 로드 및 정규화
df = pd.read_csv('air_quality.csv')
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(df[['pm25', 'temperature', 'humidity', 'wind_speed']])

# 시퀀스 생성
def create_sequences(data, target_col, seq_length=24):
    X, y = [], []
    for i in range(len(data) - seq_length):
        X.append(data[i:i+seq_length])
        y.append(data[i+seq_length, target_col])
    return np.array(X), np.array(y)

X, y = create_sequences(scaled_data, target_col=0, seq_length=24)

# 학습/테스트 분할
split = int(len(X) * 0.8)
X_train, X_test = X[:split], X[split:]
y_train, y_test = y[:split], y[split:]

# LSTM 모델
model = Sequential([
    LSTM(64, return_sequences=True, input_shape=(24, 4)),
    Dropout(0.2),
    LSTM(32),
    Dropout(0.2),
    Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.1)

# 예측
predictions = model.predict(X_test)

참고문헌

Hochreiter, S., & Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation, 9(8), 1735-1780.

코드 예제

PYTHON
import numpy as np import pandas as pd from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout from sklearn.preprocessing import MinMaxScaler # 데이터 로드 및 정규화 df = pd.read_csv('air_quality.csv') scaler = MinMaxScaler() scaled_data = scaler.fit_transform(df[['pm25', 'temperature', 'humidity', 'wind_speed']]) # 시퀀스 생성 def create_sequences(data, target_col, seq_length=24): X, y = [], [] for i in range(len(data) - seq_length): X.append(data[i:i+seq_length]) y.append(data[i+seq_length, target_col]) return np.array(X), np.array(y) X, y = create_sequences(scaled_data, target_col=0, seq_length=24) # 학습/테스트 분할 split = int(len(X) * 0.8) X_train, X_test = X[:split], X[split:] y_train, y_test = y[:split], y[split:] # LSTM 모델 model = Sequential([ LSTM(64, return_sequences=True, input_shape=(24, 4)), Dropout(0.2), LSTM(32), Dropout(0.2), Dense(1) ]) model.compile(optimizer='adam', loss='mse') model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.1) # 예측 predictions = model.predict(X_test)

참고문헌

Hochreiter, S., & Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation, 9(8), 1735-1780.

이 방법론과 연결된 콘텐츠