서론
본 기사는 'Python으로 머신러닝을 수행하는 scikit-learn 입문' 시리즈의 제5회입니다.
제4회에서는 로지스틱 회귀와 k-최근접 이웃(k近傍法, KNN)을 통해 분류를 학습했습니다.
제5회에서는 실무에서 매우 자주 사용되는 **결정 트리(Decision Tree)**와 **랜덤 포레스트(Random Forest)**를 다룹니다.
이 두 가지 방법은 정확도가 높고, 게다가 '왜 그렇게 예측했는지'가 이해하기 쉽다는 점에서,
실무에서 인기가 높은 이유를 모두 갖춘 기법입니다.
제가 사용하는 scikit-learn 라이브러리 버전은 "1.5.2"입니다.
본 시리즈 구성
시리즈 구성 예정 (총 11개 글)
- 설치부터 머신러닝 전체 개요 (fit / predict)
- 데이터 준비 - train_test_split과 표준화(StandardScaler)
- 선형 회귀 - LinearRegression으로 수치를 예측하기
- 분류 입문 - 로지스틱 회귀와 k-최근접 이웃(KNN)
결정 트리와 랜덤 포레스트 (본 기사)- 분류 모델의 평가 - 혼동 행렬, 정확도, 정밀도, 재현율, F1 점수 (공개 후 링크 추가 예정)
- 회귀 모델의 평가 - MAE, MSE, RMSE, 결정 계수 R² (공개 후 링크 추가 예정)
- 교차 검증과 하이퍼파라미터 조정(cross_val_score・GridSearchCV) (공개 후 링크 추가 예정)
- 클러스터링 - KMeans (비지도 학습) (공개 후 링크 추가 예정)
- 차원 축소 - PCA (주성분 분석) (공개 후 링크 추가 예정)
- 파이프라인 - 전처리와 모델을 하나로 묶기 + 총정리 (공개 후 링크 추가 예정)
총 11개의 글 이후에는 시리즈의 요약 기사와, 고객 이탈 예측을 처음부터 끝까지 진행하는 실전편을 공개할 예정입니다.
본 기사의 목표
본 기사에서는 다음 내용을 이해하는 것을 목표로 합니다.
- 결정 트리란 무엇인가 (조건 분기로 데이터를 분류하기)
DecisionTreeClassifier 사용법과 과적합 주의점
- 랜덤 포레스트란 무엇인가 (다수의 트리의 다수결)
RandomForestClassifier 사용법
- 특성 중요도를 통해 '어떤 항목이 영향을 미쳤는지' 알아보기
결정 트리란?
**결정 트리(Decision Tree)**는 "만약 ~라면..."이라는 조건 분기를 반복하여 데이터를 분류하는 기법입니다.
사람이 사물을 판단할 때의 '플로우차트'와 매우 흡사하여 직관적입니다.
예를 들어, 붓꽃 품종을 맞춘다고 가정하면,
꽃잎 길이가 2.5cm 미만인가?
├─ 예 → 품종 A (setosa)
└─ 아니오 → 꽃잎 너비가 1.8cm 미만인가?
...
와 같이, 질문을 가지를 쳐나가면서 답에 도달합니다.
💡 결정 트리의 가장 큰 매력은
'판단 과정이 눈으로 보인다는 것'입니다. '왜 이 예측이 나왔는지'를 사람이 추적할 수 있기 때문에, 이유 설명이 요구되는 상황(금융/의료 등)에서 유용합니다.
결정 트리 사용해 보기
제4회와 동일한 붓꽃 데이터를 사용하여, fit → predict 흐름으로 사용합니다.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
...
💡 결정 트리는
표준화(제2회)가 필요 없습니다. '2.5cm 미만인가?'라는 조건은 스케일의 영향을 받지 않기 때문에, 거리를 사용하는 k-최근접 이웃과 대비되어 전처리가 적게 필요한 것이 장점입니다.
과적합 주의: 트리는 너무 깊게 만들지 않기
결정 트리는 제한을 두지 않으면 가지가 끝없이 뻗어나가며, 학습 데이터를 통째로 암기해 버립니다.
이것을 **과적합(Overfitting)**이라고 부릅니다.
💡
과적합이란, 학습 데이터에 과도하게 적합하여 미지의 데이터에서는 정확도가 떨어지는 상태입니다. '시험공부를 위해 기출문제만 통째로 암기했지만, 실제 시험의 새로운 문제는 풀지 못하는' 것과 같은 상태입니다. 학습 데이터의 정답률은 높은데, 테스트 데이터의 정답률이 낮을 때는 과적합을 의심합니다.
과적합을 방지하려면, max_depth (트리의 깊이) 등으로 트리의 복잡도를 제한해야 합니다.
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
깊이 제한 없음: 학습 데이터는 완벽해도, 테스트에서는 정확도가 떨어지기 쉬움
tree_deep = DecisionTreeClassifier(random_state=42)
tree_deep.fit(X_train, y_train)
...
max_depth
은 사람이 결정하는 하이퍼파라미터(제4회 참조)입니다. 최적값을 찾는 방법은 제8회에서 다룹니다.
랜덤 포레스트란 무엇인가?
하나의 결정 트리는 이해하기 쉽지만, 과적합(overfitting)되기 쉬운 약점이 있습니다.
여기서 등장하는 것이 랜덤 포레스트 (Random Forest) 입니다.
랜덤 포레스트는 서로 조금씩 다른 수많은 결정 트리들을 만들고, 그 다수결로 예측합니다.
"한 사람의 의견보다 다수의 의견 평균이 더 신뢰할 만하다"라는 발상입니다.
💡
랜덤 포레스트는 "랜덤하게 선택된 데이터와 특징량"으로 수백 개의 결정 트리(=숲: forest)를 성장시키고, 모든 트리의 예측을 다수결로 처리합니다. 하나의 트리가 틀리더라도 숲 전체가 서로 커버할 수 있기 때문에 과적합하기 어렵고 정확도가 높은 것이 특징입니다. "일단 시도해 볼 첫 번째 방법"으로서 실무에서 매우 인기 있는 기법입니다.
랜덤 포레스트 사용해 보기
이 역시 fit → predict로 사용하며, 사용법은 결정 트리와 거의 같습니다.
from sklearn.ensemble import RandomForestClassifier
# n_estimators=100: 결정 트리를 100개 만듦
model = RandomForestClassifier(n_estimators=100, random_state=42)
...
| 인자 | 의미 |
|---|
n_estimators | 만들 결정 트리의 개수 (많을수록 안정적이지만 느려짐) |
max_depth | 각 트리의 깊이 상한 (과적합 방지) |
random_state | 난수의 시드 고정 (재현성을 위해) |
특징 중요도 보기
랜덤 포레스트(또는 결정 트리)의 큰 장점은
"어떤 특징량이 예측에 영향을 미쳤는지"를 알 수 있다는 것입니다. 이를 특징 중요도 (feature importance) 라고 부릅니다.
import pandas as pd
# 각 특징량의 중요도를 가져옴
importances = model.feature_importances_
...
💡
특징 중요도 (feature importance)는 "해당 특징량이 예측 판단에 얼마나 기여했는지"를 0~1의 수치로 나타냅니다(합계가 1). 중요도가 높은 특징량은 예측의 핵심이며, 낮은 특징량은 그다지 도움이 되지 않았음을 의미합니다. "불필요한 특징량을 제거하거나", "데이터 수집 우선순위를 결정하는" 등 실무 판단에 직결되는 매우 가치 있는 정보입니다.
중요도를 막대 그래프로 그리면 한눈에 알 수 있습니다.
import matplotlib.pyplot as plt
plt.barh(df_importance["특징량"], df_importance["중요도"])
plt.xlabel("중요도")
...
맺음말
본 기사에서는 실무에서 인기 있는 결정 트리와 랜덤 포레스트를 배웠습니다.
- 결정 트리는
조건 분기로 데이터를 분류하는, 판단의 흐름이 보이는 기법 - 제한을 걸지 않으면
**과적합(overfitting)**하므로 max_depth
등으로 조정해야 함 - 랜덤 포레스트는
다수의 나무 다수결로 정확도가 높고 과적합하기 어려움 -
feature_importances_
로 어떤 특징량이 영향을 주었는지를 알 수 있음
여기까지로 대표적인 예측 기법이 한 번 정리되었습니다.
다음은 드디어 "그 모델, 정말 좋은가?"를 측정하는 **평가(Evaluation)**로 넘어갑니다.
다음 회차 예고
제6회 "분류 모델 평가 — 혼동 행렬, 정확도, 정밀도, 재현율, F1"에서는,
"정확도만으로는 간파할 수 없는 모델의 약점"을 파악하는 평가 지표를 배웁니다.
- 혼동 행렬 (예측의 맞고 틀림을 목록화)
- 정밀도・재현율・F1 스코어
- 왜 "정확도 99%"여도 위험할 수 있는가
모델을 올바르게 평가하는 능력은 실무에서 가장 중요한 기술 중 하나입니다.
본 시리즈가 도움이 될 것 같다고 느끼셨다면, '좋아요'나 팔로우를 해주시면 다음 글을 쓰는 힘이 됩니다.
참고 문헌
본 기사를 작성하며 참고한 사이트를 정리했습니다.
본 시리즈 요약글
이 시리즈의 모든 기사를 모은 글은, 시리즈가 끝난 후에 공개될 예정입니다. (공개 후 링크를 추가할 예정입니다.)
토론