251113 [ Day 87 ] - Project (5)

TaeHyun·2025년 11월 13일

TIL

목록 보기
101/184

시작하며

오늘은 데이터 전처리를 마무리하고 어떤 모델을 프로젝트에 사용할지 시계열 데이터 예측 모델을 여러 가지 찾아보면서 특징들을 공부해보았다.

데이터 전처리

# 일사량 데이터 전처리

# 데이터 확인
# df.describe()
# df.info()

# 전처리 이전 데이터 컬럼 정보
"""
지점 : 지점번호
지점명 : 지점이름
일시 : 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)"]]

# 일시 컬럼 date, time 으로 분리하기
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")

# NaN값 포함된 행 제거
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이면 지우기

Input Gate(입력 게이트)

  • 새로운 정보를 어떻게 반영할지 결정하는 부분 이를 통해 기존 정보와 적절하게 조합하여 더 정확한 예측 가능
  • 탄젠트 함수와 시그모이드 두 값을 곱하여 셀 상태에 더함

Output Gate(출력 게이트)

  • 어떤 출력값을 출력할지 결정하는 부분
  • 탄젠트 함수와 시그모이드를 사용하여 출력값 결정

장점

  • 기울기 소실을 방지하여 장기 의존성 문제 해결(과거 패턴 기억)

활용 분야

  • 자연어(NLP) 처리
  • 시계열 데이터 예측
  • 순서가 중요한 데이터 처리

RandomForest

  • Scikit-learn 라이브러리로 사용할 수 있는 모델
  • 다수의 의사결정 트리(decision tree)를 조합해 예측을 수행하는 앙상블 학습 기법
  • 분류와 회귀 문제 모두에 강력한 성능을 보임
  • 각 트리는 서로 다른 데이터 샘플과 특성(feature)을 이용해 독립적으로 학습
  • 최종 예측은 다수결 투표(분류)나 평균(회귀)으로 결정

앙상블 학습

  • 다수의 기초 알고리즘을 결합하여 더 나은 성능의 예측 모델을 형성
  • 목적에 따라 배깅(Bagging), 부스팅(Boosting), 스택킹(Stacking)으로 분류

배깅(Bagging)

  • 독립적으로 학습된 여러 모델의 예측을 병합해 분산을 줄이는 방법
  • 병렬 학습 가능
  • 주로 분산이 큰 모델의 성능을 안정화하는 데 사용

부스팅(Boosting)

  • 이전 모델의 오차를 보정하는 방향으로 순차적으로 학습하는 방법
  • 편향을 줄이고 강력한 성능을 얻는 대신 과적합 위험과 학습 시간이 증가할 수 있음

스택킹(Stacking)

  • 서로 다른 모델의 예측을 메타 모델이 다시 학습해 최종 예측을 만드는 방법
  • 이종 모델 조합에 적합

장단점

  • 장점
    • 강력한 예측 성능 : 다양한 데이터셋에서 높은 정확도와 안정성을 제공
    • 과적합 방지 : 개별 트리의 과적합이 전체 모델에 덜 영향을 주도록 설계되어 일반화가 잘 됨
    • 회귀와 분류 모두 적용 가능 : 문제 유형에 따라 같은 프레임워크를 적용 가능
    • 특징 중요도 제공 : 모델링 이후 어떤 변수들이 중요한지 평가할 수 있어 해석 가능성 높음
  • 단점
    • 학습 속도와 메모리 소모 : 트리 수가 많아질수록 학습 시간이 길고 메모리 요구도 증가(실시간 예측에는 비효율적일 수 있음)
    • 해석성 : 개별 결정 트리의 복잡성을 모두 합친 모듈이므로 단일 결정 트리보다 해석이 어려움
    • 고차원 데이터의 경우 : 매우 많은 특징이 있을 때 학습이 느려지거나 성능이 떨어질 수 있으며, 필요 시 특징 축소나 차원 축소가 필요

활용 가이드

  • 문제 유형과 데이터 특성 파악
    • 노이즈가 많고 분산이 큰 데이터에는 배깅
    • 비선형 복잡도가 크고 데이터 양이 충분하면 부스팅
    • 서로 다른 모델의 시너지를 노릴 때는 스택킹
  • 모델 파이프라인 설계
    • 배깅은 여러 기본 모델의 병렬 학습으로 간단하게 구성 가능
    • 부스팅은 약한 모델들을 순차적으로 조합해 학습
    • 스택킹은 레벨 -0 모델과 레벨 -1 메타 모델의 흐름을 명확히 정의해야 함
  • 평가와 검증
    - 교차검증을 통해 과적합 여부와 일반화 성능을 비교
    - 스택킹의 경우 데이터 누수 없이 학습-예측 흐름이 유지되는지 확인하는 것이 중요

마치며

내일은 RandomForest부터 활용을 해보고 두 모델을 비교해보고 어떤 모델을 사용할지 정할 수 있을 것 같다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글