시작하며
오늘은 데이터 전처리를 마무리하고 어떤 모델을 프로젝트에 사용할지 시계열 데이터 예측 모델을 여러 가지 찾아보면서 특징들을 공부해보았다.
데이터 전처리
"""
지점 : 지점번호
지점명 : 지점이름
일시 : YYYY-mm-dd HH:MM
일사(MJ/m2) : 일사량
"""
insolation_files = glob.glob("data/*/20*.csv")
df_insolation = pd.concat([pd.read_csv(file, encoding="cp949") for file in insolation_files], ignore_index=True)
df_insolation = df_insolation[["일시", "일사(MJ/m2)"]]
df_insolation["datetime"] = pd.to_datetime(df_insolation["일시"])
df_insolation["date"] = df_insolation["datetime"].dt.strftime("%Y%m%d")
df_insolation["time"] = df_insolation["datetime"].dt.strftime("%H")
df_insolation = df_insolation.drop(columns=["일시", "datetime"])
df_insolation = df_insolation[["date", "time", "일사(MJ/m2)"]]
df_insolation = df_insolation.rename(columns={"일사(MJ/m2)": "insolation"})
df_insolation["date"] = df_insolation["date"].astype("int64")
df_insolation["time"] = df_insolation["time"].astype("int64")
df_insolation.head(20)
df_insolation.columns.to_list()
df_total = df_gen.merge(df_insolation[["date", "time", "insolation"]], on=["date", "time"], how="inner")
df_total = df_total.dropna()
df_total.to_csv("data/total_data.csv", index=False)
Model
시계열 데이터에 강점이 있는 모델을 찾아보니 RandomForest, LSTM 정도가 괜찮아 보였다.
RNN
RNN(Recurrent Neural Network)
- 이전 입력값을 기억해서 다음 출력값을 결정하는 모델
- 입력 데이터가 길어지면 기울기 소실 발생하여 이전 정보를 잘 기억 못함
LSTM
- RNN의 기울기 소실 문제를 해결하기 위해 고안된 아키텍처(설계도)
- 이전 정보를 오래 기억할 수 있는 메모리 셀을 가지고 있어 긴 시퀀스 데이터 처리 가능
LSTM 구조
- 기본적으로 셀(cell)과 게이트(gate)로 구성
- 셀 : 시퀀스 데이터를 저장
- 게이트 : 셀의 상태를 조작
Cell State
- LSTM의 핵심으로 이전 상태의 정보를 바뀌지 않게 유지하여 흐르게 하는 부분
Forget Gate(망각 게이트)
- 셀 상태를 지울지 말지 결정하는 부분
- 시그모이드를 활성화 함수로 사용(0~1)
- 1이면 보존 0이면 지우기
- 새로운 정보를 어떻게 반영할지 결정하는 부분 이를 통해 기존 정보와 적절하게 조합하여 더 정확한 예측 가능
- 탄젠트 함수와 시그모이드 두 값을 곱하여 셀 상태에 더함
Output Gate(출력 게이트)
- 어떤 출력값을 출력할지 결정하는 부분
- 탄젠트 함수와 시그모이드를 사용하여 출력값 결정
장점
- 기울기 소실을 방지하여 장기 의존성 문제 해결(과거 패턴 기억)
활용 분야
- 자연어(NLP) 처리
- 시계열 데이터 예측
- 순서가 중요한 데이터 처리
RandomForest
- Scikit-learn 라이브러리로 사용할 수 있는 모델
- 다수의 의사결정 트리(decision tree)를 조합해 예측을 수행하는 앙상블 학습 기법
- 분류와 회귀 문제 모두에 강력한 성능을 보임
- 각 트리는 서로 다른 데이터 샘플과 특성(feature)을 이용해 독립적으로 학습
- 최종 예측은 다수결 투표(분류)나 평균(회귀)으로 결정
앙상블 학습
- 다수의 기초 알고리즘을 결합하여 더 나은 성능의 예측 모델을 형성
- 목적에 따라 배깅(Bagging), 부스팅(Boosting), 스택킹(Stacking)으로 분류
배깅(Bagging)
- 독립적으로 학습된 여러 모델의 예측을 병합해 분산을 줄이는 방법
- 병렬 학습 가능
- 주로 분산이 큰 모델의 성능을 안정화하는 데 사용
부스팅(Boosting)
- 이전 모델의 오차를 보정하는 방향으로 순차적으로 학습하는 방법
- 편향을 줄이고 강력한 성능을 얻는 대신 과적합 위험과 학습 시간이 증가할 수 있음
스택킹(Stacking)
- 서로 다른 모델의 예측을 메타 모델이 다시 학습해 최종 예측을 만드는 방법
- 이종 모델 조합에 적합
장단점
- 장점
- 강력한 예측 성능 : 다양한 데이터셋에서 높은 정확도와 안정성을 제공
- 과적합 방지 : 개별 트리의 과적합이 전체 모델에 덜 영향을 주도록 설계되어 일반화가 잘 됨
- 회귀와 분류 모두 적용 가능 : 문제 유형에 따라 같은 프레임워크를 적용 가능
- 특징 중요도 제공 : 모델링 이후 어떤 변수들이 중요한지 평가할 수 있어 해석 가능성 높음
- 단점
- 학습 속도와 메모리 소모 : 트리 수가 많아질수록 학습 시간이 길고 메모리 요구도 증가(실시간 예측에는 비효율적일 수 있음)
- 해석성 : 개별 결정 트리의 복잡성을 모두 합친 모듈이므로 단일 결정 트리보다 해석이 어려움
- 고차원 데이터의 경우 : 매우 많은 특징이 있을 때 학습이 느려지거나 성능이 떨어질 수 있으며, 필요 시 특징 축소나 차원 축소가 필요
활용 가이드
- 문제 유형과 데이터 특성 파악
- 노이즈가 많고 분산이 큰 데이터에는 배깅
- 비선형 복잡도가 크고 데이터 양이 충분하면 부스팅
- 서로 다른 모델의 시너지를 노릴 때는 스택킹
- 모델 파이프라인 설계
- 배깅은 여러 기본 모델의 병렬 학습으로 간단하게 구성 가능
- 부스팅은 약한 모델들을 순차적으로 조합해 학습
- 스택킹은 레벨 -0 모델과 레벨 -1 메타 모델의 흐름을 명확히 정의해야 함
- 평가와 검증
- 교차검증을 통해 과적합 여부와 일반화 성능을 비교
- 스택킹의 경우 데이터 누수 없이 학습-예측 흐름이 유지되는지 확인하는 것이 중요
마치며
내일은 RandomForest부터 활용을 해보고 두 모델을 비교해보고 어떤 모델을 사용할지 정할 수 있을 것 같다.