데이터 분석 심화

Chapter.4 데이터 분석 심화(6)

devjjun 2026. 4. 20. 20:37

TIL(Today I Learned)


1️⃣머신러닝 기초 라이브 세션 

앙상블 모델이란?

  • 여러 모델의 예측을 결합하여 더 나은 결과를 얻는 방법

배깅 (Bagging: Bootstrap AGGregatING)

원래 데이터에서 여러 번 샘플링하여 다양한 데이터셋을 만들고, 각각에 대해 독립적으로 모델을 학습

  • 배깅: 랜덤 포레스트
    • 여러 개의 결정 트리를 독립적으로 학습
    • 각 트리가 서로 다른 데이터와 특성을 사용

부스팅 (Boosting)

이전 모델이 잘못 예측한 데이터에 더 많은 가중치를 두어 순차적으로 모델을 개선

  • 부스팅: XGBoost, LightGBM(LGBM)
    • 이전 모델의 오차를 보완하는 방향으로 학습
    • 높은 예측 성능으로 실무에서 널리 사용됨

앙상블 모델의 장점?

  1. 더 안정적이고 강건한 예측 가능
  2. 과적합 위험을 줄일 수 있음
  3. 더 높은 예측 성능을 얻을 수 있음

앙상블 모델의 단점?

  1. 학습과 예측에 더 많은 시간과 자원이 필요
  2. 모델이 복잡해져서 해석이 어려워질 수 있음
  3. 적절한 앙상블 방법과 파라미터 선택이 중요 (하이퍼 파라미터 튜닝 필요할 수 있음)

결정 트리란?

  • 결정 트리는 의사결정 규칙을 나무 형태로 도표화한 것으로, 마치 스무고개 게임처럼 일련의 질문들을 통해 최종 결론에 도달하는 방식
  • 일련의 질문을 통해 데이터를 분류하거나 예측하는 모델
    • 마치 스무고개 게임처럼 특정 기준에 따라 데이터를 순차적으로 나누어 결론에 도달
    • 트리는 불순도(지니 계수나 엔트로피)가 가장 크게 감소하는 방향으로 특성과 분할 기준을 선택하면서 성장하며, 이 과정은 특정 종료 조건(최대 깊이, 최소 샘플 수 등)에 도달할 때까지 반복됩니다.
  • 결정 트리 장단점
    • 장점 : 모델의 의사결정 과정을 시각적으로 표현할 수 있어 해석이 쉽다
    • 단점 : 과적합되기 쉽다
      • 해결 방법 : 가지치기(pruning)와 같은 기법을 사용합니다.
  • 분류와 회귀 문제 모두에 사용 가능, 수치형과 범주형 변수를 자연스럽게 처리. 결정 트리는 단독으로도 사용되지만, 랜덤 포레스트나 그래디언트 부스팅과 같은 더 강력한 앙상블 모델의 기본 구성 요소로도 널리 활용
  • 불순도
    • 각 노드에서 데이터가 얼마나 섞여있는지를 측정하는 지표
    • 노드에 포함된 데이터가 단일 클래스로만 구성되면 불순도는 0
    • 모든 클래스가 균등하게 섞여 있으면 불순도는 최대
      • Gini 계수 : 불순도를 측정하느 대표적 지표
        • 예) 상환 건 80개, 미상환 건 20개라면, p(상환) : 0.8, p(미상환) : 0.2 Gini = 1 - (0.8^2 + 0.2^2) = 0.32

 

랜덤 포레스트란?

  • 랜덤 포레스트는 여러 개의 결정 트리를 생성하고, 이들의 예측을 종합하여 최종 결정을 내리는 앙상블 모델. 각각의 트리는 원본 데이터에서 무작위로 추출된 샘플(bootstrap sample)로 학습, 각 분기점에서도 무작위로 선택된 특성들만을 고려

랜덤 포레스트 작동 원리

  1. 부트스트랩 샘플링 (Bootstrap Sampling)
    • 원본 데이터에서 복원 추출로 여러 개의 학습 데이터셋을 생성
    • 예를 들어, 10,000명의 대출 데이터가 있다면, 각 트리는 10,000개의 무작위 샘플(중복 허용)로 학습
    • 이 과정에서 일부 데이터는 여러 번 선택되고, 일부는 선택되지 않을 수 있음
  2. 특성의 무작위 선택 (Random Feature Selection)
    • 각 분기점에서 가용한 모든 특성이 아닌 일부 특성만 고려합니다
    • 예를 들어, 총 20개의 특성(소득, 나이, 신용점수 등) 중 무작위로 5개만 선택하여 최적 분할을 찾습니다
    • 이를 통해 각 트리가 서로 다른 관점에서 데이터를 바라보게 됩니다
  3. 개별 트리의 학습
    • 트리 1: 소득과 DTI를 중요하게 고려
    • 트리 2: 연체이력과 LTV를 중점적으로 평가
    • 트리 3: 신용점수와 직장 안정성을 주로 확인
  4. 각 트리는 서로 다른 데이터와 특성으로 학습되므로, 다음과 같이 다양한 기준으로 판단할 수 있습니다:
  5. 앙상블 예측 (Ensemble Prediction)
    • 분류 문제: 각 트리의 예측을 투표로 결정 (예: 100개 트리 중 65개가 '상환가능' 예측)
    • 회귀 문제: 각 트리의 예측 평균 사용 (예: 상환 확률 평균 65%)

