티스토리 뷰

머신러닝

[11] RandomForest Model

up_one 2025. 2. 13. 17:22

2024.06.28 - [머신러닝] - [7] 앙상블 모델에서 언급된 Bagging의 특징을 이용한 RandomForest 모델은 여러 개의 Tree 분류기를 생성하여 예측값을 도출하는 방법입니다.

 

[7] 앙상블 모델

SVM(Support Vector Machine), KNN 알고리즘과 같이 단일 분류 알고리즘을 조합해 하나의 예측 모형으로 만드는 지도학습 방법론을 앙상블 모델이라고 합니다. 이번 시간에는 앙상블 모델의 종류인 Bagging

up-one-coding.tistory.com

 

Bagging 기반으로 데이터셋을 복원 추출하고 여러 개의 분류기를 구현해 학습시키는 RandomForest 모델은 '집단 지성의 힘'으로 비유해 여러 개의 Tree 모델이 예측한 값들 가장 많은 값을 최종 예측값으로 사용하거나 평균값을 최종 예측값으로 사용합니다.

 

RandomForest의 가장 중요한 원리는 복원 추출된 Dataset의 개수만큼 개별 분류기를 생성하는 것입니다. 이 때, 개별 분류기 간의 상관성이 낮을수록 예측력은 향상된다는 것이 RandomForest의 가장 큰 특징입니다. 개별 분류기에서는 데이터셋에 존재하는 변수들 중 일정 개수를 랜덤 하게 골라 데이터셋을 분류시키는 기준으로 설정하는데, Randomforest는 매번 새로운 변수가 데이터셋을 분류시키는 기준으로 랜덤 하게 골라지기 때문에 상관성이 낮아지는 것입니다.

 

하지만 RandomForest의 Bagging 기법에서는 복원 추출되지 않은 데이터셋이 존재하여 결과가 편향되어 나타날 수도 있습니다. 이를 방지하기 위해 RandomForest 기반 모델에는 oob_score라는 파라미터를 사용하여 학습 데이터로 나온 예측값과 test한 결괏값의 차이를 기반으로 한 정확도를 확인할 수 있습니다. 위 언급된 복원 추출되지 않은 데이터셋을 Test dataset의 역할을 부여하여 성능을 측정하기 위해서는 oob_score 파라미터의 값을 True로 설정합니다.

Customer Cleaned.csv을 이용한 RandomForestClassifier 예시

https://raw.githubusercontent.com/rickiepark/handson-gb/main/Chapter02/census_cleaned.csv에서 예시를 위한 데이터셋을 다운받을 수 있습니다. 이번 예시에서는 oob_score가 n_estimators에 값에 따라 어떻게 변하는지 시각화를 통해 알아보겠습니다. n_estimators 파라미터는 생성할 tree의 개수를 설정합니다. 위 데이터는 종속변수(' income_ >50K')를 분류하는 것을 목적으로 합니다.

#dataset 확인
df_census = pd.read_csv('census_cleaned.csv')
df_census.head()

 

종속변수를 income_>50K로 설정하고 oob_score를 저장하기 위한 리스트를 선언합니다.

X = df_census.iloc[:,:-1]   #독립변수
y = df_census.iloc[:,-1]    #종속변수
oob_score = [] #oob score : 학습 데이터로 나온 예측값과 test한 결과값의 차이를 기반으로 한 정확도

 

RandomForestClassifier을 활용하고, 초기 n_estimators값을 50으로 설정하여 10번씩 값을 50씩 늘려 oob_score값이 바뀌는 추세를 확인합니다.

model = RandomForestClassifier(oob_score=True, n_estimators=50, random_state=42, n_jobs=-1)
model.fit(X, y)
oob_score.append(model.oob_score_)

est = 50        #초기 tree 개수 설정
estimators = [est]
for i in range(9):
    est += 50     #10번씩 tree 개수를 50개씩 늘리기
    estimators.append(est)
    model.set_params(n_estimators = est)   #늘린 estimator을 파라미터로 설정
    model.fit(X, y)
    oob_score.append(model.oob_score_)     #oob_score 산출
    
#n_estimators에 따른 oob_score 추세 확인
model = RandomForestClassifier(oob_score=True, n_estimators=50, random_state=42, n_jobs=-1)
model.fit(X, y)
oob_score.append(model.oob_score_)

est = 50        #초기 tree 개수 설정
estimators = [est]
for i in range(9):
    est += 50     #10번씩 tree 개수를 50개씩 늘리기
    estimators.append(est)
    model.set_params(n_estimators = est)   #늘린 estimator을 파라미터로 설정
    model.fit(X, y)
    oob_score.append(model.oob_score_)     #oob_score 산출

 

아래 시각화한 결과에 따라, 생성할 tree의 개수(n_estimators 값)를 약 250으로 설정하면 oob_score가 가장 높은 것을 확인할 수 있습니다. 이처럼 oob_score를 기준으로 RandomForestClassifier 모델의 하이퍼파라미터를 튜닝하여 최적화를 시킬 수 있습니다.

n_estimators에 따른 oob_score 추세

'머신러닝' 카테고리의 다른 글

[13] Lightgbm  (0) 2025.03.04
[12] Xgboost  (0) 2025.02.24
[10] 로지스틱 회귀 모델  (1) 2025.02.11
[9] 정규화 모델 (Regularization)  (0) 2024.07.07
[8] 의사결정나무  (2) 2024.06.30
TAG more
글 보관함
최근에 올라온 글