본문 바로가기

AI 훈련소 기록실

[플레이데이터 SK네트웍스 Family AI 캠프 19기] 7주차 회고

 

 

벌써 7주 차라니 시간 참 빠르다.

7주 동안 출석은 잘했으니까 칭찬을 해주도록 하자.

"참 찰했어요!"


 

 

💡  미니 프로젝트

 

2주간 진행되었던 EDA, ML 미니 팀 프로젝트가 월요일에 끝났다.

칭찬하자마자 반성 챕터라니.. 심지어 기억도 가물가물하다.

리마인드를 위해 다른 팀원의 회고록과 깃허브 프로젝트 내용을 참고해서

2주 동안 수업 외 시간을 쪼개 진행했던 미니 프로젝트 회고록을 써보려 한다.

 

 

1. Slack & 처음 맛본 체계화.

 

  • 팀원의 초대로 Slack 앱을 처음 써봤다.
  • 체계적인 작업 단계, 깃허브 연동, 각종 게시판 등 프로젝트 진행을 위한 가이드까지 잘 정돈되어있었다.
  • 이번에도 버스 잘 탔구나 싶은 간사한 마음과 열심히 참여해서 크게 도약하자 싶은 마음이 동시에 들었다.

 

 

2. 시작은 늘 좋았지.

 

  • '여행지 추천', '관광 가이드'를 프로젝트 주제로 결정함.
  • AI Hub를 통해 국내 수도권 여행로그 데이터 수집.
  • EDA 과정을 거치고 나니 피쳐들의 애매한 상관관계, 핵심 변수 부족등 데이터 한계에 발목이 잡혔다.

 

 

3. 데이터 한계를 기회로.

 

  • 다행히 우리 팀에는 능력자가 많았고 문제 대비를 위한 아이디어는 이미 나와있었다.
  • 사용자의 입력값을 토대로 '망한 여행''성공적인 여행'을 구분하는 이진 분류 모델 설계를 목표로 주제를 변경했다.
  • 개인적으로 처음 주제보다 변경된 주제가 더 마음에 들었고, 팀원의 혜안에 감탄했다.

 

 

 

 

 

4. 모델 선정 및 과정 요약.

 

  • 범주형 변수가 많기에 CatBoost를 핵심 모델로 선정.
  • XGBoost와의 비교 검증을 통해 CatBoost를 최종 모델로 선정.
  • 수차례 실험을 시도했으나 만족할 만한 성능이 나오지 않았다.
  • 정보가 부족한가 싶어 활동 관련 데이터를 전부 모델에게 알려주니 오히려 성능이 더 떨어졌다.
  • 학습점수만 높고 테스트 점수는 낮은 상황(과적합 현상)이 반복됨.

 

 

5. 최종 모델 완성과  과정.

 

  • 기존 이진 타깃 대신 새로운 타겟 정의 "SUCCESS_SCORE" (0~50)
  • "A" (주관적 만족도(max40)) + "D" (경험 다양성(max10)) = "SUCCESS_SCORE"
  • 35 미만 기준으로 이진화 : IS_FAILED_TRIP = (SUCCESS_SCORE < 35). astype(int)
  • 최상의 모델 성능을 찾기 위해, 주요 하이퍼파라미터의 범위를 지정한 뒤 Optuna로 100회에 걸쳐 최적화 과정을 진행.
더보기

팀원이 열심히 정리한 상세 내용 가져옴.

 

 

신규 타깃: SUCCESS_SCORE

기존의 이진 분류 타깃인 `IS_FAILED_TRIP` 대신, 여행의 질을 종합적으로 평가하는 회귀(regression) 타겟인 `SUCCESS_SCORE`를 새롭게 정의합니다. 점수는 0점에서 50점 사이의 값을 가집니다.

점수는 현재 사용 가능한 데이터를 바탕으로 다음 두 가지 항목의 조합으로 계산됩니다.

(A) 주관 만족 축 (최대 40점)

여행자가 각 방문지에서 평가한 만족도, 재방문 의향, 추천 의향 점수의 평균을 사용합니다.

