[BDA 11기] 데이터 분석 모델링(ML1) - 6주차

2026. 1. 4. 00:34·BDA-11th

🌱Decision Tree 개념

Decision Tree의 구조

decision tree

  • *root node : *
    • decision tree의 맨 위의 node
    • 부모가 없는 노드, 트리에서 유일함
  • leaf node :

    • decision tree에서 말단에 위치한 node
    • 자식이 없음
  • 간선(edge) : 노드를 연결하는 선 (link, branch 라고도 부름)

  • 트리의 크기(max_depth): root node에서 leaf까지 도달하기 위해 거쳐야 하는 간선의 수
    e.g. 위의 사진의 depth = 2


Tree 알고리즘이 제공하는 것들

  • 변수 중요도 : 모델링 이후, 모델에서 중요한 변수를 수치화해서 제공함

  • 모델링 중에서 유일함!

  • "AVERAGE_CALL_DURATION"와 " COLLEGE" 사이 급격하게 변하는 구간을 기준으로 중요도가 급격히 떨어짐 -> 상위 변수들이 모델에 더 큰 영향을 미친다고 볼 수 있음

변수중요도

  • 모델 시각화 : 모델 구조를 시각화해줌




🌱Decision Tree 시각화 코드

모델 시각화

# 시각화에 필요한 라이브러리 불러오기 
from sklearn.tree import plot_tree

plot_tree(model,                               # 만든 모델 이름 / 시각화할 모델 객체
          feature_names = x_train.columns,   #Feature 이름, list(x_train)
          filled = True);                     # 각 노드를 클래스 비율에 따라 색으로 채움
model2 = DecisionTreeClassifier(max_depth = 3)    # 트리의 최대 깊이를 3으로 제한 
model2.fit(x_train, y_train)

plt.figure(figsize = (20,6))    # 그림 사이즈 조절
plot_tree(model2, feature_names = x_train.columns,
          filled = True, fontsize = 10)             #노드 내 텍스트 크기 조절

모델시각화


변수 중요도

# 변수 중요도
print(x_train.columns)
print(model.feature_importances_)  # 각 변수의 중요도를 0~1 사이 값으로 반환 
# 결과값
Index(['COLLEGE', 'INCOME', 'OVERAGE', 'LEFTOVER', 'HOUSE', 'HANDSET_PRICE',
       'OVER_15MINS_CALLS_PER_MONTH', 'AVERAGE_CALL_DURATION',
       'REPORTED_SATISFACTION_sat', 'REPORTED_SATISFACTION_unsat',
       'REPORTED_SATISFACTION_very_sat', 'REPORTED_SATISFACTION_very_unsat',
       'REPORTED_USAGE_LEVEL_high', 'REPORTED_USAGE_LEVEL_little',
       'REPORTED_USAGE_LEVEL_very_high', 'REPORTED_USAGE_LEVEL_very_little',
       'CONSIDERING_CHANGE_OF_PLAN_considering',
       'CONSIDERING_CHANGE_OF_PLAN_never_thought',
       'CONSIDERING_CHANGE_OF_PLAN_no', 'CONSIDERING_CHANGE_OF_PLAN_perhaps'],
      dtype='object')
[0.02188422 0.1870612  0.15790887 0.0906787  0.20374381 0.11305089
 0.05295354 0.04541263 0.00493094 0.01041318 0.01160744 0.00896044
 0.00668551 0.01612369 0.01104486 0.01482145 0.01519049 0.00761096
 0.01313275 0.00678443]
  • 변수중요도 그래프 그리기 함수

    def plot_feature_importance(importance, names):   
      # 중요도 값과 변수 이름을 numpy배열로 반환
      feature_importance = np.array(importance)
      feature_names = np.array(names)
    
      data={'feature_names':feature_names,'feature_importance':feature_importance}
      fi_df = pd.DataFrame(data)
    
      # 중요도 값 기준으로 내림차순 정렬
      fi_df.sort_values(by=['feature_importance'], ascending=False,inplace=True)
      fi_df.reset_index(drop=True, inplace = True)
    
      plt.figure(figsize=(10,8))
    
      # x축: 중요도 값 & y축: 변수 이름
      sns.barplot(x='feature_importance', y='feature_names', data = fi_df)
    
      plt.xlabel('FEATURE IMPORTANCE')
      plt.ylabel('FEATURE NAMES')
      plt.grid()
    # 위에서 만든 함수를 실행해서 시각화 수행 
    plot_feature_importance(model.feature_importances_, list(x_train))


