끄적끄적

2025.07.01 머신러닝 세션 2 본문

[스파르타]내일배움캠프 데이터 분석 트랙/Session

2025.07.01 머신러닝 세션 2

kminx 2025. 7. 9. 16:44
튜터 임정 튜터님
학습목표 1. 분류 모델링을 알아보는 것을 목적으로 합니다.
2. Decision Tree과 Random Forest 모델을 익혀봅니다.
3. 평가지표 Accuracy, F1-score에 대해서 알아봅니다.

1️⃣ 의사결정나무와 랜덤포레스트

숫자를 맞추는 것은 어렵습니다. 하지만 up-down 게임처럼 범주가 2개라면 맞추기 더 쉬워집니다. 회귀가 숫자를 맞추는 예측 모델링이라면 분류는 속한 카테고리를 맞주는 방법입니다. 예를 들면, 타이타닉과 같은 유명한 데이터가 있습니다. 승객들의 정보를 가지고 생존에 대한 유무를 맞추는 고전적인 데이터입니다.

 

📌 의사결정나무

 

의사결정나무는 트리 구조로 전체 자료를 몇개의 소집단으로 분류하거나 예측을 수행하는 분석 방법이다.

  • 장점
    • 쉽고 해석하기 용이
    • 다중분류와 회귀에 모두 적용이 가능
    • 이상치에 견고하며 데이터 스케일링이 불필요(데이터의 상대적인 순서를 고려해서)
      데이터 *스케일링: 데이터를 0,1 사이와 같이 숫자의 범위를 제한하여 단위 차를 극복하는 방법
  • 단점
    • 나무가 성장을 너무 많이하면 과대 적합의 오류에 빠질 수 있다.
    • 훈련 데이터에 민감하게 반응하여 작은 변화가 노이즈에도 나무의 구조가 크게 달라짐(불안정성)
  • Python 라이브러리
    • sklearn.tree.DecisionTreeClassifier
    • sklearn.tree.DecisionTreeRegressor

 

 

그러나, 의사결정나무는 과적합과 불안정하다는 문제가 있다.
이를 해결하기 위해 나온 방법이 랜덤포레스트이다.

 

 

📌 랜덤포레스트

 

랜덤포레스트는 쉽게 말하면 나무를 여러개 만들어 숲을 만드는 방법이다.

랜덤포레스트는 의사결정나무에 배깅이라는 앙상블 학습을 적용한 모델이다.

  • 앙상블 학습: 여러 개의 모델을 만들어 결과를 합치는 것
  • 배깅: Bootstrap Aggregation의 약자. 샘플을 여러 번 뽑아(Bootstrap) 각 모델을 학습시켜 결과물을 집계(Aggregration)하는 방법

랜덤포레스트는 여러 개의 데이터 샘플에서 각자 의사결정트리를 만들어서 다수결 법칙에 따라 결론을 낸다.
이로써 의사결정모델이 훈련 데이터에 민감한 점을 극복했다.

  • 장점
    • Bagging 과정을 통해 과적합을 피할 수 있다.
    • 이상치에 견고하며 데이터 스케일링이 불필요
    • 변수 중요도를 추출하여 모델 해석에 중요한 특징을 파악 할 수 있다.
  • 단점
    • 컴퓨터 리소스 비용이 크다.
    • 앙상블 적용으로 해석이 어렵다.
  • Python 패키지
    • sklearn.ensemble.RandomForestClassifer
    • sklearn.ensemble.RandomForestRegressor

 

 

대부분의 정형데이터 모델링은 랜덤포레스트를 돌려보고 시작한다. 대부분의 빅데이터 관련 실기시험에서 랜덤포레스트만 적용해도 준수한 결과를 얻을 수 있다.

 

2️⃣ 분류 평가 지표

분류 모델이 수립되면 해당 모델이 좋은지 평가하는 평가 지표가 필요하다.

 

 

📌 정확도와 F1 - Score

분류 모델은 맞춘 정답/ 전체 개수로 정확도를 구할 수 있다.

그러나, 정확도가 높다고 좋은 모델이라고 확신할 수는 없다.
ex) 암 예측 모델을 만들었을 때, 모든 환자가 무조건 음성이라고 판정해보자.
-> 100명의 환자 중 95명이 음성, 5명이 양성이라면, 95%의 정확도를 기록하지만, 실제 암에 걸린 환자는 한 명도 맞추지 못 했다.

이러한 결과를 거르기 위해 다른 지표가 필요하다.

 

 

