회귀·분류 모델링 심화 알고리즘 정리
Decision Tree, Random Forest, KNN, Boosting을 중심으로 선형 모델 이후의 대표적인 정형 데이터 알고리즘을 정리한다.
이 글은 Chap 2에서 다룬 회귀·분류 모델링 심화 알고리즘을 전체 흐름 중심으로 정리한다. 선형회귀와 로지스틱 회귀 이후 왜 의사결정나무, 랜덤 포레스트, KNN, 부스팅 계열 모델이 필요한지부터 각 모델의 원리, 장단점, 스케일링 여부, 하이퍼 파라미터, Python 사용 흐름, 모델 비교 기준까지 한 번에 연결한다.
목차
1. 선형 모델 이후의 문제의식
앞선 학습에서는 선형회귀와 로지스틱 회귀를 통해 머신러닝의 기본적인 회귀·분류 모델을 다뤘다. 선형회귀는 연속적인 수치형 값을 예측하고, 로지스틱 회귀는 특정 클래스에 속할 확률을 계산해 분류를 수행한다. 이 두 모델은 해석이 쉽고 기준점이 되는 모델로 유용하지만, 실제 데이터의 모든 관계를 단순한 직선이나 S자 곡선으로 설명하기는 어렵다.
현실의 데이터에서는 변수 간 관계가 비선형적일 수 있고, 여러 조건이 복합적으로 작용할 수 있다. 예를 들어 타이타닉 생존 예측 문제에서 생존 여부는 성별 하나만으로 결정되지 않는다. 성별, 객실 등급, 나이, 탑승 요금, 동승 가족 수 등이 함께 작용한다. 제조·품질 데이터에서도 특정 센서 값 하나보다 여러 공정 조건의 조합이 불량 위험을 높일 수 있다.
Chap 2는 이런 문제를 다루기 위해 자주 사용하는 대표 알고리즘을 정리한다. 핵심은 모델 이름을 외우는 것이 아니라, 각 모델이 데이터를 어떤 방식으로 바라보고 예측하는지 이해하는 것이다.
선형 모델의 한계를 인식한 뒤, 조건 기반 모델인 의사결정나무, 의사결정나무의 불안정성을 줄인 랜덤 포레스트, 거리 기반 모델인 KNN, 순차적으로 오류를 보완하는 부스팅 모델을 학습한다. 마지막에는 같은 데이터와 같은 평가 기준에서 여러 모델을 비교한다.
| 모델 계열 | 핵심 아이디어 | 대표 알고리즘 |
| 조건 기반 모델 | 데이터를 조건문으로 반복 분할해 예측 | Decision Tree |
| 배깅 기반 앙상블 | 여러 트리를 독립적으로 학습하고 결과를 합쳐 안정성향상 |
Random Forest |
| 거리 기반 모델 | 새 데이터와 가까운 이웃 데이터를 기준으로 예측 | KNN |
| 부스팅 기반 앙상블 | 약한 학습기를 순차적으로 학습하며 이전 오류를 보완 | Gradient Boosting, XGBoost, LightGBM |
2. 의사결정나무 : 조건문으로 데이터를 나누는 모델
의사결정나무(Decision Tree, DT)는 의사결정 규칙을 나무 구조로 표현해 데이터를 분류하거나 수치값을 예측하는 알고리즘이다. 사람이 조건문을 따라 판단하는 방식과 비슷하다. “성별이 여성인가?”, “나이가 특정 기준보다 작은가?”, “요금이 특정 값보다 큰가?”와 같은 질문을 순서대로 던지고, 각 질문에 따라 데이터를 왼쪽 또는 오른쪽으로 나눈다.
타이타닉 생존 예측을 예로 들면, 성별 하나만으로도 첫 번째 분할을 만들 수 있다. 성별이 여성인 경우 생존 가능성이 높은 집단으로, 남성인 경우 사망 가능성이 높은 집단으로 나뉠 수 있다. 실제 모델은 여기서 멈추지 않고 나이, 객실 등급, 요금 등의 변수를 추가로 사용해 더 세부적인 조건을 만든다.

