학부 캡스톤에서 산불 확산 경로 예측 모델을 만들었습니다. 지금 시점의 화선(불이 붙은 경계)과 바람·지형·식생 정보를 넣으면, 다음 시점에 불이 어디까지 번질지 300×300 지도로 예측하는 모델입니다. 저는 4인 팀에서 모델 설계와 학습을 맡았습니다.
이 글은 "데이터가 너무 적을 때 무엇을 했는지", 그리고 3년 뒤 코드를 다시 정리하면서 "무엇이 부족했는지"에 대한 기록입니다.
데이터: 산불 4건, 35개 시점
국내 대형 산불 4건(울진·삼척, 밀양, 군위, 강릉)의 산림청 산불 상황도를 ArcGIS로 래스터화했습니다. 각 시점마다 5개 채널을 같은 격자에 맞췄습니다.
| 채널 | 의미 |
|---|---|
| 화선 | 해당 시점에 불이 붙은 영역 |
| 풍향 · 풍속 | 확산 방향과 속도를 좌우 |
| 고도(DEM) | 불은 경사를 타고 빠르게 오름 |
| 식생지수(NDVI) | 탈 것이 얼마나 있는지 |
딥러닝 기준으로는 턱없이 적은 양입니다. 4건을 모두 합쳐 35개 시점뿐이었고, 그중 강릉은 일반화 성능을 보기 위해 학습에서 완전히 뺐습니다.
적은 데이터에 맞춘 두 가지 선택
① 모델을 작게 만들었습니다. Conv2D로 공간 특징을 줄이고(300→75), LSTM을 거쳐 다시 300×300으로 복원하는 U-LSTM 구조인데, 전체 파라미터를 2,736개로 제한했습니다. 데이터보다 모델이 훨씬 크면 학습 데이터를 외워 버리기 때문입니다.
② 슬라이딩 윈도우로 학습 샘플을 늘렸습니다. 한 산불의 시점 1~N을 길이 1부터 19까지의 구간으로 잘라 "이전 시점들 → 다음 시점" 쌍을 만들었습니다. 이렇게 학습 배치 151개를 구성했습니다.
결과적으로 학습에 쓰지 않은 강릉 산불에서 시점이 지날수록 실제 확산 형태를 비슷하게 재현했습니다. 초기 시점은 화선 정보 자체가 작아 부정확했지만, 불이 커질수록 모양을 따라갔습니다.
| 데이터 | Overall Accuracy | F1-score |
|---|---|---|
| 검증 (밀양) | 0.95 | 0.81 |
| 테스트 (강릉, 미학습) | 0.90 | 0.85 |
최종 결과보고서 기준. 아래 '다시 읽은 코드'에서 설명하듯, 검증 구간이 학습과 일부 겹쳐 있어 숫자는 테스트 쪽이 더 믿을 만합니다.
3년 뒤 다시 읽은 코드
포트폴리오를 위해 팀 노트북을 다시 열었을 때, 같은 코드를 사건마다 복사하고 학습 샘플을 train_x_1부터 train_x_161까지 변수로 하나씩 잘라 둔 상태였습니다. 이를 설정 파일 하나와 함수 몇 개로 재구성하고, 테스트로 "원본과 같은 배치 수(151)·같은 파라미터 수(2,736)"를 확인했습니다.
그 과정에서 당시에는 몰랐던 점들이 보였습니다. 숨기지 않고 저장소 README에도 적어 두었습니다.
LSTM이 시간 축을 보고 있지 않았다
이름은 U-LSTM이지만, 실제로 LSTM은 75×75 격자를 5,625 길이의 시퀀스로 펼친 공간 축 위에서 동작하고 있었습니다. 각 샘플은 t → t+1을 독립적으로 예측합니다. 여러 시점의 흐름을 직접 학습하려면 ConvLSTM처럼 시간 축을 입력으로 받는 구조가 맞습니다.
검증 데이터가 학습과 겹쳤다
검증에 쓴 밀양 구간이 학습 윈도우와 일부 겹쳐 있었습니다. 강릉 테스트는 완전히 분리되어 있어 테스트 결과는 유효하지만, 하이퍼파라미터를 고르는 기준으로는 사건 단위 교차검증(leave-one-fire-out)이 더 엄밀합니다.
불균형 문제에 맞는 손실 함수가 아니었다
300×300 지도에서 화선 픽셀은 아주 일부입니다. 이런 불균형 문제에서 MSE와 Accuracy만 보면 "전부 불이 안 났다"고 예측해도 점수가 높게 나옵니다. Dice·Focal loss와 IoU를 함께 보는 것이 맞습니다.
배운 것
- 데이터가 적을 때는 모델보다 데이터 구성이 먼저입니다. 파라미터 수를 줄이고 윈도우로 샘플을 늘린 선택이 결과를 만들었습니다.
- "구조의 이름"이 아니라 "텐서가 실제로 흐르는 축"을 확인해야 합니다. 당시 shape을 끝까지 따라가 봤다면 LSTM이 공간 축을 보고 있다는 것을 알았을 겁니다.
- 평가 설계는 모델 설계만큼 중요합니다. 데이터 분리와 지표 선택이 잘못되면 좋은 숫자가 아무 의미가 없어집니다.
다시 만든다면 ConvLSTM, 사건 단위 교차검증, Dice loss + IoU, 그리고 위성 영상 기반 화선 자료를 추가하는 것부터 시작하겠습니다.