max_depth에 따른 모델 성능 평가

depths = [1, 2, 3, 4, 5]
train_acc = []
val_acc = []

for depth in depths:
    print("\n \n \n")
    print(f"================ max_depth = {depth} =================")

    # 모델 생성 및 학습
    model = DecisionTreeClassifier(max_depth=depth, random_state=20)
    model.fit(x_train, y_train)

    # 예측
    y_train_pred = model.predict(x_train)
    y_val_pred = model.predict(x_val)

    # 성능 평가
    train_accuracy = accuracy_score(y_train, y_train_pred)
    val_accuracy = accuracy_score(y_val, y_val_pred)
    train_acc.append(train_accuracy)
    val_acc.append(val_accuracy)

    print(f"훈련 정확도(train acc): {train_accuracy:.4f}")
    print(f"검증 정확도(val acc):   {val_accuracy:.4f}")
    print(classification_report(y_val, y_val_pred, digits=4))

    # 트리 시각화
    plt.figure(figsize=(18,6))
    plot_tree(model, feature_names=x_train.columns, filled=True, fontsize=10)
    plt.title(f"Decision Tree (max_depth={depth})", fontsize=14)
    plt.show()

    # 변수 중요도 시각화
    plot_feature_importance(model.feature_importances_, list(x_train))
    plt.title(f"Feature Importance (max_depth={depth})", fontsize=14)
    plt.show()
================ max_depth = 1 =================
훈련 정확도(train acc): 0.6161
검증 정확도(val acc):   0.6165
              precision    recall  f1-score   support

       LEAVE     0.5816    0.7773    0.6654      1962
        STAY     0.6829    0.4617    0.5509      2038

    accuracy                         0.6165      4000
   macro avg     0.6322    0.6195    0.6081      4000
weighted avg     0.6332    0.6165    0.6071      4000




================ max_depth = 2 =================
훈련 정확도(train acc): 0.6557
검증 정확도(val acc):   0.6495
              precision    recall  f1-score   support

       LEAVE     0.7062    0.4888    0.5777      1962
        STAY     0.6204    0.8042    0.7004      2038

    accuracy                         0.6495      4000
   macro avg     0.6633    0.6465    0.6391      4000
weighted avg     0.6625    0.6495    0.6402      4000




================ max_depth = 3 =================
훈련 정확도(train acc): 0.6921
검증 정확도(val acc):   0.6895
              precision    recall  f1-score   support

       LEAVE     0.7242    0.5928    0.6519      1962
        STAY     0.6662    0.7826    0.7198      2038

    accuracy                         0.6895      4000
   macro avg     0.6952    0.6877    0.6858      4000
weighted avg     0.6947    0.6895    0.6865      4000




================ max_depth = 4 =================
훈련 정확도(train acc): 0.7024
검증 정확도(val acc):   0.7080
              precision    recall  f1-score   support

       LEAVE     0.6760    0.7773    0.7231      1962
        STAY     0.7494    0.6413    0.6912      2038

    accuracy                         0.7080      4000
   macro avg     0.7127    0.7093    0.7071      4000
weighted avg     0.7134    0.7080    0.7068      4000




================ max_depth = 5 =================
훈련 정확도(train acc): 0.7053
검증 정확도(val acc):   0.7025
              precision    recall  f1-score   support

       LEAVE     0.6926    0.7074    0.6999      1962
        STAY     0.7124    0.6977    0.7050      2038

    accuracy                         0.7025      4000
   macro avg     0.7025    0.7026    0.7025      4000
weighted avg     0.7027    0.7025    0.7025      4000

max_depth가 높아질수록 훈련 정확도는 높아짐!
But, 검증 정확도는 일정 깊이 이후 오히려 떨어짐 -> overfitting 발생했기 때문

  • Overfitting(과적함)이란?
    훈련 데이터에만 너무 잘 맞춰져서 새로운 데이터(val/test data)에서는 성능이 떨어지는 현상




🌱Decision Tree 이해하기

1) 분할(spilt)

집단 분할하기

  • 의사결정 나무는 특정 기준(feature)을 기준으로 데이터를 여러 집다능로 나눔
  • 만약 몸통모양을 기준으로 분류했을 때,
    • 네모 집단 -> yes
    • 타원 집단 -> no
      로 구분할 수 있다면, 해당 기준은 데이터를 잘 나눈 것임!!
  • 즉, "얼마나 잘 나누었는가"를 수치화 해서 측정

