# XGBoost 기반 난이도 상수 예측 모델

이 문서는 프로젝트의 핵심 학습 엔진인 XGBoost 모델의 구조, 하이퍼파라미터 및 파이프라인 과정을 설명합니다.

## 1. 모델 개요
본 프로젝트는 태고의 달인 채보의 미세한 난이도 차이(상수)를 예측하기 위해 **XGBoost (Extreme Gradient Boosting)** 회귀 모델을 사용합니다. 8가지 주요 피처를 입력으로 받아 0.1 단위의 정밀한 난이도 상수를 출력하는 것을 목표로 합니다.

## 2. 하이퍼파라미터 설정
`train/train_xgboost.py`에 정의된 주요 설정값은 다음과 같습니다.

| 파라미터 | 설정값 | 설명 |
| :--- | :--- | :--- |
| `N_ESTIMATORS` | 500 | 결정 트리의 개수 |
| `MAX_DEPTH` | 6 | 각 트리의 최대 깊이 |
| `LEARNING_RATE` | 0.05 | 학습률 (경사 하강 단계의 크기) |
| `SUBSAMPLE` | 0.8 | 각 트리 학습 시 사용할 데이터 샘플 비율 (과적합 방지) |
| `COLSAMPLE_BYTREE` | 0.8 | 각 트리 학습 시 사용할 피처 비율 |
| `RANDOM_STATE` | 42 | 결과 재현성을 위한 난수 시드 |
| `Objective` | `reg:squarederror` | 평균 제곱 오차 최소화를 목표로 함 |

## 3. 학습 프로세스 (Training Pipeline)

### A. 데이터 로드 및 매칭
- `features.json`: 전처리 단계에서 추출된 채보별 피처 데이터.
- `measure.csv`: 각 곡의 `songno`, `diff`에 대응하는 실제 난이도 상수(Label).
- 두 데이터를 `(songno, difficulty)` 키를 기준으로 매칭하여 학습 데이터셋을 구성합니다.

### B. 전처리 및 정규화
- **Feature Selection**: `songno`, `difficulty`를 제외한 모든 수치형 데이터를 피처로 사용합니다.
- **Scaling**: `sklearn.preprocessing.StandardScaler`를 사용하여 피처의 평균을 0, 분산을 1로 정규화합니다. 이는 `color_complexity`와 같이 수치 범위가 큰 피처가 모델에 과도한 영향을 주는 것을 방지합니다.

### C. 모델 학습 및 지속 학습 (Warm Start)
- `CONTINUE_TRAINING` 옵션이 활성화된 경우, 기존에 저장된 `model.pkl`과 `scaler.pkl`을 로드하여 이전 상태를 유지하며 추가 학습을 진행합니다.

## 4. 평가 지표
- **MAE (Mean Absolute Error)**: 실제 상수와 예측값 간의 절대 오차 평균.
- **Accuracy (±0.1)**: 예측값이 실제 값과 0.1 이내로 일치하는 비율을 측정하여 실질적인 예측 성능을 평가합니다.
- **Feature Importance**: 학습 완료 후 각 피처가 예측에 기여한 중요도를 출력하여 모델의 판단 근거를 확인합니다.

## 5. 예측 프로세스 (Inference)
`predict/predict_xgboost.py`를 통해 다음 과정을 거쳐 결과를 도출합니다.

1. 학습 시 저장된 `model.pkl`, `scaler.pkl`, `features.txt` 로드.
2. 입력받은 `songno`에 해당하는 피처를 `features.json`에서 탐색.
3. 학습 시와 동일한 순서로 피처 벡터를 구성하고 Scaler를 적용.
4. 모델을 통해 예측을 수행하고 결과를 JSON 배열 형태로 출력.

```json
[
  {
    "songno": "1000",
    "diff": "oni",
    "predicted": 11.2345
  }
]
```