랜덤 포레스트 장단점

  • 장점
    • 과적합 위험이 낮음 (여러 트리의 예측을 평균내기 때문). 개별 트리의 오류가 상쇄되어 일반화 성능이 향상됨
    • 특성 중요도를 쉽게 계산할 수 있음 각 특성이 예측에 미치는 영향을 수치화하여 제공, 중요 변수를 쉽게 파악 가능
    • 이상치에 강건함 여러 트리의 앙상블 특성으로 인해 이상치나 노이즈에 강건한 예측 가능
    • 대규모 데이터셋에서도 잘 작동함 대규모 데이터셋에서도 안정적인 성능으로 보이며, 병렬 처리를 통해 학습 효율을 높일 수 있음
  • 단점
    • 계산 비용과 자원 요구량 다수의 트리를 동시에 운용해야 하므로 메모리와 처리 시간이 많이 필요
    • 모델의 복잡성과 해석의 어려움 각 트리가 서로 다른 특성과 기준으로 예측을 하기 때문에, 최종 결정의 정확한 이유를 설명하기 힘듦.
    • 하이퍼파라미터 튜닝의 복잡성, 최적의 성능을 얻기 위해서는 여러 하이퍼파라미터(트리의 개수, 최대 깊이, 최소 샘플 수 등)를 적절히 설정해야함.

부스팅(Boosting)이란?

  • 머신러닝에서 부스팅은 약한 학습기(Weak Learner)들을 순차적으로 학습시켜 강한 학습기(Strong Learner)를 만드는 방법

약한 학습기 (단순한 모델)

  • 하나의 간단한 기준으로 판단하는 모델
  • 예) "전압이 기준치를 벗어나면 불량"이라는 단순한 규칙

강한 학습기 (강력한 모델)

  • 여러 가지 조건을 복합적으로 고려하는 모델
  • 예) 전압, 전류, 온도, 습도, 외관 등을 종합적으로 판단
  • 여러 전문가가 다양한 검사를 수행하는 것

부스팅 핵심 원리

’순차적 학습’ (Sequential)

  • 첫 번째 모델이 잘못 분류한 데이터에 집중
  • 두 번째 모델은 이전 모델의 실수를 보완
  • 각 모델이 서로 다른 관점에서 문제를 해결

부스팅 모델 종류

AdaBoost (Adaptive Boosting)

  • 가장 초기의 부스팅 알고리즘으로, 핵심 알고리즘은 잘못 분류된 데이터에 더 높은 가중치를 부여
  • 이전 모델의 오류에 가중치를 부여하고, 다음 모델은 이 가중치가 높은 데이터에 집중하는 방식 

 

가중치 업데이트

  • 실수한 부분을 중점적으로 학습
    • 잘못 예측된 데이터의 가중치는 증가
    • 올바르게 예측된 데이터의 가중치는 감소
  • 모델 결합
    • 각 모델의 예측 결과를 가중 평균
    • 더 좋은 성능을 보인 모델에 높은 가중치 부여

Gradient Boosting Machine (GBM)

  • AdaBoost의 아이디어를 더욱 일반화시킨 알고리즘으로, 경사하강법의 원리를 부스팅에 적용. 각 단계에서 모델은 이전 모델들의 예측 오차(잔차)를 직접적으로 학습. 실제 데이터는 5 ⇒ 예측했을때 4 ⇒오차가 1 ⇒ 0에가까운 값으로 찾아가는 방법. GBM은 분류와 회귀 문제 모두에서 뛰어난 성능을 보여주며, 특히 복잡한 비선형 관계를 잘 포착
  • 경사하강법 원리 : Cost function 음의 기울기 방향으로 이동하면서 최솟값을 찾아나가는 방식

XG Boost (eXtreme Gradient Boosting)

  • GBM의 성능과 속도를 대폭 개선한 알고리즘으로, 기존 GBM의 기본 원리를 유지하면서도 여러 가지 혁신 기능이 추가된 모델
    • 정규화 항을 도입하여 과적합을 방지
      • 유사) 선형회귀 + Regularization → 릿지(L2 정규화), 라쏘(L1정규화)
    • 병렬 처리를 통한 학습 속도 향상
    • 트리 가지치기(tree pruning)를 통해 모델의 복잡도를 제어
    • 결측치 처리를 자동화
    • 2차 미분(Hessian)을 활용하여 더 정확한 방향으로 모델 최적화
  • XGBoost가 GBM보다 일반적으로 더 나은 성능을 보임

