프로젝트 4주차 타임라인 (Tue Jan 27 2026)


[12] CatBoost, XGBoost

모델 파라미터 조정값 설정 목정
CB iterations 1000 충분한 반복 학습으로 recall 안정성 확보
learning_rate 0.1502 빠른 학습과 성능 확보를 위한 비교적 높은 학습률
depth 7 중간 수준 트리 깊이로 비선형 상호작용 포착
l2_leaf_reg 9 강한 정규화로 과적합 억제
random_strength 0.0064 split 랜덤성 최소화로 예측 안정성 유지
bagging_temperature 0.815 샘플링 변동성 조절로 generalization 향상
scale_pos_weight 93.14 극심한 클래스 불균형 보정 (FN 최소화)
cat_features categorical index categorical feature 직접 처리
random_state 42 재현성 확보

Stage 1 요약: false negative 최소화, recall 중심 튜닝을 위해 class weight를 강하게 부여, 확률 score S1 생성 전용 filter 역할

모델 파라미터 조정값 설정 목적
XGB n_estimators 651 충분한 tree 수로 복잡한 decision boundary 학습
learning_rate 0.1132 과적합 없이 precision 향상
max_depth 9 고차 feature interaction 포착
min_child_weight 9 noise 분기 억제로 false positive 감소
gamma 0.922 보수적 split으로 불필요한 분기 제한
subsample 0.825 샘플 부분 학습으로 분산 감소
colsample_bytree 0.719 특정 feature 의존도 완화
reg_alpha 0.382 L1 정규화로 sparsity 유도
reg_lambda 2.99e-05 약한 L2 정규화로 fine-tuning
scale_pos_weight 19.44 Stage 2 데이터 기준 클래스 불균형 보정
tree_method hist 대규모 feature 처리 효율화
random_state 42 재현성 확보

Stage 2 요약: Stage 1 통과 후보만 대상으로 학습, precision 최적화, hard negative 구분을 위해 보수적 분기 조건 적용

항목 목적
Stage 1 Threshold 0.463 high-recall filtering 기준
Final Score Weight S₁: 0.4 / S₂: 0.6 Stage 2 중심의 weighted cascade
Final Threshold 0.957 최종 high-confidence candidate 선별
Note
CatBoost 기반의 high-recall screening 이후 XGBoost 기반의 precision refinement를 수행하는 two-stage ensemble cascade 구조로 stage 간 score를 연속적으로 전달함으로써 (1) recall 손실 없이 false positive를 효과적으로 제거하며, (2) 실험 가능성과 예측 신뢰도를 동시에 만족하는 후보군을 안정적으로 확보함

문제 설명 solution.py
디펜스 게임은 준호가 보유한 병사 n명으로 연속되는 적의 공격을 순서대로 막는 게임입니다. 디펜스 게임은 다음과 같은 규칙으로 진행됩니다.

(1) 준호는 처음에 병사 n명을 가지고 있습니다.
(2) 매 라운드마다 enemy[i]마리의 적이 등장합니다.
(3) 남은 병사 중 enemy[i]명 만큼 소모하여 enemy[i]마리의 적을 막을 수 있습니다. 남은 병사의 수보다 현재 라운드의 적의 수가 더 많으면 게임이 종료됩니다.
(4) 게임에는 무적권이라는 스킬이 있으며, 무적권을 사용하면 병사의 소모없이 한 라운드의 공격을 막을 수 있습니다.
(5)무적권은 최대 k번 사용할 수 있습니다.

준호는 무적권을 적절한 시기에 사용하여 최대한 많은 라운드를 진행하고 싶습니다. 준호가 처음 가지고 있는 병사의 수 n, 사용 가능한 무적권의 횟수 k, 매 라운드마다 공격해오는 적의 수가 순서대로 담긴 정수 배열 enemy가 매개변수로 주어집니다. 준호가 몇 라운드까지 막을 수 있는지 return 하도록 solution 함수를 완성해주세요
import heapq as hq

def solution(n, k, enemy):
     q = enemy[:k]
     hq.heapify(q)
     for idx in range(k,len(enemy)):
          n -= hq.heappushpop(q,enemy[idx])
          if n < 0:
               return idx
     return len(enemy)

+ Recent posts