타이타닉 예시에서 성별 조건을 기준으로 생존 가능성이 높은 집단과 낮은 집단을 나누는 의사결정나무 구조.
의사결정나무의 기본 구조
의사결정나무를 해석하려면 노드, 분류 기준, 불순도, 샘플 수, 클래스 개념을 알아야 한다. 트리 그림에 표시되는 gini, samples, value, class는 단순 장식이 아니라 모델이 어떤 기준으로 데이터를 나누었고, 해당 노드 안에 어떤 데이터가 들어 있는지 보여주는 핵심 정보이다.
| 용어 | 의미 | 해석 포인트 |
| Root Node | 의사결정나무의 시작점이 되는 노드 | 최초로 데이터를 나누는 가장 중요한 분할 조건이 표시 |
| Leaf Node | 최종 예측이 결정되는 노드 | 해당 노드의 다수 클래스 또는 평균값이 최종 예측으로 사용. |
| Criteria | 데이터를 나누는 분류 기준 | 예: sex <= 0.5, age <= 12.5 |
| Impurity | 한 노드 안에 서로 다른 클래스가 섞여 있는 정도 | 불순도가 낮을수록 특정 클래스가 잘 모인 상태 |
| Samples | 해당 노드에 포함된 데이터 개수 | 분할 후 각 노드에 데이터가 얼마나 남았는지 확인 |
| Value | 클래스별 데이터 개수 | 예: [549, 342]는 사망 549명, 생존 342명을 의미. |
| Class | 해당 노드에서 가장 많은 클래스 | 분류 문제에서 해당 노드의 대표 예측값으로 간주. |

