대기질 예측 딥러닝 (Python LSTM)
중급
정량 분석
environmental
python
난이도: 중급 — 실제 연구에 바로 적용 가능한 수준입니다.
개요
대기 오염도(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.