이번 장도 정말 길었다.. 점점 길어지는 느낌..그래도 절반 왔네.
로지스틱 회귀로 와인 분류
- 로지스틱 회귀의 문제 : 모델이 학습한 결과를 사람에게 설명하기 어렵다..
- 0.51 : 도수에 곱하세요
- 1.67 : 당도에 곱하세요
- -0.68 : pH에 곱하세요
- 1.81 : 그리고 더하세요
- 결과가 0보다 크면 화이트와인일 겁니다(약 77%로?)
결정 트리
- 로지스틱 회귀는..모델이 왜 저런지 설명이 어렵다.
- 결정 트리(Decision Tree) 모델은 설명하기 쉽다. + 특성 선택에도 쓸 수 있다 + 스케일 안해도 된다 + 앙상블 학습의 기반이 된다.
- 질문을 하나씩 던져서 예/아니오를 계속 하는 형식
- 모델은 어떤 질문을 해야 정확도가 높은지를 학습
- 예측
- (분류)질문을 따라 리프까지 왔을 때..그 노드에 많이 있는 클래스로 예측함.
- (회귀) 리프 노드에 도달한 샘플의 타깃을 평균하여 예측값으로 사용.
- 분류 – sklearn.DecisionTreeClassifier 클래스
- 회귀 – sklearn.DecisionTreeRegressor 클래스
- 트리를 출력할 수 있다.
- 노드로 구성됨. 루트 ~ 리프
- 왼쪽이 Yes, 오른쪽이 No 일때 이동하는 곳..
- value = 타겟의 수(음성 클래스, 양성 클래스)
- 노드의 배경 색에 의미가 있다!! 특정 클래스 비율이 높아질수록 진해짐.
- 여기서 학습을 종료하면.. → 모두 양성 클래스로 예측함(리프 노드 둘다 양성 클래스가 많게 분류됨)
- gini(지니 불순도, Gini impurity)
- criterion(default=gini) 데이터 분할 기준을 정해줌
- $지니 불순도 = 1 – (음성 클래스 비율^2 + 양성 클래스 비율^2)$
- 참고 : https://towardsdatascience.com/gini-impurity-measure-dbd3878ead33
- 값이 0.5면 불순도가 가장 높은 것 = 분류에 도움이 안됨..
- 값이 0에 가까우면 분류를 잘 해주는 것. 0 이면 한쪽 클래스만 있는 거니까 최고. (aka 순수 노드)
- 결정 트리 모델은 부모 노드와 자식 노드의 불순도 차이가 크도록 트리를 성장 시킨다.
- 불순도의 차이 = $부모의 불순도 – (왼쪽 노드 샘플 수 / 부모 샘플 수)\times왼쪽 노드 불순도 – (오른쪽 노드 샘플 수 / 부모 샘플 수)\times오른쪽 노드 불순도$
- 정보 이득(information gain) 이라고도..
- entropy 불순도 도 있다..
- 가지치기(pruning)
- DT를 제한 없이 자라게 만들면..훈련 세트에 과대적합 되기 쉽다.
- 적당히 일반화 해야함. → 가지치기
- 쉬운 방법 = 자랄 수 있는 최대 깊이(max_depth)를 지정
- 다른 방법 : 불순도 분할 기준(min_impurity_decrease)
- 결정 트리는 특성의 스케일 차이가 영향을 미치지 않는다. 따라서 정규화 안해도 됨.
- 특성 중요도 : 어떤 특성이 중요한지 알 수 있다. 이걸로 모델을 단순화(특성 가지치기?) 하는데 활용..
교차 검증과 그리드 서치
- 훈련 세트, 테스트 세트 -> 훈련 세트, 검증 세트, 테스트 세트
- 테스트 세트로만 평가하다 보면..테스트 세트에 과대적합 되는거 아닐까?
- 가능한 한 테스트 세트를 사용하지 말자. 마지막에 한 번만 사용하자
- 보통 20~30% 정도를 테스트, 검증 세트로 사용. 케바케. 훈련 데이터가 엄청 많다면 조금만 써도 된다. 대표성이 더 중요..
- 훈련 세트로 훈련, 검증 세트로 평가, 매개변수를 바꿔가며 좋은 모델을 고른다.. → 훈련 + 검증 세트로 다시 훈련 → 마지막으로 테스트 세트로 최종 점수 평가. .. 실전에서도 비슷한 성능을 기대할 수 있겠지?
교차 검증
- 많은 데이터를 훈련에 사용할수록 좋은 모델..
- 검증 세트를 나누느라 데이터 줄어듬 → 훈련 세트 전체를 부분으로 나누고 돌아가면서 훈련과 검증을 거침 → 그 중 가장 괜찮은 애로 전체 학습.
필수 과
- 교차 검증을 그림으로 설명하기
- n 개로 나눴니? n-Fold Cross Validation → n번 학습, 평가
- 보통 5~10 폴드 사용
- sklearn.cross_validate()
- cv(폴드) 수 만큼 나눠서 돌려가며 학습을 실행하고
- 학습/평가에 걸린 시간과 점수를 반환
- 최종 점수 = 점수 평균
- 나누는 방법을 지정 splitter(분할기)
- 훈련 세트를 잘 섞어놔야 분할했을 때 제대로 학습할 수 있다. 아님 나누기 전에 미리 섞어놓던지
- StratifiedKFold
- 참고 : k-겹 교차 검증
하이퍼파라미터 튜닝
- 하이퍼파라미터는 보통 모델 클래스 생성자의 인자로 있다.
- 보통은..
- 하이퍼파라미터 기본값을 사용해 훈련
- 바꿔가며..검증 세트로 평가 또는 교차 검증으로 평가
- 최적값 발견
- 이걸 자동으로 해주는거 : AutoML
- 여러 매개변수를 동시에 바꿔가며 최적의 값을 찾아야
- 그리드 서치(Grid Search)
- GridSearchCV : 하이퍼파라미터 탐색과 교차 검증을 함께
- 하이퍼파라미터는 dictionary 로 특성 이름, 값의 범위(list, range, ..)를 입력
- 특성과 **입력값(하이퍼파라미터)**을 정해 준다
- GridSearchCV : 하이퍼파라미터 탐색과 교차 검증을 함께
- 결과는 best_estimator_에.. 전체 훈련 세트로 다시 훈련시킨 모델임.
- best_params_ : 선택된 최적 하이퍼파라미터 값
- 랜덤 서치(Random Search)
- 특성과 확률 분포 객체를 정해 준다
- 확률 분포 객체 : SciPy에 있다..여기만 있나?
- randint, uniform
- RandomizedSearchCV
트리의 앙상블
- 정형(Structured), 비정형 데이터(Un-)
- 정형 데이터 에서 아주 좋은 알고리즘 → 앙상블 학습(ensemble)
- 대부분 트리 기반으로..
- 비정형은 신경망이 대세
랜덤 포레스트
- 결정 트리를 랜덤하게 만들어 .. 결정 트리의 숲을 만든다
- 각 결정 트리의 예측을 사용해 최종 예측?
- 데이터 추출
- 랜덤하게 샘플 추출, 중복 허용 → 부트스트랩 샘플 → 보통 훈련 세트 크기와 같게 만든다.
- 노드 분할
- 전체 특성 중 일부 특성을 랜덤하게 골라서..그 중 최선의 분할을 찾는다
- 분류 RandomForestClassifier는 전체 특성 갯수의 제곱근 만큼의 특성을 선택
- 회귀 RandomForestRegressor는 전체 특성 사용
- 예측
- 분류 : 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스로..
- 회귀 : 각 트리의 예측을 평균
- 특징
- 과대적합되기 어려움(랜덤한 샘플과 특성 사용)
- 특성 중요도가 골고루 배분됨(모든 특성을 한번에 다루는게 아니니까)
- oob_score : 자체적으로 모델을 평가하는 점수
- RandomForestClassifier(oob_score=True, ..)
- Out of Bag 샘플 : 훈련 세트 – 부트스트랩 샘플, 남는 애들
- 검증 세트와 비슷한 역할, 각 트리의 OOB 점수를 평균함.
엑스트라 트리
- 랜덤 포레스트와 비슷
- 차이
- 전체 훈련 세트를 사용(부트스트랩 샘플을 사용하지 않는다)
- 노드를 분할할 때 무작위로 한다?!
- 결정 트리에 splitter=’random’으로 한 트리들
- aka Extremely Randomized Trees
- 보통 랜덤 포레스트보다 더 많은 트리를 학습시켜야 하지만..노드 분할을 랜덤으로 해서 빠름!
- 분류 : ExtraTreesClassifier
- 회귀 : ExtraTreesRegressor
그레이디언트 부스팅
- Gradient boosting
- 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블..??
- GradientBoostingClassifier
- default max_depth = 3, n_estimators= 100
- 경사하강법을 사용하여 트리를 앙상블에 추가
- 분류 : 로지스틱 손실 함수 사용
- 회귀 : 평균 제곱 오차 함수 사용 MSE
- 트리의 수 = epoch 로 볼 수 있는건가?
- param : learning_rate, ..
- subsample : 훈련에 사용할 데이터 비율, 1.0(전체) 기본값. 1 미만으로 쓰면 확률적 경사 미니배치 경사하강법과 유사해짐..
- 특징
- 과대적합에 매우 강함.
- 순서대로(serial) 해야 되어서 훈련 속도가 느림..
히스토그램 기반 부스팅
- Histogram-based Gradient Boosting
- ❓ 부스팅이란 무엇인가
- 정형 데이터 안에서 인기 짱 알고리즘 이라고..
- 입력 특성을 256개의 구간으로 나눔?
- 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수.. 왜지
- 특징
- 누락 특성 있어도 전처리 생략할 수 있음(256개 중 일부를 누락 값 채우는 용도로 사용)
- HistGradientBoostingClassifier
- max_iter : 부스팅 반복 횟수
- permutation_importance
- 특성을 랜덤하게 섞어서 모델의 성능이 변화하는지 관찰하여 특성의 중요도를 계산
그 외의 히스토그램 기반 그레이디언트 부스팅 구현체
- XGBoost : 캐글에서 짱먹은 라이브러리 https://xgboost.ai/
- LightGBM : MS