2월 마지막 주다.
시간이 너무 빠르다.
37일차 - 38일차
* 프로젝트 기간으로 기존의 Four F's of Active Reviewing 형식이 아닌 정리 위주로 작성하였다.

도시락 쌀 힘이 없어서 메가X터디에 의존
날짜 : 2026-02-23 - 2026-02-24 | 오늘의 메뉴 : 메가X터디 구내식당
Project Review
1️⃣ 문제 정의
프로젝트를 하면서 가장 중요했던 건 노쇼(1) 예측 모델의 성능을 끌어올리는 것이었다.
타겟 : 0 (정상 방문), 1 (노쇼)
데이터 특성 : 전체 노쇼 비율이 20.19%로 불균형 데이터셋이었음
모델 후보 : XGBoost, CatBoost
평가 지표:
- ROC-AUC
- Recall
- F1-score
병원 예약 후 노쇼 예측이 목표였기 때문에 정확도보다 노쇼를 얼마나 잘 잡아내는지(recall)를 더 중요하게 생각했다.
2️⃣ 중점적으로 다룬 부분
① 데이터 누수 제거
시계열 데이터에서 발생할 수 있는 데이터 누수를 가장 먼저 고려했다.
🔹 문제 상황처음엔 환자별 과거 노쇼 횟수(patient_prev_noshow_count)를 만들 때 단순히 scheduled_at 기준 정렬 후 누적하면 된다고 생각했다. 하지만 분석 결과 총 예약 건수는 140,000인데 시간 순서가 역전된 데이터는 12,334건으로 총 8.78%에 달했다.
이는 예약은 먼저 했지만, 진료일이 뒤에 있는 케이스였고 과거 정보에 미래 정보가 섞이는 심각한 누수를 발생시켰다.🔹 개선 방식
Train 데이터는 시간순으로 누적(shift 적용)하고 Valid 데이터는 Train 전체 기준으로 집계하였다. Test 데이터 역시 Train, Valid 전체 기준으로 집계하여 각 시점에서 그 시점까지 확정된 정보만 사용할 수 있도록 재설계했다.
② 클래스 불균형 대응
XGBoost에 내장되어 있는 scale_pos_weight를 3.79로 조정하여 클래스의 불균형을 해결하고자 하였다. F1 score를 기준으로 threshold 튜닝을 시도하여 최적값이 0.49라는 것을 확인하였다. 다만 recall값이 소폭 조정되는 것에 그쳤고, threshold가 문제가 아니라 피처 품질 자체가 문제라는 생각이 들었다.
③ 피처 엔지니어링
최종 27개 피처로 구성했다
- 예약 관련 : 대기일수(lead_time_days), 같은 날에 예약한 환자 수(same_day_appts)
- 환자 이력 : 지금까지 노쇼한 횟수(patient_noshow_count), 노쇼 비율(patient_noshow_rate), 예약횟수(patient_appt_count)
- 지역 통계 : 지역 노쇼 비율(nhood_noshow_rate)
- 날씨 변수, 휴일 변수 등

SHAP 분석
두 모델 모두 lead_time_days가 압도적 1위 피처이나, 2~4위 순위에서 차이가 발생하였다.
XGBoost vs. CatBoost
| 1 | lead_time_days | lead_time_days |
| 2 | age | age |
| 3 | nhood_noshow_rate (지역 수준) | patient_noshow_rate (개인 수준) |
| 4 | patient_noshow_rate | nhood_noshow_rate |
| 5 | patient_noshow_count | same_day_appts |
XGBoost는 **지역 집단 패턴(nhood_noshow_rate)**을 우선시한 반면, CatBoost는 **개인 이력 패턴(patient_noshow_rate)**을 더 중요하게 활용했다.