혼돈 행렬

  • 실제 값과 예측 값에 대한 모든 경우의 수를 표현하기 위한 2x2 행렬이다.
  • 표기법
    • 실제와 예측이 같으면 True, 다르면 False
    • 예측이 양성이면 Positive, 음성이면 Negative
  • 해석
    • TP: 실제로 양성(암 환자)이면서 양성(암 환자) 올바르게 분류된 수
    • FP: 실제로 음성(정상인)이지만 양성(암 환자)로 잘못 분류된 수
    • FN: 실제로 양성(암 환자)이지만 음성(정상인)로 잘못 분류된 수
    • TN: 실제로 음성(정상인)이면서 음성(정상인)로 올바르게 분류된 수
  • 지표
    1. 정밀도(Precision): 모델이 양성 1로 예측한 결과 중 실제 양성의 비율(모델의 관점)

      \(
      정밀도(precision) = \frac{TP}{TP+FP}
      \)

    2. 재현율(Recall): 실제 값이 양성인 데이터 중 모델이 양성으로 예측한 비율(데이터의 관점)

      \(
      재현율(Recall) = \frac{TP}{TP+FN}
      \)

    3. f1-Score: 정밀도와 재현율의 조화 평균

      \(
      f1-score = 2*\frac{정밀도_재현율}{정밀도+재현율}
      \)

    4. 정확도(Accuracy)

      \(
      정확도(Accuracy) = \frac{TP+TN}{TP+TN+FP+FN}
      \)

  • 실제 적용
    • TP: 실제로 양성(암 환자)이면서 양성(암 환자) 올바르게 분류된 수 → 0명
    • FP: 실제로 음성(정상인)이지만 양성(암 환자)로 잘못 분류된 수 → 0명
    • FN: 실제로 양성(암 환자)이지만 음성(정상인)이라고 분류된 수 → 5명
    • TN: 실제로 음성(정상인)이면서 음성(정상인)이라고 분류된 수 → 95명
      • 정밀도는 정의되지 않음(divsion by zero), 재현율은 0
      • 결과적으로 f1-score는 0

 

위처럼 정확도가 제 기능을 못하는 때는 분류에서 특히 Y값이 unbalance하지 못할 때 일어난다. 따라서 이를 위해서 Y 범주의 비율을 맞춰주거나 평가 지표를 f1 score을 사용함으로써 이를 보완한다.

 

3️⃣ 번외

📌 범주형 데이터 전처리 - 인코딩(Encoding)

  1. 레이블 인코딩(Label Encoding)
    • 정의: 문자열 범주형 값을 고유한 숫자로 할당
      • 1등급 → 0
      • 2등급 → 1
      • 3등급 → 2
    • 특징
      • 장점: 모델이 처리하기 쉬운 수치형으로 데이터 변환
      • 단점: 실제로는 그렇지 않은데, 순서 간 크기에 의미가 부여되어 모델이 잘못 해석 할 수 있음
    • 사용 함수
      • sklearn.preprocessing.LabelEncoder
      • 메소드
        • fit: 데이터 학습
        • transform: 정수형 데이터로 변환
        • fit_transform: fit과 transform을 연결하여 한번에 실행
        • inverse_transform : 인코딩된 데이터를 원래 문자열로 변환
      • 속성
        • classes_: 인코더가 학습한 클래스(범주)
  2. 원-핫 인코딩(One-Hot Encoding)
    • 정의: 각 범주를 이진 형식으로 변환하는 기법
      • 빨강 → [1,0,0]
      • 파랑 → [0,1,0]
      • 초록 → [0,0,1]
    • 특징
      • 장점: 각 범주가 독립적으로 표현되어, 순서가 중요도를 잘못 학습하는 것을 방지, 명목형 데이터에 권장
      • 단점: 범주 개수가 많을 경우 차원이 크게 증가(차원의 저주) , 모델의 복잡도를 증가, 과적합 유발
    • 사용 함수
      • pd.get_dummies
      • sklearn.preprocessing.OneHotEncoder
        • 메소드(LabelEncoder와 동일)
        • categories_: 인코더가 학습한 클래스(범주)
        • get_feature_names_out(): 학습한 클래스 이름(리스트)
# CSR 데이터 데이터프레임으로 만들기
csr_df = pd.DataFrame(csr_data.toarray(), columns = oe.get_feature_names_out())
# 기존 데이터프레임에 붙이기(옆으로)
pd.DataFrame([titaninc_df,csr_df], axis = 1)

4️⃣ 실습

분류 실습

 

 


2025.07.02 - [[스파르타]내일배움캠프 데이터 분석 트랙] - 36일차 - 머신러닝 세션 1

 

36일차 - 머신러닝 세션 1

튜터임정 튜터님1️⃣ 선형 회귀의 사례갓 1차 방적식을 배운 학생이라 가정하고, 선형회귀를 적용해보자. 📌 몸무게와 키 상관관계방정식을 배운 머신이는 몸무게와 키의 데이터를 획득했다.

kminx.tistory.com