강의자료/머신러닝

[캐글(Kaggle) 따라하기]06-2.랜덤 포레스트(RandomForest)

파아란 기쁨 2022. 12. 29. 11:51

https://wondangcom.tistory.com/2354

타이타닉 문제를 해결 하면서 에서 랜덤 포레스트로 훈련을 해 보았는데요~

오늘은 랜덤 포레스트가 무엇인지 확인을 해 보겠습니다.

 

1. 랜덤포레스트(Random Forest)란?

랜덤포레스트는 훈련을 통해 구성해 놓은 다수의 나무들로 부터 분류 결과를 취합에서 결론을 얻는 일종의 인기투표와 같은 것이라고 생각하면 좋을 것 같습니다.

랜덤 포레스트는앙상블 학습의 대표 주자 중 하나로 안정적인 성능 덕분에 널리 사용되고 있습니다. 

랜덤 포레스트는 결정트리를 랜덤하게 만들어 결정트리의 숲을 만듭니다. 그리고 각 결정트리의 예측을 사용해 최종예측을 만듭니다.

먼저 랜덤포레스트는 각 트리를 훈련하기 우한 데이터를 랜덤하게 만드는데 이 데이터를 만드는 방법이 독특합니다.

우리가 입력한 훈련 데이터에서 랜덤하게 샘플을 추출하여 훈련 데이터를 만듭니다.

이 때 한 샘플이 중복되어 추출될 수도 있습니다.

예를 들어 1000개 가방에서 100개씩 샘플을 뽑는다면 먼저 1개를 뽑고 뽑았던 1개를 다시 가방에 넣습니다. 이런식으로 계속 100개를 뽑으면 중복된 샘플을 뽑을 수 있습니다.

이렇게 만들어진 샘플을 부트스트랩샘플(bootstrap sample)이라고 부릅니다.

기본적으로 부트스트랩 샘플은 훈련세트의 크기와 같게 만듭니다.

즉 1000개의 가방에서 1000개의 샘플을 뽑습니다.

또한 각 노드를 분할 할 때 전체 특성 중에서 일부 특성을 무작위로 고른 다음 이 중에서 최선의 분할을 찾습니다.

분류 모델인 RandomForestClassifier는 기본적으로 전체 특성 개수의 제곱근 만큼의 특성을 선택합니다.

즉 16개의 특성이 있다면 노드마다 4개를 랜덤하게 선택하여 사용합니다.

랜덤 포레스트는 랜덤하게 선택한 샘플과 특성을 사용하기 때문에 훈련 세트에 과대적합되는 것을 막아주고 검증세트와 테스트세트에서 안정적인 성능을 얻을 수 있습니다.

 

 2. 와인 분류 문제 랜덤포레스트로 풀어 보기

 1.데이터 로딩

import pandas as pd
wine = pd.read_csv('wine_csv_data.csv')
print(wine.head())

2. 훈련세트와 테스트 세트 분리

import numpy as np
from sklearn.model_selection import train_test_split

data = wine[['alcohol','sugar','pH']].to_numpy()
target = wine['class'].to_numpy()
train_input,test_input,train_target,test_target = train_test_split(data,target,test_size=0.2)

3. 검증

cross_validate() 함수를 사용해 교차 검증을 수행해 보겠습니다.

RandomForestClassifier 는 기본적으로  100개의 결정 트리를 사용하므로 n_jobs=-1 값을 사용하여 cpu 코어를 최대로 사용합니다.

return_train_score 매개변수를 True 로 지정하면 검증 점수 뿐만 아니라 훈련세트에 대한 점수도 같이 반환합니다.

from sklearn.model_selection import cross_validate
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_jobs=-1,random_state=42)

scores = cross_validate(rf,train_input,train_target,return_train_score=True,n_jobs=-1)
print(np.mean(scores['train_score']),np.mean(scores['test_score']))

출력된 결과를 보면 다소 과대적합 된 것 같습니다.

from sklearn.model_selection import cross_validate
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_jobs=-1,max_depth=10)

scores = cross_validate(rf,train_input,train_target,return_train_score=True,n_jobs=-1)
print(np.mean(scores['train_score']),np.mean(scores['test_score']))

max_depth = 10으로 주면  훈련세트와 테스트 세트의 출력된 결과가 줄어 드는 것을 알 수 있습니다.

랜덤포레스트는 결정 트리의 앙상블이기 때문에 DecisionTreeClassifier가 제공하는 주요한 매개변수를 모두 제공합니다.

또한 결정트리의 큰 장점중 하나인 특성 중요도를 계산합니다.

랜덤포레스트로 훈련된 특성 중요도를 살펴 보겠습니다.

rf.fit(train_input,train_target)
print(rf.feature_importances_)

의사결정트리에서 만든 특성 중요도는 다음과 같습니다.

두개를 비교해 보면 알코올도수,pH가 중요도가 조금더 상승하고 ,당도는 조금더 감소한것을 확인할 수 있습니다.

 

이런 이유는 랜덤 포레스트가 특성의 일부를 랜덤하게 선택하여 결정 트리를 훈련하기 때문입니다.

그 결과 하나의 특성에 과도하게 집중하지 않고 좀 더 많은 특성이 훈련에 기여할 기회를 얻습니다.

이 것은 과대적합을 줄이고 일반화 성능을 높이는데 도움이 됩니다.

 

RandomForestClassifier에는 oob_score 매개변수를 True로 지정하면 부트스프트랩 샘플로 훈련한 결과의 점수를 얻을 수 있습니다. 이때 평균을 출력합니다.

rf = RandomForestClassifier(oob_score=True,n_jobs=-1,random_state=42)
rf.fit(train_input,train_target)
print(rf.oob_score_)

교차 검증에서 얻은 점수와 매우 비슷한 결과를 얻었습니다.

 

참고] 

혼자공부하는 머신러닝(한빛미디어)

사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기