[머신러닝] 랜덤 포레스트 (Random Forest) 개념 및 예제 실습 / 독버섯 예제
랜덤 포레트스
랜덤 포레스트 - Random Forest
- 집단 학습을 기반으로 고정밀 분류, 회귀, 클러스트링 구현
- 학습 데이터로 다수의 의사결정 트리를 만들고 그 결과의 다수결 결과 유도로 높은 정밀도
- 무작위 샘플링과 다수의 의사결정 트리 => Random Forest
결정 트리(Decision Tree)
- 분류(Classification)와 회귀(Regression) 모두 가능한 지도 학습 모델 중 하나
- 결정 트리는 스무고개 하듯이 예/아니오 질문을 이어가며 학습
- 한 번의 분기 때마다 변수 영역을 두 개로 구분
매, 펭귄, 돌고래, 곰을 구분한다고 생각해보자
- Terminal Node는 LeafNode 라고도 함
프로세스
1. 데이터를 가장 잘 구분할 수 있는 질문을 기준으로 나누기
2. 나뉜 각 범주에서 또 다시 데이터를 가장 잘 구분할 수 있는 질문을 기준으로 나눔
* 이를 지나치게 많이 하면 아래와 같이 오버피팅
- 결정 트리에 아무 파라미터를 주지 않고 모델링하면 오버피팅
가지치기(Pruning) - 오버피팅 막기 전략
- 트리에 가지가 너무 많으면 오버피팅
- 한 노드가 분할하기 위한 최소 데이터수를 제한 옵션 : min_sample_split = 10
- max_depth를 통해서 최대 깊이를 지정max_depth = 4이면, 깊이가 4보다 크게 가지를 치지 않음
알고리즘: 엔트로피(Entropy), 불순도(Impurity)
불순도(Impurity)
- 해당 범주 안에 서로 다른 데이터가 얼마나 섞여 있는지를 뜻함
- 한 범주에 하나의 데이터만 있다면 불순도가 최소(혹은 순도가 최대)
- 한 범주 안에 서로 다른 두 데이터가 정확히 반반 있다면 불순도가 최대(혹은 순도가 최소)
- 결정 트리는 불순도를 최소화(혹은 순도를 최대화)하는 방향으로 학습을 진행
엔트로피(Entropy)
- 불순도(Impurity)를 수치적으로 나타낸 척도
- 엔트로피가 높다는 것은 불순도도 높다는 뜻
- 엔트로피가 1이면 불순도가 최대
- 한 범주 안에 데이터가 정확히 반반 있다는 뜻
엔트로피 공식 (Pi = 범주 i에 속한 데이터의 비율)
엔트로피 예제
- 경사, 표면, 속도 제한을 기준으로 속도가 느린지 빠른지 분류해놓은 표
- X 가 경사, 표면, 속도 제한
- Y 가 속도(라벨)
경사 | 표면 | 속도제한 | 속도 |
steep | bumpy | yes | slow |
steep | smooth | yes | slow |
flat | bumpy | no | fast |
steep | smooth | no | fast |
- 속도 라벨에는 slow, slow, fast, fast로 총 4개의 examples
- Pi는 범주 i에 속한 데이터의 비율
- i를 slow라고 했을 때, P_slow = 0.5 (2/4)
- P_fast도 0.5 (ff/ssff)
- 전체 엔트로피 : 0.5 + 0.5 = 1
정보 획득 (Information gain)
- 엔트로피가 1인 상태에서 0.7인 상태로 바뀌었다면 정보 획득(information gain)은 0.3
- 분기 이전의 엔트로피에서 분기 이후의 엔트로피를 뺀 수치가 바로 정보 획득량
- 결정 트리 알고리즘은 information gain을 최대화하는 방향으로 학습이 진행
- Information gain = entropy(parent) - [weighted average] entropy(children)
경사를 기준으로 첫 분기
{steep : ['slow', 'slow', 'fast'], flat: 'fast' }
- flat: 엔트로피 0 entropy(parent) = 1 entropy(flat) = 0 entropy(steep) = P_slow * log2(P_slow) - P_fast * log2(P_fast) entropy(steep) = - (2/3) * log2(2/3) - (1/3) * log2(1/3) entropy(steep) = 0.9184 [weighted average] entropy(children) = weighted average of steep * entropy(steep) + weighted average of flat * entropy(flat) entropy(children) = 3/4 * (0.9184) + 1/4 * (0) entropy(children) = 0.6888 # 최종 엔트로피 |
information gain = entropy(parent) - [weighted average] entropy(children) |
- 표면 기준 분기, 속도제한 기준 분기의 information gain 을 비교
- 가장 정보 획득이 많은 방향으로 학습 진행
랜덤 포레스트(Random Forest)
- 결정 트리 하나만으로도 머신러닝 가능
- 결정 트리의 단점은 훈련 데이터에 오버피팅이 되는 경향이 큼
- 여러 개의 결정 트리를 통해 랜덤 포레스트를 만들면 오버피팅 되는 단점을 해결
원리
건강의 위험도를 예측
- 건강의 위험도를 예측하기 위해서는 많은 요소를 고려
- 성별, 키, 몸무게, 지역, 운동량, 흡연유무, 음주 여부, 혈당, 근육량, 기초 대사량 등 수많은 요소가 필요
- Feature가 30개라 했을 때 30개의 Feature를 기반으로 하나의 결정 트리를 만든다면 트리의 가지가 많아질 것이고, 이는 오버피팅의 결과를 야기
- 30개의 Feature 중 랜덤으로 5개의 Feature만 선택해서 하나의 결정 트리 생성
- 계속 반복하여 여러 개의 결정 트리 생성
- 여러 결정 트리들이 내린 예측 값들 중 가장 많이 나온 값을 최종 예측값으로 지정
- 이렇게 의견을 통합하거나 여러 가지 결과를 합치는 방식을 앙상블(Ensemble)이라고 함
- 하나의 거대한 (깊이가 깊은) 결정 트리를 만드는 것이 아니라 여러 개의 작은 결정 트리를 만드는 것
- 분류 : 여러 개의 작은 결정 트리가 예측한 값들 중 가장 많은 값
- 회귀 : 평균값
파라미터
- n_estimators: 랜덤 포레스트 안의 결정 트리 갯수
- n_estimators는 클수록 좋지만 그만큼 메모리와 훈련 시간이 증가
- max_features: 무작위로 선택할 Feature의 개수, 일반적으로 Default
랜덤 포레스트 example
DataSet
- UCI 머신러닝 레포지토리에 공개된 독버섯 관련된 데이터
- https://archive.ics.uci.edu/ml/datasets/Mushroom
- 8,124종류의 버섯의 특징과 독이 있는지 적혀있는 데이터 세트
p,x,s,n,t,p,f,c,n,k,e,e,s,s,w,w,p,w,o,p,k,s,u |
- 한 줄이 버섯 한 종류
- 첫 번째 열 독 유무 p: poisionous, e: edible
- 두 번째 열 버섯 머리 모양 b:벨, c:원뿔, x:볼록, f:평평, k:혹, s:오목
- 네 버째 열 버섯의 머리 색 n:갈색, b:황갈색, c:연한갈색, g:회색, r:녹색, p:분홍색, u:보라색, e:붉은색, w:흰색, y:노란색
- 나머지는 필요시 UCI 사이트에서 확인