랜덤 포레스트(Random Forest)란? AI에서 여러 결정 트리의 예측을 합치는 방법
TL;DR
랜덤 포레스트는 무작위성을 넣어 학습한 여러 결정 트리의 예측을 모으는 앙상블 모델입니다. 보통 학습 행을 복원 추출하고 각 분기에서 살펴볼 특징을 무작위로 골라 트리들이 지나치게 비슷해지는 것을 줄입니다. 분류와 회귀에 모두 쓰며, 트리 수·깊이·특징 수와 검증 방식에 따라 성능과 비용이 달라집니다.
핵심 3줄 요약
- 핵심 1
여러 결정 트리를 합칩니다. 하나의 나무가 데이터의 우연한 차이에 흔들리는 문제를 줄이려는 방법입니다. - 핵심 2
표본과 특징에 무작위성을 줍니다. 같은 데이터로 똑같은 트리를 반복하는 것과 다르며 설정에 따라 무작위성의 정도가 바뀝니다. - 핵심 3
숲의 크기가 품질을 보장하지는 않습니다. 독립 평가, 메모리·추론 시간, 확률과 특성 중요도의 해석을 함께 확인합니다.
이 글에서 다룰 내용
- 랜덤 포레스트의 한 문장 정의
- 구매 여부를 예측하는 쉬운 예시
- 복원 추출과 분기별 특징 선택의 원리
- 결정 트리·배깅·부스팅·Extra Trees와의 차이
- 분류·회귀 활용과 설정 점검 순서
- OOB 평가와 특성 중요도를 읽을 때의 주의점
- AI 초보자가 자주 묻는 질문
랜덤 포레스트를 한 문장으로 정의하면 무엇인가요?
랜덤 포레스트(Random Forest, RF)는 학습 표본과 분기 후보에 무작위성을 주어 만든 여러 결정 트리의 결과를 결합하는 지도학습 모델입니다.
결정 트리는 입력값에 조건을 걸어 데이터를 가지처럼 나누고 마지막 잎에서 예측합니다. 구매 횟수가 특정 기준보다 많은지, 마지막 방문 뒤 얼마나 지났는지 등을 차례로 묻는 구조입니다. 랜덤 포레스트는 이런 트리를 여러 개 만들어 하나의 모델처럼 사용합니다.
대표적인 구성은 부트스트랩 표본과 무작위 특징 선택을 함께 씁니다. 부트스트랩은 뽑은 행을 다시 뽑을 수 있는 복원 추출입니다. 다만 라이브러리 설정으로 표본 추출을 끄거나 모든 특징을 살펴보게 할 수도 있으므로 모델 이름만으로 실제 학습 조건을 단정하지 않습니다.
한 줄 정리: 랜덤 포레스트는 서로 조금씩 다른 조건으로 자란 결정 트리들의 예측을 모으는 방법입니다.
쉬운 예시로 이해해 볼까요?
고객의 방문 횟수, 장바구니 금액, 최근 구매 이력으로 구매 여부를 예측한다고 가정해 보겠습니다. 한 트리는 장바구니 금액을 먼저 보고, 다른 트리는 방문 이력부터 나눕니다. 학습에 뽑힌 고객과 분기 후보가 달라지면 같은 고객을 보는 판단 경로도 달라질 수 있습니다.
설명을 위해 세 트리의 구매 확률이 각각 0.8, 0.6, 0.4라고 해 보겠습니다. scikit-learn의 분류 구현처럼 확률을 평균하면 최종 구매 확률은 0.6입니다. 이 숫자는 계산 원리를 보여 주는 가상 예시이며 실제 고객 데이터로 측정한 성능은 아닙니다.
각 트리가 고른 클래스만 투표하는 방식과 확률 평균은 구분해야 합니다. scikit-learn 공식 가이드는 원 논문의 클래스 투표와 달리 트리별 확률을 평균한다고 설명합니다. 회귀 문제에서는 각 트리가 예측한 숫자를 평균해 최종 값을 만듭니다.
쉬운 예시: 같은 고객 명단을 그대로 복사해 같은 기준으로 판단하는 대신, 조금씩 다른 표본과 질문 후보로 만든 판단 결과를 모은다고 이해하면 쉽습니다.
왜 AI에서 랜덤 포레스트가 중요한가요?
단일 트리의 흔들림을 줄입니다
깊은 결정 트리는 학습 데이터에 잘 맞지만 일부 행이 바뀌면 분기 구조도 크게 달라질 수 있습니다. 랜덤 포레스트는 여러 트리를 합쳐 이런 분산을 줄이는 데 목적을 둡니다. 개별 트리가 같은 실수를 반복한다면 평균을 내는 이점도 작아집니다.
복잡한 표 형태의 관계를 비교합니다
고객·거래·센서처럼 행과 열로 정리한 데이터에서는 특징 사이의 비선형 관계를 트리의 조건 분기로 다룰 수 있습니다. 관계를 모두 직선으로 가정하지 않고 분류와 회귀 모델을 만들어 볼 수 있어, 새 예측 과제에서 비교할 기준 모델의 후보가 됩니다.
품질과 운영 비용을 함께 판단할 수 있습니다
트리 수를 늘리면 예측이 안정되는 데 도움이 될 수 있지만 어느 지점부터 개선 폭은 작아집니다. 트리 수와 깊이는 저장 크기, 학습 시간, 예측 시간에도 영향을 줍니다. 공식 가이드도 최적 설정은 교차 검증으로 확인하고 메모리 사용량을 살피도록 안내합니다.
핵심 인사이트: 중요한 것은 트리의 개수만이 아닙니다. 개별 트리의 예측력과 트리 사이의 오류 차이가 함께 있어야 결합의 이점을 얻습니다.
랜덤 포레스트는 어떻게 작동하나요?
1. 학습 행을 복원 추출합니다
일반적인 부트스트랩 구성에서는 원본 학습 데이터에서 행을 중복 허용해 뽑아 트리마다 다른 학습 묶음을 만듭니다. 어떤 행은 여러 번 들어가고 어떤 행은 빠집니다. 이는 원본을 서로 겹치지 않는 조각으로 나누는 작업과 다릅니다. 각 트리가 보지 않은 행은 OOB 평가에 활용할 수 있습니다.
2. 각 분기에서 특징 후보를 고릅니다
노드를 나눌 때 전체 특징 가운데 일부를 무작위로 후보에 올리고 그 후보 안에서 좋은 분할을 찾습니다. 한 트리가 처음 고른 특징 목록만 끝까지 쓰는 방식으로 이해하면 틀립니다. 후보 선택은 각 분기에서 이뤄지며 max_features가 후보 수를 조절합니다.
무작위라는 이름이 모든 경계값을 아무렇게나 정한다는 뜻도 아닙니다. scikit-learn의 랜덤 포레스트는 후보 특징 안에서 분할 기준에 맞는 좋은 경계를 찾습니다. 특징 후보를 지나치게 줄이면 트리 사이 차이는 커져도 각 트리의 예측력이 약해질 수 있습니다.
3. 트리별 예측을 모읍니다
학습이 끝나면 새 입력을 각 트리에 넣고 결과를 합칩니다. scikit-learn 분류기는 클래스별 확률을 평균한 뒤 가장 높은 클래스를 고릅니다. 회귀기는 예측값을 평균합니다. 학습 때 임의 표본을 쓴다고 예측할 때마다 새로 학습하거나 임의의 답을 뽑는 것은 아닙니다.
실전 팁: 분류의 확률 평균과 클래스 투표 중 무엇을 쓰는지 구현 문서에서 확인하세요. 설명 자료의 간단한 다수결 예시가 실제 API 동작과 같다고 가정하지 않습니다.
랜덤 포레스트와 헷갈리는 용어는 무엇이 다른가요?
결정 트리와 랜덤 포레스트의 차이
결정 트리는 하나의 조건 분기 구조이고 랜덤 포레스트는 여러 트리를 묶은 모델입니다. 단일 트리는 한 예측의 경로를 따라가기 비교적 쉽지만, 숲 전체를 하나의 짧은 규칙으로 설명하기는 어렵습니다. 트리 하나를 시각화한 그림을 전체 모델의 판단 규칙처럼 제시하지 않습니다.
앙상블·배깅과 랜덤 포레스트의 차이
앙상블은 여러 예측기를 결합하는 큰 범주이고 배깅은 복원 추출한 표본으로 예측기를 학습해 결과를 모으는 방식입니다. 랜덤 포레스트는 결정 트리의 분기별 특징 선택까지 이용하는 구체적인 모델입니다. 앙상블 학습의 전체 분류와 랜덤 포레스트의 세부 학습 원리는 구분해 읽으면 좋습니다.
설정에 따라 이 경계가 가까워지기도 합니다. scikit-learn 회귀기의 max_features 기본값은 1.0으로 모든 특징을 후보로 봅니다. 문서는 이 조건을 배깅 트리와 동등하다고 설명합니다. 특징 무작위 선택을 원한다면 분류기와 회귀기의 기본값이 같다고 생각하지 말고 직접 확인합니다.
그래디언트 부스팅과 랜덤 포레스트의 차이
그래디언트 부스팅은 앞 단계 예측의 오차를 줄이도록 다음 트리를 순차적으로 추가합니다. 랜덤 포레스트의 트리는 앞 트리의 오차를 이어받아 수정하는 방식이 아니므로 트리별 학습을 병렬로 진행할 수 있습니다. 둘 다 트리 앙상블이지만 학습 순서와 결합 방식이 다릅니다.
Extra Trees와 랜덤 포레스트의 차이
Extra Trees는 분기 경계값 후보에도 무작위성을 더합니다. 랜덤 포레스트가 선택한 특징 안에서 좋은 경계를 찾는 데 비해, Extra Trees는 무작위로 만든 경계 후보 가운데 좋은 것을 고릅니다. scikit-learn에서 부트스트랩 사용 기본값도 다르므로 두 이름을 같은 모델의 별칭으로 쓰지 않습니다.
비교 정리: 결정 트리는 구성 단위, 앙상블은 상위 범주, 배깅은 표본 결합 방식입니다. 랜덤 포레스트와 부스팅, Extra Trees는 트리를 만드는 규칙이 다른 모델입니다.
실전에서는 어디에 쓰이나요?
범주를 고르는 분류 문제
고객 구매 여부, 제품 불량 여부, 문의 유형처럼 정답이 범주인 문제에 분류기를 적용할 수 있습니다. 이때 텍스트 문의 원문을 그대로 넣는 것이 아니라 도구가 받을 수 있는 특징으로 바꿔야 합니다. 드문 불량 사례를 찾는다면 전체 정확도 외에 해당 클래스의 재현율도 함께 봅니다.
숫자를 맞히는 회귀 문제
가격, 판매량, 처리 시간처럼 정답이 연속적인 수치라면 회귀기를 사용합니다. 각 트리의 숫자 예측을 평균한다는 원리는 같아도 평가 지표는 분류 정확도가 아닙니다. 업무에서 허용할 오차의 단위를 정하고 단순 평균 예측이나 다른 회귀 모델과 비교합니다.
특징을 점검하는 분석 작업
학습된 숲의 feature_importances_로 어떤 특징이 분할 기준 개선에 많이 기여했는지 살펴볼 수 있습니다. 공식 예제는 고유값이 많은 특징에서 불순도 기반 중요도가 오해를 낳을 수 있다고 경고합니다. 별도 데이터에서 특징값을 섞어 성능 하락을 보는 순열 중요도도 함께 검토합니다.
실전 팁: 중요도 순위는 데이터와 모델을 점검하는 출발점입니다. 높은 순위만 보고 그 특징이 결과의 원인이라고 결론 내리거나 나머지 열을 바로 삭제하지 않습니다.
랜덤 포레스트를 적용할 때 어떤 순서로 확인하나요?
1. 정답과 평가 분리를 정합니다
예측 대상이 클래스인지 숫자인지 먼저 구분합니다. 같은 고객의 여러 기록이나 시간 순서가 있는 데이터라면 그 관계를 고려해 학습·검증·테스트를 나눕니다. 예측 시점 이후의 정보가 특징에 섞이면 모델 종류와 무관하게 평가가 실제보다 좋아질 수 있습니다.
2. 트리 수와 크기를 따로 봅니다
n_estimators는 트리 개수이고 max_depth는 트리의 최대 깊이입니다. min_samples_leaf는 마지막 잎에 필요한 최소 표본 수를 조절합니다. 나무를 많이 만드는 것과 나무 하나를 복잡하게 만드는 것은 다른 변경이므로 검증 점수와 메모리 사용량을 함께 기록합니다.
3. 특징 수와 표본 설정을 확인합니다
max_features는 분기마다 고려할 특징 수, bootstrap은 복원 추출 사용 여부, max_samples는 부트스트랩에 뽑을 표본 수를 조절합니다. oob_score를 쓰려면 부트스트랩을 켜야 합니다. random_state와 사용한 라이브러리 버전도 기록하면 설정 변경의 영향을 비교하기 편합니다.
4. 점수와 실제 예측 비용을 비교합니다
분류에서는 필요한 정밀도·재현율과 확률의 의미를, 회귀에서는 오차 크기와 큰 오차 사례를 확인합니다. n_jobs로 병렬 작업 수를 늘리더라도 속도가 같은 비율로 빨라진다고 보장할 수는 없습니다. 배포 환경에서 예측 지연과 메모리까지 측정한 뒤 모델을 고릅니다.
한 줄 정리: 데이터 분리, 트리 수와 크기, 표본·특징 선택, 품질과 비용을 차례로 확인합니다. 기본값은 시작점이며 업무에 맞는 최적값이라는 보장은 없습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, OOB 점수를 독립 테스트의 무조건적인 대체물로 쓰지 않습니다. OOB는 각 행을 학습에 쓰지 않은 트리들로 그 행을 예측하는 평가입니다. 동일 고객이나 미래 정보가 섞인 문제를 자동으로 해결하지는 않습니다. 설정을 반복해서 고를 때 참고한 점수와 마지막 확인용 테스트 결과를 구분합니다.
둘째, 여러 트리를 쓴다고 과적합이 사라지지는 않습니다. 잘못된 라벨이나 누수된 특징은 숲 전체가 함께 배울 수 있습니다. 학습 점수만 높고 독립 검증 성능이 낮다면 트리 개수부터 늘리기보다 데이터와 트리 복잡도를 점검합니다.
셋째, 평균 확률을 정답률 보증으로 해석하지 않습니다. 예측 확률이 높다고 같은 비율로 실제 정답이 맞는다고 단정할 수 없습니다. 확률값을 승인·거절 같은 의사결정에 쓴다면 별도 데이터에서 확률 보정과 임계값을 검토합니다.
넷째, 특성 중요도를 원인이나 공정성의 증거로 쓰지 않습니다. 중요도는 특정 모델이 주어진 데이터에서 활용한 정도를 보여 줍니다. 고유값 수의 영향과 함께 데이터 수집 방식, 민감한 정보가 다른 열에 간접적으로 드러나는지도 살펴야 합니다.
다섯째, 입력 처리와 구현 차이를 확인합니다. 문자열 범주를 어떻게 숫자로 바꿀지, 결측값을 받을 수 있는지, 운영 시 열 순서가 같은지 점검합니다. scikit-learn 공식 API는 결측값 지원을 설명하지만 다른 구현이나 과거 버전에도 같은 기능이 있다고 단정하지 않습니다.
주의: 랜덤 포레스트의 무작위성은 데이터 오류나 편향을 지우는 장치가 아닙니다. 검증할 때 보지 못한 고객·기간·환경에서 어떻게 작동하는지가 최종 판단 기준입니다.
자주 묻는 질문
Q1. 랜덤 포레스트는 딥러닝인가요?
일반적인 랜덤 포레스트는 결정 트리를 결합하는 머신러닝 모델이며 신경망 층을 쌓는 딥러닝과 다릅니다. AI가 곧 딥러닝이라는 뜻은 아닙니다. 입력 형태와 데이터 규모, 평가 조건에 맞춰 여러 모델을 비교합니다.
Q2. 랜덤이라는 말은 답도 매번 임의로 나온다는 뜻인가요?
주요 무작위성은 학습 표본과 분기 후보를 고르는 과정에 들어갑니다. 학습된 트리들은 정해진 분기 규칙으로 입력을 처리합니다. 같은 조건의 실험을 비교하려면 random_state뿐 아니라 데이터와 구현 환경도 함께 기록합니다.
Q3. 트리는 많을수록 무조건 좋은가요?
트리 수를 늘리면 예측의 흔들림이 줄 수 있지만 추가 이익은 점차 작아질 수 있습니다. 그동안 학습·저장·예측 비용은 늘어납니다. 검증 성능이 거의 변하지 않는다면 더 큰 숲을 선택할 이유가 있는지 비용과 함께 판단합니다.
Q4. 랜덤 포레스트는 항상 다수결로 분류하나요?
구현을 확인해야 합니다. 원 논문은 클래스 투표를 사용하지만 scikit-learn 분류기는 트리별 클래스 확률을 평균합니다. 클래스 이름만 모아 다수결한 결과와 확률을 평균한 결과가 항상 같다고 보장할 수 없습니다.
Q5. OOB 평가를 켜면 교차 검증은 필요 없나요?
OOB는 부트스트랩에서 빠진 표본을 활용하는 편리한 평가 방법입니다. 다만 시간·고객 집단을 나눠야 하는 문제나 설정을 반복 탐색하는 과정까지 대신해 주지는 않습니다. 업무의 데이터 구조에 맞는 검증 설계와 마지막 테스트를 따로 마련합니다.
출처
마무리
랜덤 포레스트는 서로 다른 표본과 특징 조건으로 학습한 여러 결정 트리의 예측을 모으는 모델입니다. 단일 트리의 흔들림을 줄이면서 분류와 회귀를 수행하지만, 데이터 품질과 검증 설계까지 대신해 주는 것은 아닙니다.
처음에는 복원 추출, 분기별 특징 선택, 예측 결합을 구분해 기억하면 충분합니다. 실제로 사용할 때는 분류기와 회귀기의 기본값, OOB 점수의 의미, 특성 중요도의 한계를 확인하세요. 트리 수만 늘리는 대신 독립 평가에서 얻는 이점과 운영 비용을 함께 비교하는 편이 좋습니다.
