[혼공학습단10기] 혼자 공부하는 머신러닝+딥러닝 4주차 Ch_5 트리알고리즘
05-1 결정트리 ( Decision Tree )
로지스틱 회귀
- 설명하기 어렵다.
- 모델이 왜 저런 계수값으로 학습했는지 정확히 알 수가 없다.
결정트리
- 질문을 하나씩 던져서 정답과 맞춰간다. -> 스무고개와 같다.
- 데이터를 잘 나눌 수 있는 질문을 찾으면 분류 정확도를 높일 수 있다.
노드
- 결정 트리를 구성하는 핵심 요소
- 훈련 데이터의 특성에 대한 테스트를 표현
- 가지(Branch)는 테스트의 결과 (True, False )를 나타낸다.
- 일반적으로 하나의 노드는 2개의 가지를 가진다.
-> 루트 노드( root node ) : 맨위의 노드
-> 리프 노드( leaf node ) : 맨 아래 끝에 달린 노드
노드 해석
- 테스트 조건
- 분순도
- 총 샘플 수
- 클래스별 샘플 수
- root node
-> sugar가 -0.239이하인지 질문
-> -0.239이하이면 왼쪽(Yes) branch, 초과면 오른쪽(No) branch
-> 루트 노드의 총 샘플 수 = 5197
-> 음성 클래스(레드 와인) 수 = 1258개, 양성 클래스(화이트 와인)수 = 3939개
리프 노드에서 가장 많은 클래스가 예측 클래스가 된다.
위의 결정 트리가 성장을 여기서 멈춘다면 왼쪽 노드에 도달한 샘플과 오른쪽 노드에 도달한 샘플 모두 양성 클래스로 예측된다.
불순도
- gini -> gini impurity
- DecisionTreeClassifier 클래스의 criterion 매개변수의 기본값이 'gini'
- criterion : 노드에서 데이터를 분할할 기준을 정한다.
- 지니 불순도 계산
-> 지니 불순도 = 1 - (음성 클래스 비율^2 + 양성 클래스 비율^2)
-> 어떤 노드의 두 클래스의 비율이 정확히 1/2
-> 지니 불순도 = 0.5 : 최악의 경우, 분류가 안된다.
-> 어떤 노드에 하나의 클래스만 있다면
-> 지니 불순도 = 0 : 순수 노드
정보이득
- 부모 노드와 자식 노드의 불순도 차이
- 정보이득이 가능한 크도록 트리를 성장
- 계산 방법
1. 자식 노드의 불순도를 샘플 개수에 비례하여 모두 더한다.
2. 부모 노드의 불순도에서 뺀다.
-> 부모의 불순도
- (왼쪽 노드 샘플 수 / 부모의 샘플 수 ) x 왼쪽 노드 불순도
- (오른쪽 노드 샘플 수 / 부모의 샘플 수) x 오른쪽 노드 불순도
가지치기
- 무작정 끝까지 성장한 트리
-> 훈련 세트에는 잘 맞지만 테스트 세트에서는 잘 안 맞는다.
-> 일반화가 잘 안된다.
- 트리의 최대 깊이를 지정
-> max_depth = 3
-> 훈련 세트의 성능은 낮아졌지만 테스트 세트의 성능은 거의 그대로
결정트리 전처리
- 결정트리는 정보이득이 가장 크도록 불순도를 기준으로 샘플을 나눈다.
- 불순도는 클래스별 비율을 사용하여 계산한다.
- 클래스별 비율을 계산할 때 특성값의 스케일은 계산에 영향을 미치지 않는다.
- 따라서 전처리가 필요가 없다.
-> 설명하기 쉽다.
- 전처리 후 디시젼트리와 결과가 같다.
05-2 교차 검증과 그리드 서치
테스트 세트로 일반화 성능을 올바르게 예측하려면 가능한 한 테스트 세트를 사용하지 말아야 한다.
검증 세트
- Validation set
- 훈련 세트를 또 나눈 데이터
- 5197개의 데이터
-> 훈련 세트 : 4157개
-> 검증 세트 : 1040개
- 검증 세트를 사용해서 평가
교차 검증
- 검증 세트로 인해 데이터 수가 많이 줄어 훈련에 사용하는 데이터 갯수가 줄어들었다.
- 검증 세트 갯수가 적으면 검증 점수가 불안정해진다.
- 교차 검증
: 검증 세트를 떼어 내어평가하는 과정을 여러번 반복하여 점수를 평균하여 최종 검증 점수를 얻는다.
분할기
- splitter
- 교차 검증시 훈련 세트를 섞는 방법
- StratifiedKFold : 타깃 클래스를 골고루 나눈다.
하이퍼파라미터 튜닝
- 하이퍼파라미터 : 모델이 학습할 수 없어서 사용자가 지정해야만하는 파라미터
- 검증 세트의 점수나 교차 검증을 통해서 매개변수를 바꿔가며 모델을 후련하고 교차 검증을 수행
- 매개변수가 많아지면 복잡해진다.
그리드 서치
- Grid Search
- 사이킷런의 GridSearchCV 클래스
- 하이퍼파라미터 탐색과 교차 검증을 한 번에 수행
- 과정
1. 탐색할 매개변수 지정
2. 훈련 세트에서 그리드 서치를 수행하여 최상의 평균 검증 점수가 나오는 매개변수 조합을 찾은 후 그리드 서치 객체에 저장
3. 2에서 얻은 최상의 매개변수에서 전체 훈련 세트를 사용해서 최종 모델을 훈련하고 그리드 서치 객체에 저장
- 매개변수 3개의 grid search
랜던 서치
- 매개변수 값의 목록을 전달하는 것이 아니라 매개변수를 샘플링할 수 있는 학률 분포를 객체에 전달.
- 매개변수의 갯수가 많거나 매개변수의 값의 범쉬나 간격을 미리 정하기 어려울 경우 사용
- 싸이파이의 확률 분포 클래스 사용
-> scipy : 파이썬의 핵심 과학 라이브러리 중 하나로, 수치 계산 전용 라이브러리
-> uniform : 균등 분포에서 샘플링, 실숫값을 뽑는다.
-> randint : 균등 분포에서 샘플링, 정숫값을 뽑는다.
05-3 트리의 앙상블
정형 데이터
- 어떤 구조로 되어 있는 데이터
- csv, database, excel...
비정형 데이터
- 데이터베이스나 엑셀로 표현하기 어려운 데이터
- 텍스트 데이터, 사진, 음악...
랜덤포레스트
- 앙상블 학습으로 안정적인 성능으로 널리 사용돼ㅣㄴ다.
- 결정 트리를 핸덤하게 만들어 결정 트리(나무)의 숲을 만든 후
각 결정 트리의 예측을 사용해 최종 예측을 만든다.
1. 각 트리를 훈련하기 위해서 훈련 데이터에서 랜덤하게 샘플을 추출한다.
- 부트스트랩 샘플 ( bootstrap sample )
-> 샘플이 중복되어 추출
-> ex) 1000개의 샘플이 들어 있는 가방에서100개의 샘플을 뽑을 때,
1개의 샘플을 뽑고, 다시 가방에 넣는 과정을 반봅하여 샘플을 추출
2. 노드 분할할 때 전체 특성 중에서 일부 특성을 무작위로 고른 다음 이 중에서 최선을 찾는다.
- RandomForestClassifier는 전체 특성 개수의 제곱근만큼의 특성을 선택
- RandomForestRegressor는 전체 특성을 사용.
3. 사이킷런의 RandomForestClassifier는 기본적으로 100개의 결정 트리를 이런 방식으로 훈련한다.
- 분류일 때는 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스를 예측으로 한다.
- 회귀일 때는 각 트리의 예측을 평균한다.
- 랜덤하게 선택한 샘플과 특성을 사용하기 때문에 훈련 세트에 과대적합을 막는다.
- OOB( out of bag )
- 부트스트랩 샘플에 포함되지 않고 남는 샘플
- 이 남는 샘플을 사용하여 부트스트랩 샘플로 훈련한 결정 트리를 평가할 수 있습니다.
엑스트라 트리
- 랜덤 포레스트와 비슷하게 동작
- 차이점
: 부트스트랩 샘플 사용하지 않고, 전체 훈련 세트를 사용.
: 노드를 분할할 때 가장 좋은 분할을 찾는 것이 아니라 무작위로 분할
-> 엑스트라 트리가 사용하는 결정 트리는 DecisionTreeClassifer에서 splitter='random'인 트리
- 하나의 결정 트리에서 특성을 무작위로 분할한다면 성능이 낮아지지만
- 많은 트리를 앙상블 하기때문에 과대적합을 막고 검증 세트의 점수를 높이는 효과가 있다.
그래이디언트 부스팅 (gradient boosting)
- 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 한다.
- 깊이가 얕은 결정 트리를 사용하기 때문에 과대적합에 강하고 일반적으로 높은 일반화 성능을 기대
- 경사 하강법을 사용하여 트리를 앙상블에 추가.
-> 분류에서는 로지스틱 손실 함수를 사용
-> 회귀에서는 평균 제곱 오차 함수를 사용
- 결정 트리를 계속 추가하면서 가장 낮은 곳을 찾아 이동.
- 손실 함수의 낮은 곳으로 천천히 조금씩 이동해야 하기 때문에 깊이가 얕은 트리를 사용.
- 학습률 매개변수로 속도를 조절.
- 과대적합에 강하다.
- subsample
- 기본값은 1.0으로 전체 훈련 세트를 사용
- 1보다 작으면 훈련 세트의 일부를 사용
-> 확률적 경사하강법, 미니배치 경사 하강법과 비슷
히스토그램 기반 그래이디언트 부스팅(Histogram-based Gradient Boosting)
- 입력특성을 256개 구간으로 나눈다. -> 노드를 분할할 때 최적의 분할을 빠르게 찾을 수 있다.
- 256개의 구간 중에서 하나를 떼어 놓고 누락된 값을 위해서 사용. -> 입력에 누락된 특성이 있더라도 전처리 필요 없음.
XGBoost
LightGBM
정리
1. 랜덤 포레스트
1) 성능이 좋고 안정적
2) 부트스트랩 샘픔을 만든다.
3) 전체 특성 중 일부를 랜덤하게 선택하여 결정 트리를 만든다.
2. 엑스트라 트리
1) 랜덤 포레스트와 유가
2) 전체 샘플을 사용
3) 노드 분할시 최선이 아닌 랜덤하게 분할
4) 속도가 빠르지만 많은 트리가 필요
3. 그레이디언트 부스팅
1) 깊이가 얕은 트리를 연속적으로 추가하여 손실함수를 최소화하는 앙상블 방법
2) 성능은 뛰어나지만 병렬로 훈련이 불가 -> 훈련 속도가 느리다.
3) 학습률 매개변수를 조정하여 모델의 복잡도를 제어
4) 학습률이 크면 훈련 세트에 과대적합된 모델을 얻을 수 있다.
4. 히스토그램 기반 그레이디언트 부스팅
1) 훈련 데이터를 256개 구간으로 변환하여 사용 -> 노드 분할 속도가 매우 빠르다.
2) XGBoost, LightGBM
기본미션
교차 검증을 그림으로 설명하기