루트 노드, 리프 노드, gini, samples, value, class가 하나의 트리 그림 안에서 어떻게 표시되는지 설명하는 이미지.
성별 인코딩과 분류 기준 예시
타이타닉 예시에서 성별이 여성인 경우 0, 남성인 경우 1로 인코딩되어 있다면 sex <= 0.5라는 조건은 여성을 왼쪽 노드로, 남성을 오른쪽 노드로 보내는 기준이 된다. 이처럼 의사결정나무는 숫자형으로 표현된 변수에 대해 특정 기준값을 찾고, 그 기준보다 작거나 같은 데이터와 큰 데이터를 분리한다.
중요한 점은 사람이 기준값을 직접 정하는 것이 아니라, 모델이 학습 데이터에서 여러 후보 기준을 비교하며 가장 좋은 분할을 찾는다는 것이다. 이때 “좋은 분할”을 판단하는 기준이 바로 불순도 감소이다.
3. 불순도와 지니 계수 : 좋은 분할을 판단하는 기준
의사결정나무는 데이터를 아무렇게나 나누지 않는다. 각 노드에 포함된 데이터가 최대한 하나의 클래스로 잘 모이도록 분할한다. 한 노드에 생존자만 있거나 사망자만 있으면 순도가 높은 상태이고, 생존자와 사망자가 비슷하게 섞여 있으면 불순도가 높은 상태이다.
대표적인 불순도 지표 중 하나가 지니 계수(Gini impurity)이다. 지니 계수는 0에 가까울수록 한 클래스가 잘 모인 순수한 노드이고, 값이 커질수록 여러 클래스가 섞인 노드이다. 강의자료에서는 지니 계수를 0과 1 사이 값으로 설명하며, 리프 노드로 갈수록 불순도가 작아지는 방향으로 나무가 성장한다고 정리한다.
Gini = 1 - Σ(p_i²)
여기서 p_i는 노드 안에서 i번째 클래스가 차지하는 비율이다.
한 클래스의 비율이 1에 가까우면 Gini는 0에 가까워지고, 여러 클래스가 비슷하게 섞여 있으면 Gini가 커진다.
예를 들어 어떤 노드에 생존자 90명, 사망자 10명이 있다면 한 클래스가 압도적으로 많으므로 불순도가 낮다. 반대로 생존자 50명, 사망자 50명이 있다면 두 클래스가 절반씩 섞여 있어 불순도가 높다. 의사결정나무는 여러 변수와 여러 기준값을 비교하면서 분할 전보다 분할 후 불순도가 더 많이 줄어드는 조건을 선택한다.
의사결정나무의 학습은 “어떤 변수와 어떤 기준값으로 나누면 불순도가 가장 많이 줄어드는가?”를 반복적으로 찾는 과정이다. 성별, 나이, 요금, 객실 등급 등 여러 변수 중 현재 단계에서 가장 분류 효과가 큰 조건이 선택된다.
의사결정나무의 장점
의사결정나무의 가장 큰 장점은 해석 가능성이다. 트리 구조를 따라가면 모델이 어떤 조건을 기준으로 예측했는지 비교적 쉽게 설명할 수 있다. 또한 분류와 회귀 문제에 모두 사용할 수 있고, 이상치에 비교적 견고하며, 데이터 스케일링이 필수는 아니다.
스케일링이 필수적이지 않은 이유는 의사결정나무가 거리나 기울기보다 “특정 기준값보다 큰가 작은가”라는 분할 조건을 사용하기 때문이다. 예를 들어 어떤 변수의 단위가 cm에서 m로 바뀌어도 값의 상대적인 순서가 유지된다면 트리의 분할 구조는 큰 틀에서 비슷하게 유지될 수 있다.
의사결정나무의 단점과 과적합
단점도 분명하다. 트리가 너무 깊어지면 훈련 데이터를 거의 외우듯이 분류할 수 있다. 이 경우 훈련 데이터에서는 높은 성능을 보이지만 새로운 데이터에서는 성능이 낮아질 수 있다. 이것이 과적합(overfitting)이다.
또한 단일 의사결정나무는 훈련 데이터의 작은 변화에도 트리 구조가 크게 달라질 수 있다. 특정 샘플 몇 개가 추가되거나 빠졌을 뿐인데 처음 선택되는 분할 기준이 달라지고, 그 이후의 전체 구조가 바뀔 수 있다. 이 불안정성을 줄이기 위해 등장한 대표적인 방법이 랜덤 포레스트이다.
의사결정나무는 해석이 쉽다는 장점 때문에 좋은 모델처럼 보이지만, 깊이 제한 없이 성장시키면 과적합되기 쉽다. 따라서 max_depth, min_samples_split, min_samples_leaf 같은 하이퍼 파라미터를 통해 모델 복잡도를 조절해야 한다.
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
# 분류 문제
# max_depth는 트리의 최대 깊이를 제한해 과적합을 줄이는 대표적인 하이퍼 파라미터이다.
dt_clf = DecisionTreeClassifier(
max_depth=3,
random_state=42
)
# 회귀 문제
dt_reg = DecisionTreeRegressor(
max_depth=3,
random_state=42
)
DecisionTreeClassifier는 분류 문제에, DecisionTreeRegressor는 회귀 문제에 사용한다. 예시의 max_depth=3은 트리의 최대 깊이를 3으로 제한한다는 의미이다. 깊이를 제한하면 훈련 데이터에 지나치게 맞춰지는 현상을 줄일 수 있다.
4. 랜덤 포레스트 : 여러 개의 트리로 안정성을 높이는 방법
랜덤 포레스트(Random Forest, RF)는 여러 개의 의사결정나무를 만들어 예측 결과를 합치는 앙상블 모델이다. 의사결정나무 하나는 해석이 쉽지만 과적합과 불안정성 문제가 있다. 랜덤 포레스트는 이 단점을 보완하기 위해 “나무를 여러 개 만들어 숲을 만들자”는 아이디어를 사용한다.
(여기에 랜덤 포레스트 개념 이미지 삽입)
여러 개의 의사결정나무가 각각 예측한 결과를 모아 최종 결과를 결정하는 랜덤 포레스트 개념도.
배깅 : Bootstrap Aggregating
랜덤 포레스트의 핵심 원리는 배깅(Bagging)이다. Bagging은 Bootstrap과 Aggregating을 합친 말이다. Bootstrapping은 원본 데이터에서 복원 추출을 통해 서로 비슷하지만 완전히 같지는 않은 여러 데이터 샘플을 만드는 과정이다. Aggregating은 여러 모델의 예측 결과를 합치는 과정이다.
복원 추출은 데이터를 하나 뽑은 뒤 다시 넣고 또 뽑는 방식이다. 따라서 어떤 데이터는 여러 번 뽑힐 수 있고, 어떤 데이터는 특정 샘플셋에 포함되지 않을 수 있다. 이렇게 만들어진 데이터셋들은 원본 데이터의 분포를 어느 정도 따라가지만 서로 조금씩 다르다. 랜덤 포레스트는 이 데이터셋들에 각각 의사결정나무를 학습시킨다.
| 개념 | 의미 | 랜덤 포레스트에서의 역할 |
| Bootstrapping | 원본 데이터에서 복원 추출해 여러 샘플셋을 생성 | 각 트리가 서로 약간 다른 데이터를 보도록 만든다. |
| Aggregating | 여러 모델의 예측 결과를 결합 | 분류는 다수결, 회귀는 평균으로 최종 예측을 만든다. |
| Ensemble | 여러 모델을 결합해 하나의 모델처럼 사용 | 단일 트리보다 예측 안정성을 높인다. |
(여기에 배깅 원리 이미지 삽입)
원본 데이터에서 여러 부트스트랩 샘플을 만들고, 각 샘플에 모델을 학습한 뒤 예측 결과를 합치는 과정.
분류는 다수결, 회귀는 평균
분류 문제에서는 여러 트리의 예측 결과를 다수결로 합친다. 예를 들어 어떤 승객에 대해 트리 3개 중 2개가 생존, 1개가 사망을 예측했다면 최종 예측은 생존이 된다. 회귀 문제에서는 여러 트리의 예측값을 평균낸다. 여러 트리의 예측이 조금씩 다르더라도 평균을 취하면 단일 트리보다 예측이 안정될 수 있다.
분류 : 최종 클래스 = 여러 트리 예측의 다수결
회귀 : 최종 예측값 = 여러 트리 예측값의 평균
(여기에 여러 트리의 다수결/평균 결합 이미지 삽입)
각 의사결정나무의 예측 결과가 다수결 또는 평균으로 합쳐져 최종 예측이 되는 구조.
랜덤 포레스트의 장점과 단점
랜덤 포레스트는 배깅을 통해 단일 트리의 과적합과 불안정성을 줄인다. 이상치에 비교적 견고하고, 의사결정나무처럼 스케일링이 필수는 아니다. 또한 변수 중요도(feature importance)를 추출할 수 있어 모델이 어떤 변수를 예측에 많이 사용했는지 확인할 수 있다.
반면 여러 개의 트리를 학습하기 때문에 계산 비용이 크고, 단일 의사결정나무보다 해석이 어렵다. 트리 수가 많아지고 데이터가 커질수록 학습 시간, 예측 시간, 메모리 사용량이 증가할 수 있다.
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=100,
random_state=42
)
rf.fit(X_train, y_train)
feature_importance = pd.DataFrame({
"feature": X_train.columns,
"importance": rf.feature_importances_
}).sort_values("importance", ascending=False)
print(feature_importance)
위 코드는 학습된 랜덤 포레스트 모델에서 변수 중요도를 추출하는 예시이다. feature_importances_는 각 변수가 모델의 분할에 얼마나 기여했는지를 상대적으로 나타낸다. 다만 변수 중요도는 인과관계를 의미하지 않는다. “중요도가 높다”는 것은 모델이 예측 과정에서 자주 또는 효과적으로 사용했다는 의미에 가깝다.
(여기에 랜덤 포레스트 변수 중요도 막대그래프 이미지 삽입)
변수별 중요도를 내림차순으로 정렬해 모델이 어떤 변수를 많이 활용했는지 보여주는 막대그래프.
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
# 분류 문제
rf_clf = RandomForestClassifier(
n_estimators=100,
random_state=42
)
# 회귀 문제
rf_reg = RandomForestRegressor(
n_estimators=100,
random_state=42
)
n_estimators는 생성할 트리 개수를 의미한다. 일반적으로 트리 수가 많아지면 예측은 안정될 수 있지만, 학습 시간이 길어진다. 따라서 성능 향상 폭과 계산 비용을 함께 고려해 적절한 값을 선택해야 한다.
5. KNN: 가까운 이웃을 기준으로 예측하는 거리 기반 모델
KNN(K-Nearest Neighbors, K-최근접 이웃)은 새 데이터와 가까운 K개의 이웃 데이터를 보고 예측하는 알고리즘이다. 기본 아이디어는 “비슷한 데이터는 비슷한 정답을 가질 것이다”이다. 새 데이터 주변에 어떤 클래스의 데이터가 더 많이 있는지를 보고 분류하고, 회귀 문제에서는 가까운 이웃들의 값을 평균해 예측할 수 있다.
예를 들어 새로 들어온 데이터 주변의 가장 가까운 3개 데이터 중 2개가 Class B이고 1개가 Class A라면, KNN은 새 데이터를 Class B로 예측한다. 이때 몇 개의 이웃을 볼 것인지 결정하는 값이 K이다.
(여기에 KNN의 K=3, K=7 비교 이미지 삽입)
새 데이터 주변의 K개 이웃을 기준으로 다수 클래스를 선택하는 KNN 예시. K 값이 달라지면 예측 결과도 달라질 수 있다.
K 값에 따라 예측이 달라지는 이유
강의자료의 예시처럼 K=3일 때는 가까운 3개 이웃 중 별 1개와 세모 2개가 있다면 새 데이터는 세모로 예측된다. 반면 K=7일 때는 별 4개와 세모 3개가 포함될 수 있고, 이 경우 새 데이터는 별로 예측된다. 즉 KNN은 같은 데이터라도 K 값에 따라 다른 판단을 내릴 수 있다.
K가 너무 작으면 가까운 소수의 데이터에 크게 영향을 받기 때문에 노이즈에 민감하다. 반대로 K가 너무 크면 너무 넓은 영역을 참고하므로 지역적인 패턴을 놓칠 수 있다. 따라서 K는 임의로 하나를 고정하기보다 여러 후보를 비교해 선택하는 것이 좋다.
| K 값 | 특징 | 주의점 |
| 작은 K | 가까운 일부 데이터의 영향을 강하게 받는다. | 노이즈에 민감해 과적합될 수 있다. |
| 큰 K | 넓은 주변 영역을 함께 고려한다. | 세부적인 지역 패턴을 놓쳐 과소적합될 수 있다. |
| 적절한 K | 노이즈 민감도와 일반화 성능 사이의 균형을 잡는다. | 검증 데이터 또는 교차검증으로 선택하는 것이 안전하다. |
6. 하이퍼 파라미터와 거리 개념
KNN을 제대로 이해하려면 파라미터와 하이퍼 파라미터의 차이를 구분해야 한다. 파라미터(parameter)는 모델이 학습 과정에서 데이터로부터 자동으로 추정하는 내부 값이다. 선형회귀의 가중치와 편향이 대표적이다. 반면 하이퍼 파라미터(hyperparameter)는 분석가가 모델 학습 전에 직접 설정하는 값이다. KNN의 K, 랜덤 포레스트의 트리 개수, 의사결정나무의 최대 깊이가 여기에 해당한다.
| 구분 | 의미 | 예시 |
| Parameter | 모델이 학습 과정에서 자동으로 찾는 내부 값 | 선형회귀의 가중치, 편향 |
| Hyperparameter | 분석가가 직접 설정하는 외부 구성값 | KNN의 K, 트리의 최대 깊이, 랜덤 포레스트의 트리 개수 |
머신러닝에서 말하는 파라미터와 Python 함수에서 말하는 parameter는 문맥이 다르다. Python 함수의 parameter는 함수가 입력으로 받을 값을 정의하는 이름이고, 머신러닝의 parameter는 모델이 데이터로부터 학습한 내부 값이다.
유클리드 거리
KNN은 거리 기반 알고리즘이다. 새 데이터와 기존 데이터 사이의 거리를 계산하고, 가장 가까운 데이터를 이웃으로 선택한다. 가장 대표적인 거리 계산 방식은 유클리드 거리(Euclidean Distance)이다. 2차원 그래프에서 두 점 사이의 직선 거리를 구하는 방식이라고 이해하면 된다.
d(A, B) = √((x2 - x1)² + (y2 - y1)²)
차원이 늘어나면 각 변수 차이의 제곱을 모두 더한 뒤 제곱근을 취하는 방식으로 확장된다.
(여기에 유클리드 거리 공식과 두 점 사이 직선 거리 이미지 삽입)
두 점의 좌표 차이를 이용해 직선 거리를 계산하는 유클리드 거리 개념도.
유클리드 거리 외에도 맨해튼 거리(Manhattan Distance), 코사인 유사도(Cosine Similarity) 같은 방법이 있다. 어떤 거리 기준을 선택하느냐에 따라 “가깝다”는 판단이 달라질 수 있다. 다만 Chap 2 수준에서는 KNN이 데이터 간 유사도를 거리로 계산한다는 점과, 기본 거리 개념으로 유클리드 거리를 이해하는 것이 중요하다.
KNN에서 스케일링이 중요한 이유
KNN은 변수의 단위에 매우 민감하다. 예를 들어 나이는 20~70 범위이고, 연봉은 2,000~10,000 범위라고 하자. 스케일링 없이 거리를 계산하면 연봉의 값 범위가 훨씬 크기 때문에 거리 계산에서 연봉이 대부분의 영향을 차지한다. 실제로 나이가 중요한 변수일 수 있어도, 단위 차이 때문에 모델이 연봉 중심으로 이웃을 찾게 된다.
따라서 KNN을 사용할 때는 StandardScaler 등을 사용해 수치형 변수의 스케일을 맞추는 것이 중요하다. 특히 train/test split 이후에는 train 데이터에서만 스케일 기준을 학습하고, test 데이터에는 동일한 기준을 적용해야 한다. 이를 안전하게 처리하기 위해 Pipeline을 사용하는 것이 좋다.
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline
knn_model = Pipeline([
("scaler", StandardScaler()),
("knn", KNeighborsClassifier(n_neighbors=5))
])
knn_model.fit(X_train, y_train)
y_pred = knn_model.predict(X_test)
Pipeline을 사용하면 스케일링과 모델 학습을 하나의 흐름으로 묶을 수 있다. 이 방식은 전처리 기준이 test 데이터에 새로 맞춰지는 데이터 누수를 방지하는 데 도움이 된다. KNN처럼 스케일링이 중요한 모델에서는 특히 유용하다.
KNN의 장점과 단점
KNN은 이해하기 쉽고 직관적이다. 모집단의 특정 분포나 형태를 강하게 가정하지 않으며, 분류와 회귀 모두 가능하다. 하지만 차원 수가 많을수록 거리 계산량이 늘어나고, 데이터가 많을수록 예측 시간이 오래 걸린다. 또한 거리 기반 알고리즘이므로 피처 표준화가 사실상 필수에 가깝다.
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
# 분류 문제
knn_clf = KNeighborsClassifier(n_neighbors=5)
# 회귀 문제
knn_reg = KNeighborsRegressor(n_neighbors=5)
7. 부스팅: 이전 오류를 보완하며 성능을 올리는 앙상블
부스팅(Boosting)은 여러 개의 약한 학습기(weak learner)를 순차적으로 학습시키면서, 이전 모델이 잘못 예측한 데이터에 더 집중하도록 만드는 앙상블 학습 방식이다. 단독으로는 성능이 높지 않은 단순한 모델을 여러 개 결합해 강한 모델을 만드는 것이 핵심이다.
랜덤 포레스트와 부스팅은 모두 앙상블 모델이지만 학습 방식이 다르다. 랜덤 포레스트는 여러 트리를 독립적으로 학습한 뒤 결과를 합친다. 반면 부스팅은 앞 모델이 틀린 부분을 다음 모델이 보완하도록 순차적으로 학습한다.
(여기에 부스팅 알고리즘 수행 과정 이미지 삽입)
첫 번째 약한 학습기가 틀린 데이터에 더 집중하고, 다음 학습기가 그 오류를 보완하면서 강한 학습기로 결합되는 과정.
| 구분 | 랜덤 포레스트 | 부스팅 |
| 학습 방식 | 여러 트리를 독립적으로 학습한다. | 약한 학습기를 순차적으로 학습한다. |
| 핵심 아이디어 | 다양한 트리의 결과를 합쳐 안정성을 확보한다. | 이전 모델의 오류를 보완하면서 성능을 개선한다. |
| 예측 결합 | 분류는 다수결, 회귀는 평균 | 이전 모델의 오차를 줄이는 방향으로 모델을 누적 |
| 과적합 위험 | 상대적으로 낮은 편 | 설정에 따라 과적합 가능 |
| 대표 모델 | RandomForest | Gradient Boosting, XGBoost, LightGBM |
Gradient Boosting
Gradient Boosting Model은 부스팅 알고리즘의 대표적인 형태이다. 이전 모델의 오차를 줄이는 방향으로 새로운 약한 학습기를 추가한다. 강의자료에서는 가중치 업데이트를 경사하강법 방식으로 진행한다고 설명한다. 즉, 모델이 틀린 방향을 손실 관점에서 확인하고 손실을 줄이는 방향으로 다음 모델을 더하는 방식이다.
from sklearn.ensemble import GradientBoostingClassifier, GradientBoostingRegressor
# 분류 문제
gb_clf = GradientBoostingClassifier(random_state=42)
# 회귀 문제
gb_reg = GradientBoostingRegressor(random_state=42)
XGBoost
XGBoost(eXtreme Gradient Boosting)는 트리 기반 부스팅 알고리즘이다. 정형 데이터에서 강력한 성능을 보여 데이터 분석 대회에서 많이 사용되었다. 병렬 학습이 가능해 속도가 빠르고, 다양한 정규화 및 최적화 기법을 통해 성능과 안정성을 높인 구현체로 볼 수 있다.
from xgboost import XGBClassifier, XGBRegressor
# 분류 문제
xgb_clf = XGBClassifier(random_state=42)
# 회귀 문제
xgb_reg = XGBRegressor(random_state=42)
강의자료의 XGBoost Python 라이브러리 부분에는 xgboost.XGBRegressor가 두 번 표기되어 있다. 분류 문제에서는 XGBClassifier, 회귀 문제에서는 XGBRegressor를 사용하는 것으로 정리하는 것이 맞다.
LightGBM
LightGBM(Light Gradient Boosting Machine)은 XGBoost와 함께 많이 사용되는 부스팅 알고리즘이다. 일반적으로 학습 시간이 짧고 메모리 사용량이 작은 편이라 대용량 정형 데이터에서 효율적이다. 다만 데이터가 작거나 모델 복잡도를 과하게 설정하면 과적합이 발생할 수 있으므로 검증 데이터와 교차검증을 함께 활용해야 한다.
from lightgbm import LGBMClassifier, LGBMRegressor
# 분류 문제
lgbm_clf = LGBMClassifier(random_state=42)
# 회귀 문제
lgbm_reg = LGBMRegressor(random_state=42)
부스팅은 높은 성능을 기대할 수 있지만 하이퍼 파라미터에 민감하다. 학습률, 트리 깊이, 반복 횟수, 샘플링 비율 등을 조절하면서 검증 성능과 과적합 여부를 함께 확인해야 한다.
8. Chap 2 전체 실습 흐름과 모델 비교 코드
Chap 2의 전체 실습은 타이타닉 데이터를 기준으로 여러 모델을 적용하고 성능을 비교하는 흐름이다. 중요한 것은 모든 모델을 같은 train/test 데이터와 같은 전처리 기준에서 비교해야 한다는 점이다. 그래야 성능 차이가 데이터 분할이나 전처리 차이 때문이 아니라 알고리즘 특성에서 나온 것인지 판단할 수 있다.
1. 타이타닉 데이터 로딩 → 2. 데이터 전처리 → 3. train/test split → 4. 모델 적용 → 5. 예측 → 6. 평가 → 7. 모델별 비교
모델 비교 코드
아래 예시는 의사결정나무, 랜덤 포레스트, KNN, Gradient Boosting을 같은 데이터에 적용하고 Accuracy와 F1 Score를 비교하는 코드이다. KNN은 스케일링이 필요한 모델이므로 Pipeline 안에 StandardScaler를 함께 넣었다. 반면 의사결정나무와 랜덤 포레스트는 스케일링이 필수는 아니므로 모델만 직접 정의했다.
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, f1_score
models = {
"Decision Tree": DecisionTreeClassifier(
max_depth=3,
random_state=42
),
"Random Forest": RandomForestClassifier(
n_estimators=100,
random_state=42
),
"KNN": Pipeline([
("scaler", StandardScaler()),
("knn", KNeighborsClassifier(n_neighbors=5))
]),
"Gradient Boosting": GradientBoostingClassifier(
random_state=42
)
}
results = []
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
results.append({
"model": name,
"accuracy": accuracy,
"f1_score": f1
})
results_df = pd.DataFrame(results)
print(results_df)
Accuracy는 전체 샘플 중 맞춘 비율이고, F1 Score는 정밀도와 재현율의 조화평균이다. 데이터가 비교적 균형적이라면 Accuracy도 참고할 수 있지만, 불균형 데이터에서는 F1 Score, Recall, Precision, ROC-AUC, Average Precision 등을 함께 봐야 한다.
import matplotlib.pyplot as plt
results_df.set_index("model")[["accuracy", "f1_score"]].plot(kind="bar")
plt.title("Model Performance Comparison")
plt.ylabel("Score")
plt.ylim(0, 1)
plt.xticks(rotation=45)
plt.show()
(여기에 모델별 Accuracy와 F1 Score 비교 막대그래프 이미지 삽입)
동일한 데이터 분할과 동일한 평가 지표에서 여러 모델의 성능을 비교하는 막대그래프.
모델을 공정하게 비교하려면 데이터 분할, 전처리 기준, 평가 지표가 동일해야 한다. 특히 스케일링이 필요한 모델과 그렇지 않은 모델이 섞여 있을 때는 Pipeline을 활용해 각 모델에 필요한 전처리를 안전하게 연결하는 것이 좋다.
9. 모델 선택 기준과 제조·품질 데이터 관점
모델을 선택할 때는 단순히 성능 지표 하나만 보면 안 된다. 같은 정확도를 보이더라도 해석 가능성, 계산 비용, 예측 속도, 변수 특성, 데이터 크기, 배포 환경에 따라 적합한 모델이 달라질 수 있다. 특히 실제 업무에서는 “성능이 가장 높은 모델”보다 “현재 문제에 적합한 모델”이 더 중요하다.
| 모델 | 적합한 상황 | 주의할 점 |
| Decision Tree | 해석이 중요하고 규칙 기반 설명이 필요할 때 | 깊어질수록 과적합에 취약하다. |
| Random Forest | 안정적인 성능과 변수 중요도 확인이 필요할 때 | 단일 트리보다 해석이 어렵고 계산 비용이 증가한다. |
| KNN | 데이터 간 유사도 기반 예측이 적합할 때 | 스케일링이 중요하고 데이터가 많으면 예측이 느리다. |
| Gradient Boosting | 정형 데이터에서 높은 성능이 필요할 때 | 하이퍼 파라미터에 민감하고 과적합을 주의해야 한다. |
| XGBoost | 성능 중심의 정형 데이터 문제에서 강력한 기준 모델이 필요할 때 | 설정할 수 있는 옵션이 많아 튜닝 복잡도가 높다. |
| LightGBM | 대용량 데이터에서 빠른 학습이 필요할 때 | 작은 데이터에서는 과적합이 발생할 수 있다. |
제조·품질 데이터 분석에서는 모델 선택 기준이 더 중요해진다. 단순히 불량 여부를 잘 맞추는 것뿐 아니라, 어떤 센서 변수나 공정 조건이 품질 위험과 관련되는지 설명해야 하는 경우가 많기 때문이다. 이런 상황에서는 의사결정나무의 규칙 구조나 랜덤 포레스트의 변수 중요도가 도움이 될 수 있다.
반대로 예측 성능을 우선해야 하는 상황에서는 부스팅 계열 모델이 좋은 선택지가 될 수 있다. 다만 품질 문제는 불량 클래스가 적은 경우가 많으므로 Accuracy만 보면 모델을 잘못 평가할 수 있다. 불량 탐지에서는 Recall, Precision, F1 Score, F2 Score, ROC-AUC, Average Precision 같은 지표를 함께 검토하는 것이 더 적절하다.
품질 데이터에서는 모델 성능과 설명 가능성을 함께 고려해야 한다. 초기 분석에서는 Decision Tree나 Random Forest로 변수 영향과 규칙을 파악하고, 성능 개선 단계에서는 Gradient Boosting, XGBoost, LightGBM을 비교하는 흐름이 실무적으로 자연스럽다.
10. 전체 흐름 요약과 핵심 개념 정리
전체 흐름 요약
Chap 2는 선형회귀와 로지스틱 회귀 이후 자주 사용하는 대표 알고리즘을 다룬다. 의사결정나무는 조건문을 나무 구조로 표현해 데이터를 분류하거나 예측한다. 직관적이고 해석하기 쉽지만, 트리가 너무 깊어지면 과적합될 수 있다.
랜덤 포레스트는 여러 개의 의사결정나무를 만들어 결과를 합치는 앙상블 모델이다. 배깅을 통해 서로 다른 데이터 샘플에 여러 트리를 학습시키고, 분류에서는 다수결, 회귀에서는 평균으로 최종 예측을 만든다. 이 과정은 단일 트리의 불안정성을 줄이고 예측을 더 안정적으로 만든다.
KNN은 새 데이터와 가까운 이웃을 기준으로 예측하는 거리 기반 모델이다. 이해하기 쉽고 직관적이지만, 거리 계산에 변수 스케일이 큰 영향을 주므로 표준화가 중요하다. K 값은 대표적인 하이퍼 파라미터이며, 너무 작거나 너무 크면 각각 과적합 또는 과소적합 문제가 생길 수 있다.
부스팅은 약한 학습기를 순차적으로 학습하면서 이전 모델의 오류를 보완하는 방식이다. Gradient Boosting, XGBoost, LightGBM이 대표적이며 정형 데이터에서 강력한 성능을 보이는 경우가 많다. 다만 하이퍼 파라미터에 민감하므로 검증 데이터와 교차검증을 활용해 과적합 여부를 확인해야 한다.
핵심 개념 정리
| 핵심 개념 | 정리 |
| 의사결정나무 | 데이터를 조건 기준으로 반복 분할해 예측하는 모델이다. 해석이 쉽지만 과적합에 주의해야 한다. |
| 불순도 | 한 노드 안에 클래스가 얼마나 섞여 있는지 나타낸다. 의사결정나무는 불순도가 줄어드는 방향으로 분할한다. |
| 랜덤 포레스트 | 여러 개의 의사결정나무를 학습하고 예측을 합쳐 안정성을 높이는 배깅 기반 앙상블이다. |
| KNN | 가까운 K개의 이웃 데이터를 기준으로 예측한다. 거리 기반이므로 스케일링이 중요하다. |
| 하이퍼 파라미터 | 모델 학습 전에 분석가가 직접 설정하는 값이다. KNN의 K, 트리 깊이, 트리 개수 등이 해당한다. |
| 부스팅 | 약한 학습기를 순차적으로 학습시키며 이전 오류를 보완해 강한 모델을 만드는 앙상블 방식이다. |
Chap 2의 핵심은 알고리즘 이름을 외우는 것이 아니라, 각 모델이 데이터를 나누고, 이웃을 찾고, 여러 모델을 결합하는 방식의 차이를 이해한 뒤 문제 상황에 맞게 선택하는 것이다.
11. 참고 자료
사용자 정리본: Chap 2. 회귀·분류 모델링 심화 알고리즘 정리
강의자료 PDF: 머신러닝의 이해와 라이브러리 활용 심화 Chap 2. 의사결정나무, 랜덤 포레스트, KNN, 부스팅, 전체 실습
보충 개념: scikit-learn 기반 모델 사용 흐름, 과적합과 일반화, Pipeline을 활용한 스케일링, 모델 선택 기준, 정형 데이터 품질 분석 관점
'TIL > 머신러닝' 카테고리의 다른 글
| 로지스틱 회귀와 분류 평가 지표 정리 (0) | 2026.06.24 |
|---|---|
| 머신러닝 : 데이터 전처리부터 모델링과 평가까지 (0) | 2026.06.18 |
| 머신러닝의 정의와 학습 유형 그리고 모델링 흐름 정리 (0) | 2026.06.17 |
| 머신러닝 기초와 선형회귀 이해하기 (0) | 2026.06.17 |
| VS Code 설치 및 설정 방법 : Python과 Jupyter Notebook 실습 환경 조성하기 (0) | 2026.06.17 |