계산 방식:
  1. 각 여행(`TRAVEL_ID`)에 포함된 모든 방문지의 만족도(`DGSTFN_AVG`), 재방문 의향(`REVISIT_AVG`), 추천 의향(`RCMDTN_AVG`) 점수의 평균을 계산합니다.
  2. 세 가지 평균 점수를 다시 평균 내어 '종합 만족도 평균'을 구합니다. (각 점수는 1~5점 척도로 가정)
  3. 이 종합 만족도 평균을 0점에서 40점 사이의 점수로 변환합니다.
     - `점수 = ((종합 만족도 평균 - 1) / 4) * 40`

 

(D) 경험 다양성 축 (최대 10점)

한 여행에서 얼마나 다양한 활동을 했는지를 측정합니다.

계산 방식:
  1. 각 여행(`TRAVEL_ID`)에서 경험한 고유한 활동 유형(`ACTIVITY_TYPE_CD`)의 개수를 계산합니다.
  2. 활동 개수에 따라 점수를 부여하며, 최대 5개의 활동까지만 점수에 반영하여 10점 만점으로 변환합니다.
     - `점수 = min(고유 활동 개수, 5) * 2`

최종 성공 점수

`SUCCESS_SCORE` = (A) 주관 만족 점수 + (D) 경험 다양성 점수
- 생성 로직: `travel['IS_FAILED_TRIP'] = (travel['SUCCESS_SCORE'] < 35).astype(int)`
  - 의미: `SUCCESS_SCORE < 35`인 경우 실패(1), 그 외 성공(0)
- 최종 사용 타깃: `BINARY_CLASSIFICATION_TARGET = 'IS_FAILED_TRIP'`
------------------------------------------------------------------
- 탐색 공간(주요 하이퍼파라미터):
  - `depth`: 1~6(정수)
  - `iterations`: 800~2000(정수)
  - `learning_rate`: 1e-3~0.2(로그 스케일, 실수)
  - `l2_leaf_reg`: 1.0~12.0(실수)
  - `min_data_in_leaf`: 10~64(정수)
  - `border_count`: 64~254(정수)
  - `rsm`: 0.7~1.0(실수)
  - `bootstrap_type`: {'Bayesian', 'Bernoulli'}
    - if `Bayesian`: `bagging_temperature` 0.0~3.0(실수)
    - else(`Bernoulli`): `subsample` 0.6~1.0(실수)
- 탐색 횟수: `n_trials = 100`
------------------------------------------------------------------
- 내부 K-Fold 검증 블록: `StratifiedKFold(n_splits=5)`에서 fold별 모델을 학습하고, 고정 임계값 0.5로 분류 지표/PR-AUC를 출력. PR-AUC가 가장 높은 fold의 모델을 `best_model`로 채택.

  • OTTF MVP (ONE TRIP, TWO FATES)

능력자 팀원이 만든 스트림릿 페이지 시연 영상

 

더보기

OTTF 로고송 후보들

 

OTTF 로고 아주 짧은 스타일

 

 OTTF 로고 테마파크 스타일

 

OTTF 로고 대형마트 스타일

 

OTTF 로고 라디오광고 스타일

 

OTTF 로고 POP 스타일

 

 

 

 

 

                 OTTF_LOGO

 

                                             by. KUGNUS

 

Yeah!!!

One Trip, Two Fates (La La La La)

두근대는 시간, Roll the dice!!

One Trip, Two Fates (La La La La)

망할까? 어떨까? Adventure never dies!!

 

 

 

 

가사는 라임충답게 라임에 충실했고

대중에게 익숙한 로고송 스타일로 써봤다.

 

"시간"을 "순간"으로 바꾸기도 "La" 개수를 바꾸기도,

장르 프롬프트를 바꿔보기도 하고 옵션을 추가해 보면서 여러 개를 뽑고

그중에 추려서 나온 것 들이다.

 

스트림릿 담당자가 알아서 잘 딱 센스 있게 선택하셨다.

 

직접 만든 거냐고 누가 물었었는데 AI 생성 음악입니다.

퀄리티를 올릴 수 있는 비법이 많지만 아무도 안 궁금할 것 같으니 여기까지.

(직접 만들면 훨씬 잘하죠)

AI 음악 생성에 관심 있다면 SUNO AI 이거 누르고 가입하면 저한테 소량의 크레디트 들어옴.

 