Interaction plot (Top3 비교)
두 피처 간 상호작용이 미치는 영향을 분석했을 때
XGBoost lead_time_days × nhood_noshow_rate 예약 기간과 지역 노쇼율의 상호작용이 강함 → 지역 집단 수준 패턴에 민감 CatBoost lead_time_days × patient_noshow_rate 예약 기간과 개인 노쇼율의 상호작용이 강함 → 개인 이력 기반 패턴에 민감 노쇼 예측의 목적(개별 환자 관리)을 고려할 때, 개인 이력 기반 상호작용을 포착하는 CatBoost가 더 적합한 모델이라고 판단하여 최종 모델로 사용하였다.
그 외에도 PR-AUC, ROC-AUC, F1 모두 전체 모델 중 최고 성능을 보였다.
GitHub - SKNETWORKS-FAMILY-AICAMP/SKN25-2nd-6Team
Contribute to SKNETWORKS-FAMILY-AICAMP/SKN25-2nd-6Team development by creating an account on GitHub.
github.com
위 GitHub 페이지에서 자세한 프로젝트 내용을 확인할 수 있다.
회고
이번 프로젝트는 리더십에 대한 고민, 기술적 성장 측면에서 의미있는 경험이었다.
1. 리더십 : 소통의 중요성
대학 이후로 오랜만에 팀장을 맡으며, 좋은 리더란 어떤 리더일까에 대해 생각해보는 계기가 되었다.
사람마다 부트캠프에 참여한 목적이 달랐기 때문에 프로젝트에 대한 열정의 크기에 차이가 있었고 이로 인해 개인적인 아쉬움을 느끼기도 했다. 나의 목표치에 맞춰 팀을 이끌어 완성도 높은 결과물을 만드는 것이 좋은 리더인지, 혹은 해야할 일을 분담하고 팀원들의 각자 역량 안에서 최선의 결과를 낼 수 있도록 도움을 주는 리더가 좋은 리더인지 많은 고민을 했다.
결론부터 말하자면 답을 찾진 못했다. 하지만, 협업 시 서로의 기대치를 명확하게 조율하고 소통하는 일이 얼마나 중요한지 깨달았다. 고민에 대해서는 앞으로 더 많은 경험을 하면서 나만의 답을 찾아갈 수 있을 것이다.
2. 기술적 측면 : 데이터의 중요성
데이터 전처리부터 모델링, SHAP 기반 해석, 시각화까지 머신러닝 파이프라인의 전 과정에 참여했다. 이 과정에서 데이터의 시계열적 특성을 고려해서 데이터 누수 방지를 우선시했고, 피처 엔지니어링을 진행하면서 피처 설계의 중요성도 배울 수 있었다.
XGBoost와 CatBoost를 동일 조건에서 비교 실험하면서 알고리즘 구조와 학습 방식의 차이가 실제 성능에 어떻게 영향을 미치는지 확인해보기도 했다. 이번 프로젝트를 통해 파라미터 튜닝이나 모델 선택 이전에 가장 중요한 것은 '좋은 데이터'라는 사실을 다시 한 번 실감했다.
39일차
날짜 : 2026-02-25 | 오늘의 메뉴 : 고구마치즈돈까스
Four F’s of Active Reviewing
Facts : 정규표현식, 형태소 분석(Komoran, Okt)을 통한 한국어 텍스트 전처리 방법 및 TF-IDF의 한계, 이를 극복하기 위해 등장한 Word2Vec(CBOW, Skip-gram) 학습
Feelings : 단순 빈도수 측정을 넘어 텍스트 데이터가 토큰화되고 벡터화되면서 의미를 가진다는 게 신기했다. 직장인 시절 자주 하던 꼬맨틀이라는 게임이 이와 같은 단어간 유사도 측정을 기반으로 만든 게임이었는데, 실제로 어떻게 형태를 분석하고 유사도를 맵핑해가는지 알게 되어서 더 재밌었다.
Findings : TF-IDF 기반의 BoW 방식은 단어 수가 많아질수록 대부분의 요소가 0이 되는 희소 행렬 문제를 야기한다. 또한 같은 단어인 경우 의미가 다르더라도 의미적 유의성을 파악하지 못한다. Word2Vec을 쓰면 주변 단어와의 문맥적 관계를 통해 단어를 저차원의 연속적인 숫자 데이터로 맵핑할 수 있다
Future : 원문 논문 리뷰하기
수업 끝나고 PCCE 시험을 봤다.


