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_)
교차 검증에서 얻은 점수와 매우 비슷한 결과를 얻었습니다.
참고]
혼자공부하는 머신러닝(한빛미디어)
'강의자료 > 머신러닝' 카테고리의 다른 글
[머신러닝활용] dlib 라이브러리를 이용한 얼굴 인식 (7) | 2023.01.17 |
---|---|
[머신러닝활용] OpenCV 사용법 알아보기 (11) | 2023.01.10 |
[캐글(Kaggle) 따라하기]06-1.의사결정 트리 (6) | 2022.12.21 |
[캐글(Kaggle) 따라하기]05-3. 데이터 전처리 실습하기 (7) | 2022.12.14 |
[캐글(Kaggle) 따라하기]05-2.KNN(K-최근접 이웃) 알고리즘2 - 실습하기 (7) | 2022.12.09 |