순도와 불순도

  • 순도(Purity): 한 집단에 동일한 클래스가 얼마나 모여 있는지를 나타냄.
    -> 한 클래스만 있으면 순도 100%
  • *불순도(Impurity): * 서로 다른 클래스가 섞여 있을수록 높아짐
    -> 불순도 = 1 - 순도

지니 불순도(Gini Impurity)

  • 분류 후 얼마나 잘 분류했는지 평가하는 지표
  • 얼마나 순도가 증가했는지, 불순도가 감소했는지를 나타냄
  • 불순도가 줄어들수록 모델이 데이터를 잘 나눈 것을 의미
    -> 즉, 불순도 감소 = 분류 성능 향상
    -> 반대로 불순도 감소가 적으면, 잘못 분류했을 가능성 ↑

2) 트리 만들기

정보 증가량(Infomation Gain)

  • 트리를 분할할 때, 각 분할 기준이 얼마나 불순도를 줄였는지를 평가
  • 엔트로피나 지니 계수 같은 지표를 활용해 계산

즉, Information Gain은
“이 분할(feature)이 데이터를 얼마나 깔끔하게 나눴는가”를 수치로 표현한 것!

몸통트리만들기


💡정리 요약

개념 의미 좋을수록
순도 (Purity) 한 집단이 한 클래스만으로 구성됨 높을수록 좋음
불순도 (Impurity) 여러 클래스가 섞여 있음 낮을수록 좋음
지니 불순도 (Gini Impurity) 분류의 혼잡도를 수치화 낮을수록 좋음
정보 증가량 (Information Gain) 분류 후 불순도가 얼마나 감소했는가 높을수록 좋음




🌱블로그 챌린지

[지금까지의 학회 활동에 대한 소감]

일단 너무 만족하면서 수업을 듣고 있다. 훌륭한 강사님, 체계적인 교육 시스템, 다양한 원데이 클래스, 학회생들을 위한 혜택 등등 학회원으로서 얻어 갈 수 있는 점이 많다고 생각했다. 이번 기수 활동이 끝나도 다음 기수에 또 이어서 새로운 수업을 듣고 싶다는 마음도 들었다! 그정도로 아주 만족 중이다 ㅎㅎ

'BDA-11th' 카테고리의 다른 글

[BDA 11기] 데이터 분석 모델링(ML1) - 9주차  (0) 2026.01.04
[BDA 11기] 데이터 분석 모델링(ML1) - 8주차  (0) 2026.01.04
[BDA 11기] 데이터 분석 모델링(ML1) - 5주차  (0) 2026.01.04
[BDA 11기] 데이터 분석 모델링(ML1) - 4주차  (0) 2026.01.04
[BDA 11기] 데이터 분석 모델링(ML1) - 3주차  (0) 2026.01.04
'BDA-11th' 카테고리의 다른 글
  • [BDA 11기] 데이터 분석 모델링(ML1) - 9주차
  • [BDA 11기] 데이터 분석 모델링(ML1) - 8주차
  • [BDA 11기] 데이터 분석 모델링(ML1) - 5주차
  • [BDA 11기] 데이터 분석 모델링(ML1) - 4주차
choisio2
choisio2
sio2-dev 님의 블로그 입니다.
  • choisio2
    SiO2 for Developer
    choisio2
  • 전체
    오늘
    어제
    • 분류 전체보기 (46) N
      • TAVE-16th (14)
      • BDA-11th (16)
      • C++ (5)
      • 개인 프로젝트 (4)
      • 백준 (4) N
      • 컴퓨터 그래픽스 (1)
      • 잡담 (1)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 링크

    • github.com/choisio2
  • 공지사항

  • 인기 글

  • 태그

    calculator
    BDA
    geminicli
    polling
    C++
    KakaoOauth
    바이브코딩
    AI시대
    BDAI
    알고리즘스터디
    데시벨측정
    백준1463
    BDA #데이터분석모델링
    개발자미래
    SpotifyAPI
    데이터분석모델링
    백준
    프론트엔드
    Tave
    viewpager2
    kotlin
    androidstudio
    코테
    spotify
    playconsole
    알고리즘
    개발자
    frontend
    kotin
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
choisio2
[BDA 11기] 데이터 분석 모델링(ML1) - 6주차
상단으로

티스토리툴바