한 달 사이에 많이 늘었다.
만점을 받았다 ✌🏻
이제 다음 달에는 PCCP 레츠고 ~~~
40일차
날짜 : 2026-02-26 | 오늘의 메뉴 : 메가
Four F’s of Active Reviewing
Facts : RNN의 구조와 한계점. 이를 극복한 LSTM 모델. 경량화 버전인 GRU 개념 학습
실습으로는 Konlpy로 네이버 영화 리뷰 데이터(NSMC)를 사용해서 한국어 감성 분석 모델을 LSTM으로 구현해봄Feelings : predict_sentiment 함수로 "사랑해" -> 긍정 90%, "별로다" -> 부정 0.31% 같은 결과가 나오는 걸 보니 모델이 제대로 학습된 것처럼 보였다. 다만 "내가 너 사랑해서 이러는 거야"같은 애매한 문장은 긍정 61%로 애매한 값을 보여줬다. 한계는 조금 있는 듯 하다.
Findings : RNN은 타임스텝이 길어질수록 초기 정보가 희석되는 구조적 한계가 있다. LSTM에서는 이를 망각게이트, 입력게이트, 출력 게이트 3개로 나누어서 해결했다. 그래서 실제 검증 정확도가 RNN으로 돌렸을 때는 62%였는데, LSTM으로 돌렸을 때는 86%로 크게 향상됐다.
한국어 소규모 데이터 감성 분석에는 형태소 분석과 더불어 불용어 제거 같은 전처리가 중요하다.
Future : RNN 계열 모델 발전 과정 복습. Attention is all you need 논문 읽기 🥹 (계획만 129301294번째 세우는 중)
📌 오늘의 핵심 정리
- 흐름 : RNN -> LSTM -> (GRU) -> Attention -> Transformer
41일차
날짜 : 2026-02-27 | 오늘의 메뉴 : 메가! 다음주엔 다시 도시락 싼다! (다짐)
Four F’s of Active Reviewing
Facts : 어제 배운 RNN/LSTM 내용을 복습하면서 희소 행렬, 나이브 베이즈 개념을 정리했다. 오후에는 Gmail SMTP로 실제 이메일을 전송하는 코드를 작성하며 스팸 메일 필터를 만들어봤다
Feelings : 단순히 모델을 돌리는 것에서 그치지 않고 Gmail 연동 -> 나이브 베이즈 필터 -> FastAPI/Docker 까지 연동해보면서 실제 서비스가 어떻게 이루어지는지 감이 잡혔다.
Findings : 단어를 벡터로 표현할 때 희소행렬 문제가 생기는데, 이는 임베딩으로 밀집 벡터로 변환하면서 완화된다.
또한 사전에 없는 단어는 UNK(인덱스 1)로 처리해서 vocab에 없는 단어가 들어와도 오류가 나지 않는다.Future : docker 연동을 제대로 못 해둬서 다시 연동해보기
📖 주말 복습
프로젝트 끝난 기념으로 푹 쉬면서 알고리즘 스터디 공부 위주로 했다.
리눅스랑 친해지겠답시고 리눅스 1급 신청해뒀는데 2주 남았다 ㅎㅎ
다음 주엔 리눅스 1급 자격증 공부로 바쁠 예정이다..

'SK네트웍스 AI 25기' 카테고리의 다른 글
| SK네트웍스 Family AI 캠프 25기 | 11주차 회고 (0) | 2026.03.18 |
|---|---|
| SK네트웍스 Family AI 캠프 25기 | 10주차 회고 (1) | 2026.03.10 |
| SK네트웍스 Family AI캠프 25기 | 7주차, 8주차 회고 (1) | 2026.03.03 |
| SK네트웍스 Family AI캠프 25기 | 6주차 회고 (2) | 2026.02.10 |
| SK네트웍스 Family AI 캠프 25기 | 5주차 회고 (2) | 2026.02.03 |
댓글