앙상블(Bagging) - Random Forest

권형준·2025년 11월 17일

머신러닝

목록 보기
12/18

앞 글에서 bagging에 대해서 정리했는데, bagging만으로는 한계가 부족한 면이보인다. Bagging은 중복을 허용해서 랜덤 샘플을 여러번 만든다음 각 샘플의 판단값을 평균으로 잡는데, (모든 샘플 데이터가 다 비슷), random forest는 서로 다른 방식으로 학습한 랜덤 샘플들을 가지고 샘플들의 판단값으로 기준을 삼음 👉 다양한 시각으로 묶인 샘플들이기 때문에 더 정확해짐

예시)
사과? 배? 헷갈릴 때 학생 100명에게 물어봄.
30명에겐 크기만
30명에겐 색깔만
나머지 40명에겐 당도만 공부한 모임임
각 모임에게 판단하라고 하고
만약 1개 모임이 사과, 2개모임이 배라고 하면
배라고 최종 판단됨


randomforest하기 전에 모듈로는
sklearn.ensemble에서 randomforest분별기(yes no 판단하는거죠)
sklearn.ensemble안에는 bagging도 있었음
iris 데이터 가지고 와서 만진다

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 데이터 준비
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

여기서는 randomforestclassifier 메서드들로
n_estimators = (트리갯수)
max_features = sqrt(요거는 뭐야) 👉 만약 피쳐가 16개이면 4개의 컬럼만 고른다는 뜻
max_depth = 트리 층 갯수
min_samples_split =
min_samples_leaf =
bootstrap=True
oob_score=True
n_jobs = -1 모든 CPU계산
random_state = 42가있다.

# Random Forest 생성
rf = RandomForestClassifier(
    n_estimators=100,        # 트리 개수
    max_features='sqrt',     # 각 노드에서 √p개 특성 고려
    max_depth=None,          # 트리를 끝까지 성장
    min_samples_split=2,     # 노드 분할 최소 샘플
    min_samples_leaf=1,      # 리프 노드 최소 샘플
    bootstrap=True,          # Bootstrap 샘플링 사용
    oob_score=True,          # OOB score 계산
    n_jobs=-1,               # 모든 CPU 코어 사용
    random_state=42
)

여기서는 위에 메서드에 적은 내용들 가져다 쓰기만 하면됨.
하면서 왜 피쳐 위치 지정을 안해주는지? 궁금했다. (저번에 다른거 코드할 때 뭔가 X[:, :2]같은 느낌으로 지정 해주었었는데, 요번에는 왜 안하지?

RandomForestClassifier는 X_train에 들어있는 feature 개수를 자동으로 파악 + 내부에서 알아서 max_feature = 'sqrt'를 사용해서 알아서 랜덤으로 지정해줌. 아마 피쳐를 지정해줬던 이유는 시각화 하기 위해선 x축 y축을 분할해서 보여줘야 하기 때문이었다..


# 학습
rf.fit(X_train, y_train)

# 평가
train_score = rf.score(X_train, y_train)
test_score = rf.score(X_test, y_test)
oob_score = rf.oob_score_

print("Random Forest 성능")
print("="*40)
print(f"훈련 정확도: {train_score:.4f}")
print(f"테스트 정확도: {test_score:.4f}")
print(f"OOB 점수: {oob_score:.4f}")
print(f"사용된 특성 수: {rf.n_features_}")
print(f"클래스: {rf.classes_}")

요 아래는 과제 내가 대충 맞춰서 넣어봄

아래는 결과값!

profile
천리길도 한발짝부터

0개의 댓글