고마운 팀원들

 

암튼 팀 플랜 B 땡큐!

6. 미니 프로젝트가 끝나고 2차 프로젝트의 시작

 

  • 이번 협업에서 내가 한 일은 주방보조였고, 메인디쉬는커녕 사이드디쉬를 책임질 실력조차 없었기에, 데코레이션을 돕는 것에 그쳤다.
  • 아마 미니 프로젝트를 겪지 않았다면 현재 나의 무지함은 얼마나 대단했을지 상상조차 하고 싶지 않다. 🥲
  • 긴 연휴 동안 시간을 갈아 넣어서라도 큰 발전을 이루어야겠다.

 


 

🔍   수업 핵심 주제 (9/29 ~ 10/2 )

 

 

  • 신경망의 학습 구조: 순전파 → 손실 → 역전파 → 최적화
  • 활성화 함수의 역할과 선택: Sigmoid/Tanh/ReLU/Leaky ReLU
  • 수치·자동 미분의 감각: 기울기(순간 기울기)와 손실면에서의 “내리막”
  • 텐서와 메모리 감각: 4D 이미지 텐서 차원/순서, 얕은/깊은 복사
  • 손실/최적화: MSE/MAE/Huber, BCE/CE, SGD–Adam까지의 흐름

 

수업시간에 딴생각이 들 때마다 정신줄을 바로 잡고자 수업내용을 타이핑해놓으니 지나고 나서 뭘 배웠는지 돌아볼 수 있어 좋았다.

타자 속도가 빨라진 건 덤.

 

메모한 내용들은 따로 정리해 놓았으니 천천히 복습해야겠다.

이제 진짜 공부 열심히 해야지 안 그러면 더 큰 스트레스를 만날 것 같다.

2차 프로젝트도 파이팅.

 

 


 

 

🛠️  KPT 회고

 

 

✅ Keep

 

  1. 메모 습관
    •    지난주에 이어 열심히 메모했고, 기억력이 소폭 상승했다. 치매완치 해보자.
    •    이해력은 아직 제자리 같은데 폭풍 메모 덕에 타자는 꽤 빨라졌다.
  2. 자존감 회복
    •    긴 연휴를 맞을 생각에 스트레스가 많이 줄었다.
    •    사소한 칭찬을 매일 했더니 자존감이 꽤 회복됐다. 칭찬은 좋은 것.
  3. 로직 이해
    •    모든 경우에 해당하지는 않지만 아주 조금은 이해력이 생겼다. 끈기를 기르자.
    •    이해가 갈 때까지 물고 늘어지는 끈기가 생겼다. (시간대비 효율은 별로였음)

 


 

⚠️ Problem

 

  1. 여전해 성욱킴
    •    이해력 부족, 관계성 연속성 납득 부족.
    •    어째서? 왜? 라는 물음이 많아짐. 내용이 어려워졌거나 시냅스가 일부 끊긴게 분명함.
  2. 만성피로
    •    이해가 안가는 것들에 대해 과몰입하는 경향이 있음.
    •    공부라 하기엔 뭔가에 집착하느라 수면의 질이 안좋고 하루 1~3시간 정도 잤음.
  3. 효율 부족
    •    머리로는 아는데 왜 집에만 오면 비효율적으로 학습하는지 모르겠음.
    •    왜 건반을 치면 이해가 늘거라는 망상을했을까? 지금 돌이켜보면 영 이해가 안감.

 


 

🚀 Try

 

  1. 연휴 반납
    •    긴 연휴동안 잠은 푹 자되 복습 열심히, 2차 프로젝트 열심히 하자.
    •    반납은 오바임. 쉬엄쉬엄 할거니깐.
  2. 멍 때리는 시간 줄이기
    •    휴일의 유일한 낙인 멍때리는 시간을... 줄이자..ㅠ
    •    근데 이건 좀 싫다.
  3. 자기 칭찬 루틴
    •    성취가 없어도 칭찬한다. 오늘 밥도 잘 챙겨 먹었다 건강해서 좋다.
    •    귀찮지만 일단 컴퓨터 앞에 앉아서 회고록을 썼잖아 하 대단해.