LightGBM (Light한 GBM)

  • GBM 모델의 파생 모델로, 리프 중심 트리 분할(Leaf-wise tree growth) 방식을 사용한다는 점이 가장 큰 특징 (효율성과 속도)
    • 기존의 레벨 단위 트리 분할과 달리, 가장 큰 손실 감소를 가져올 수 있는 리프 노드를 찾아 분할함으로써 더욱 효율적
      • 기존 GBM 모델 : 균형 트리 분할 vs. LGMB 모델 : 리프 중심 트리 분할
      • 균형 트리 분할 : 안정적이지만, 때론 불필요한 분할도 수행 리프 중심 트리 분할 : 메모리 사용량이 적고 학습속도가 빠름 (더 적은 수의 노드로 깊은 트리를 만들 수 있기 때문)
  • 데이터가 적을 경우, 과적합되기 쉽다는 단점이 존재합니다.

모델 선택 가이드

더보기

*AdaBoost를 선택해야 할 때:

  • 데이터셋이 비교적 작고 노이즈가 적을 때
  • 모델의 작동 원리를 명확하게 설명해야 할 때
  • 이진 분류 문제에서 특히 효과적

*GBM을 선택해야 할 때:

  • 예측 성능이 가장 중요한 고려사항일 때
  • 데이터의 비선형성이 강할 때
  • 충분한 학습 시간을 확보할 수 있을 때

*XGBoost를 선택해야 할 때:

  • 대규모 데이터셋을 다룰 때
  • 결측치가 많은 데이터를 다룰 때
  • 과적합 방지가 중요할 때
  • 높은 예측 성능과 적절한 학습 속도가 모두 필요할 때

*LightGBM을 선택해야 할 때:

  • 매우 큰 데이터셋을 다룰 때
  • 빠른 학습 속도가 필수적일 때
  • 메모리 자원이 제한적일 때
  • 단, 데이터셋이 너무 작을 경우 과적합 위험이 있으므로 주의

2️⃣Python 알고리즘 주요 문제

문제1

  • 문제 설명: 코딩테스트 연습 - 성격 유형 검사하기 | 프로그래머스 스쿨
  • 제한 사항
  • 1 ≤ survey의 길이 ( = n) ≤ 1,000
    • survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
    • survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
    • survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
  •  choices의 길이 = survey의 길이
    • choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
    • 1 ≤ choices의 원소 ≤ 7
  • 입출력 예

  • 문제 접근
    1. 각 성격유형 알파벳 키 값에 따른 점수 저장하는 딕셔너리 만들기
    2. zip함수로 묶은 survey와 choices를 for문을 통해 순회
    3. choices의 값에 따라 survey의 인덱스 값에 따른 딕셔너리의 키 값에 점수 계산하여 추가 
    4. 유형 검사로 묶인 'AN','CF'등을 짝지어 for문으로 순회
    5. 점수를 조건문으로 비교하며 answer에 인덱스 값에 따른 알파벳 추가 후 리턴
  • 코드
더보기
def solution(survey, choices):
    answer = ''
    dic = {'R':0,'T':0,'C':0,'F':0,'J':0,'M':0,'A':0,'N':0}
    for s,c in zip(survey,choices):
        if c < 4:
            dic[s[0]] += abs(c-4)
        elif c > 4:
            dic[s[1]] += abs(c-4)
    
    pairs = ['RT', 'CF', 'JM', 'AN']
    for p in pairs:
        a = p[0]
        b = p[1]
        
        if dic[a] > dic[b]:
            answer += a
        elif dic[b] > dic[a]:
            answer += b
        else:
            answer += a
            
    return answer
  • 문법 
더보기

 zip() 함수

 

👉 여러 리스트를 같은 인덱스끼리 묶어주는 함수

a = [1, 2, 3]
b = ['a', 'b', 'c']

list(zip(a, b))

[(1, 'a'), (2, 'b'), (3, 'c')]

abs() 함수

👉 절댓값 (부호 제거하고 크기만 남김)

abs(5)   # 5
abs(-5)  # 5

💡 느낀점

머신러닝 심화 주차로 넘어가기 전 모델의 종류나 어떠한 기준에서 선택해야 되는지에 대해 공부하였다. 임의의 Raw Data를 가설을 세우고 전처리 후 머신러닝 시각화까지 모든 과정을 진행하며 실습의 비중을 점차 늘려갈 예정이다. 문제를 해결하며 생각하고 고뇌하는 '망설임'의 시간을 늘려 직접 결론이나 도구를 도출하는 과정을 반복 숙달할 예정이다.