LG U+ Why Not SW CAMP 7기 10주차 회고

gayoniee·2025년 7월 20일

회고

목록 보기
10/25

Liked

  • 하이퍼파라미터 튜닝을 단순히 점수만 보는 게 아니라 best_params와 best_score 그리고 실제

    accuracy를 함께 비교하면서 교차검증 기준 vs 테스트셋 기준이 다를 수 있음을 인지했다.

    → 모델이 교차검증에선 안정적으로 보이지만 테스트셋에서는 성능이 다를 수 있다는 점까지 연결된 점이 좋았다.

  • 라벨 인코딩(LabelEncoder)과 원-핫 인코딩(get_dummies)의 차이를 실제 성능으로 비교해보고

    모델이 어느 정도 영향을 받는지 탐색했다는 점이 좋았다.

    → 인코딩 방식이 의미하는 바까지 고민

  • 단순히 모델 학습에 그치지 않고 Precision-Recall Curve를 활용한 threshold 튜닝까지 진행했다는 점이 가장 만족스러웠다.

  • XGBoost와 LightGBM 등의 앙상블 모델 비교를 통해 모델 간 성능 차이를 분석할 수 있었다.

  • SMOTE를 통해 불균형 클래스 문제를 실제로 해결해보며 모델 성능이 어떻게 변하는지 알 수 있었다.

  • 피처 중요도 시각화를 통해 모델이 어떤 변수에 더 많이 의존하는지를 파악할 수 있었고 데이터 인사이트까지 연결해볼 수 있었다.

  • 실습 흐름이 구조화되어 있어 실전 데이터 분석 프로젝트처럼 느껴졌다.

Learned

  • 데이터를 모델에 넣기 전, 항상 X (입력 피처)와 y (타겟 값)를 명확하게 구분해야 한다.
  • 교차검증 기반 하이퍼파라미터 튜닝 흐름을 배웠다.
    • GridSearchCV 를 사용하여 best_params를 찾아보았다.
    • 결정트리 모델에서 max_depth, min_samples_split, min_samples_leaf를 튜닝했을 때 실제 성능이 어떻게 달라지는지를 직접 확인해보았다.
  • 원-핫 인코딩과 라벨 인코딩의 적용 차이 → 타이타닉 데이터에서 pd.get_dummies()LabelEncoder가 모델 성능에 직접 어떤 영향을 주는지 직접 보았다.
  • 교차검증의 필요성 데이터가 적거나 분포가 불균형할 경우, 한 번의 train/test 분할로는 모델을 신뢰할 수 없음

    StratifiedKFold는 클래스 불균형이 있는 분류 문제에서 클래스 비율 유지라는 큰 장점이 있음.

  • 피처 중요도 = 계수의 의미: lr.coef_pd.Series로 바꿔서 .sort_values()로 정렬하면, 각 피처가 생존 예측에 얼마나 영향 미치는지 확인할 수 있다는 걸 배웠다.
  • Threshold 조정의 의미와 적용법: predict_proba()로 확률을 얻은 뒤 threshold를 바꿔가며 예측 결과를 바꾸는 방식 custom_proba 가 모델의 재현율이나 F1-score을 컨트롤할 수 있다는 걸 직접 확인했다.
  • XGBoost와 LightGBM 사용 시 주의사항:
    • XGBoost는 타겟 레이블이 반드시 0부터 시작해야 함 ([0, 1, 2, ...])
    • LightGBM은 피처 이름에 (), , , 같은 JSON 특수문자가 있으면 에러를 발생시킨다는 것!
    • 각각의 모델이 쓰기 전엔 몰랐던 제약 조건이 있다는 걸 깨달음.
  • classification_report를 통해 Accuracy보다 정밀도(Precision), 재현율(Recall), F1-score가 얼마나 중요한지 다시 한번 느꼈다.
  • 모델에 따라 특정 성별의 Recall이 유독 낮아질 수 있음을 확인했고, 이는 데이터 불균형 혹은 피처 편향성과 연결될 수 있다는 점도 이해했다.

Lacked

  • random_state=42를 습관적으로 쓰고 있었지만 정확한 의미나 이유 없이 외우고 있었던 것을 돌아보게 됐다.

  • 스케일링(LogisticRegression) 유무가 성능에 영향을 주지 않았던 것에 대해선

    모델 구조에 따라 전처리 영향력이 다르다는 인사이트로 남기기로……

  • 하이퍼파라미터 튜닝은 일부만 수행되었고 GridSearch나 CrossValidation 등을 적용해 모델 성능을 더 체계적으로 높여볼 여지가 있었다.

  • 성별이라는 특성을 예측하는 문제이니만큼 편향성에 대해 더 깊게 접근할 필요가 있다는 점도 떠올랐지만 깊이 다루진 못했다.

  • SMOTE를 적용했을 때 학습 데이터와 실제 평가 데이터 간의 분포 차이를 좀 더 정밀하게 비교하지 못한 점이 아쉬웠다. 실제 데이터에선 오히려 과적합이 될 수도 있다는 생각이 들긴했는데… 오버샘플링 후 리스크 분석이 부족했다.

  • 너무 많은 개념과 용어를 한꺼번에 접하다 보니, 어느 순간부터 정신이 멍해졌다.

  • 특히 어려웠던 건:

    • 조건부 확률에서 계산하는 것….
    • 베이즈 정리에서 어떤 게 사전이고 어떤 게 사후인지….
    • binom.cdf()로 계산한 값이 실제로 뭘 의미하는지
    • 이상(≥), 이하(≤)를 바꿔 쓸 때 왜 1에서 빼는지
    • 시각화 그래프에서 왜 특정 막대만 색을 바꾸는지
  • 확률분포 그래프를 그렸지만 그게 내 머릿속에 정리되는 건 아니었다.

    그냥 그래프가 생기긴 했는데… 그랬구나…"하는 느낌이었다.

Longed For

  • 앙상블 모델을 단순 Voting이 아닌 Stacking 기법으로 구성해보고, 복수 모델 조합의 시너지를 확인해보고 싶다.

  • 파생변수 생성을 더 적극적으로 해보고 싶다.
    총구매금액 대비 환불 비율, 방문당 평균 구매액, 주구매상품의 전체 내 비중 같은 변수들을 새로 만들면 모델이 고객의 구매 패턴을 더 잘 학습할 수 있을 것 같다.
    이번에는 잘 몰라서 시도하지 못했지만 다음 분석에서는 필요하다면 도전해봐야겠다.

  • 확률분포 그래프도 그냥 그리는 게 아니라

    이 막대 하나가 무슨 의미인지 직접 말로 설명할 수 있을 정도의 감각을 갖고 싶다.

  • 그리고... 아직 포아송, 정규, 베르누이 같은 말들도 내 언어가 된 건 아닌 것 같다.

    너무 많은 걸 한 번에 보지 말고 내일은 천천히 다시 보는 걸 목표로 해보고 싶다.

0개의 댓글