미션 : 교차 검증을 그림으로 설명하기 + Ch.05(05-3) 앙상블 모델 손코딩 코랩 화면 인증하기
서론
벌써 50%를 했다는게 믿기지 않는다. 시작은 정말 잘하는데 항상 끝까지 하는게 어려워서 흐지부지 끝내는 경우가 많았는데, 이번엔 혼공학습단과 함께해서 그런지 끝까지 할 수 있을 것 같다! 특히 이번 여름방학은 너무 바빠서 중간에 그만두지 않을까 걱정이 됐는데 매번 다르게 써주시는 족장님 코멘트도 궁금하고 간식도 궁금해서 계속 하게되는 것 같다.
아니 근데... 진짜 너무 힘들다... 휴학했는데 공모전 프로젝트 붙어서 평일 9 to 6으로 매일 교육 다니는게 말이 되냐고요... 왕복 4시간 거리인데... 휴학했는데... 하루종일 공부하고 집에오면 8시 넘고... 다른 공부 할 시간도 없어서 잠을 줄이고.... 그래도 복습할 시간 충분하지 않아서 주말 내내 복습하고... 휴학했는데..... 왜 공모전을 신청해서.... 너무 놀고싶다... 그래서 이번 4주차 끝나고 주어지는 1주일 방학이 너무 기다려진다. 사실 방학이 2주면 정말 좋겠다...더 찡얼거리고 싶었지만 그만 마치고 공부를 시작하자...
05. 트리 알고리즘
05-1. 결정 트리
이번엔 그 유명한 와인 분류 문제이다.
알코올 도수, 당도, pH 값으로 분류를 해야한다.
로지스틱 회귀
- 각각 알코올 도수, 당도, ph값
- class = 타깃값
-> 레드와인/화이트와인 이진 분류 문제, 화이트와인이 양성 클래스
- info() : 데이터프레임의 각 열의 데이터 타입, 누락된 값 확인
- describe() : 열에 대한 간략한 통계
- 여기서 알 수 있는 것 : 알코올 도수, 당도, pH 값의 스케일이 다르다
- train_test_split() : default = 25%, test_size 매개변수로 사이즈 조절 가능
전처리 했지만, 점수가 높지 않다.
훈련 세트, 테스트 세트 점수가 모두 낮음 => 과소적합
해결방법
- 규제 매개변수 C 값 변경
- solver 매개변수에서 알고리즘 변경
- 다항 특성 추가
설명하기 쉬운 모델과 어려운 모델
계수 값만으로는 이해하기 어렵다. 이때 사용하는 것이 결정 트리 이다.
결정트리 (Decision Tree)
- 스무고개처럼 질문을 하고 정답을 맞춰나가는 과정
- DecisionTreeClassifier 사용 가능
훈련 세트의 점수는 매우 높다. 테스트 세트의 점수는 훈련세트에 비해 너무 낮다.
=> 과대적합
- 루트 노드 : 맨 위의 노드
- 리프 노드 : 맨 아래에 달린 노드
- max_depth=1 : 루트 노드를 제외하고 하나의 노드를 더 확장
- field : 노드 색 칠하기
- feature_names : 특성의 이름 전달
- 왼쪽이 yes, 오른쪽이 no
- samples 는 총 샘플 수
- 질문에 의해 나뉜 값은 value에
불순도
gini: 지니 불순도
- DecisionTreeClassifier 클래스의 criterion 매개변수의 default = "gini"
- 노드에서 데이터를 분할할 기준을 정하는 것
- 순수 노드의 지니불순도 = 0
- 최악 = 0.5
지니불순도=1−(음성클래스비율2+양성클래스비율2)
결론 : 결정 트리는 부모노드와 자식노드의 불순도 차이가 가장 크도록 트리를 성장
부모의불순도−(왼쪽노드샘플수/부모의샘플수)×왼쪽노드불순도−(오른쪽노드샘플수/부모의샘플수)×오른쪽노드불순도
-> 부모 노드와 자식 노드의 불순도 차이 = 정보 이득
entropy : 엔트로피 불순도
- 지니 불순도와 마찬가지로 노드의 클래스 비율 사용
엔트로피불순도=−음성클래스비율×log2(음성클래스비율)−양성클래스비율×log2(양성클래스비율)
가지치기
- 가장 간단한 방법 = 최대 깊이를 지정하는 것
참고 🧐 : depth 는 0부터 시작. max_depth = 3으로 지정했으면 루트노드(depth=0)부터 시작해서 아래로 4줄이 나타난다.
- 샘플을 클래스 비율로 계산하여 나눌 때 특성값의 스케일은 영향을 미치지 않는다.
-> 전처리가 필요 없다.
- feature_importances_ : 특성 중요도
- 두 번째 특성인 당도가 0.87 정도로 중요도가 가장 높다.
min_impurity_decrease를 사용했더니 성능이 더 좋아졌다. 좌우가 균일하지 않은 트리가 만들어졌지만, 대부분의 리프노드에서 음성클래스(레드와인)와 양성클래스(화이트와인)를 분류하고 있다.
05-2. 교차 검증과 그리드 서치
문제 : 일반화 성능 올바르게 예측하려면 가능한 한 테스트 세트를 사용하지 말아야 한다. 그러면 하이퍼파라미터 튜닝을 어떻게 해야할까?
검증 세트
과대적합 되었다.
교차 검증
- cross validation : 검증 세트를 떼어내어 평가하는 과정을 여러번 반복
- 이 점수를 평균하여 최종 검증 점수를 얻는다.
3-폴드 교차 검증
훈련 세트를 세 부분으로 나누어 교차 검증을 수행하는 것.
통칭적으로 k-폴드 교차 검증이라고도 한다.
- cross_validate() : 교차 검증 함수. fit_time, score_time, test_score 키를 가진 딕셔너리 반환
- fit_time : 모델 훈련하는 시간
- score_time : 모델 검증하는 시간
- test_score : 점수를 평균한 것
- cross_validate()에서 훈련세트 섞으려면 분할기(splitter) 필요
- 회귀모델 -> KFold 분할기 사용
- 분류모델 -> StratifiedKFold 사용
- k-폴드 교차 검증에서 k값을 지정하려면 -> n_split 매개변수 사용
하이퍼파라미터 튜닝
- 머신러닝 모델이 학습하는 파라미터 = 모델 파라미터
- 모델이 학습할 수 없어서 사용자가 지정해야만 하는 파라미터 = 하이퍼파라미터
- GridSearchCV : 하이퍼파라미터 탐색과 교차 검증 한번에 수행
- cross_validate() 필요 없음
- 탐색할 매개변수, 값의 리스트를 딕셔너리로 전달
- cv 매개변수 : default = 5 -> 5-폴드 교차 검증 수행
- n_jobs : 병렬 실행에 사용할 CPU 코어 수를 지정. default = 1, -1로 지정하면 시스템에 있는 모든 코어 사용
- best_estimator_ : 검증 점수 가장 높은 모델의 매개변수 조합으로 전체 훈련 세트에서 자동으로 다시 모델 훈련
- best_params_ : 서치로 찾은 최적의 매개변수 저장
- cv_results_ 속성의 'mean_test_score' : 각 매개변수에서 수행한 교차 검증의 평균 점수 저장
- argmax() : 가장 큰 값의 인덱스 추출
정리
1. 탐색할 매개변수 지정
2. 훈련세트에서 그리드 서치 수행 -> 최상의 평균 검증 점수 나오는 매개변수 조합 찾기
3. 그리드 서치는 최상의 매개변수에서 전체 훈련 세트를 사용해 최종 모델에 훈련
탐색할 매개변수의 값 늘리기
랜덤 서치
- randint : 정수값 / uniform : 실수값
05-3. 트리의 앙상블
대체로 성능이 좋은 알고리즘 ? 랜덤 포레스트
정형 데이터 vs 비정형 데이터
- 정형 데이터 : 구조로 되어 있는 데이터, ex) CSV
- 비정형 데이터 : ex) 텍스트, 사진, 음악 등
랜덤 포레스트
-
랜덤 포레스트(Random Forest) : 앙상블 학습의 대표 주자 중 하나. 결정 트리를 랜덤하게 만들어 결정 트리(나무)를 만들고, 각 결정 트리의 예측을 사용해 최종 예측을 만든다.
-
데이터를 랜덤 생성 : 훈련 데이터에서 랜덤하게 추출하여 데이터를 생성. 중복 가능.
-> 부트스트랩 샘플
-
-
노드 분할 : 일부 특성을 무작위로 고른 후 최선의 분할을 찾음.
- RandomForestClassifier는 전체 특성 개수의 제곱근만큼의 특성 선택
- RandomForestRegressor는 전체 특성 사용
-
-
과대적합 방지함
부트스트랩이란?
데이터 세트에서 중복을 허용하여 데이터를 샘플링하는 방식. 부트스트랩 샘플이란 결국 부트스트랩 방식으로 샘플링하여 분류한 데이터라는 의미.
- RandomFrestClassifier : default 100개의 결정 트리 사용
- return_train_score = True : 검증 점수 + 훈련 점수 같이 반환
-> 과소 적합된 것 같다.
랜덤 포레스트의 매개변수
결정 트리의 앙상블이기 때문에 DecisionTreeClassifier가 제공하는 중요한 매개변수 모두 제공
criterion, max_depth, max_features, min_samples_spit, min_impurity_decrease, min_samples_leaf 등 + 특성 중요도 계산
05-2에서 만든 결정 트리의 특성 중요도와 비교하면, 당도의 중요도가 감소하고 나머지 특성의 중요도가 상승했다.
OOB샘플 : 부트스트랩 샘플에 포함되지 않고 남는 샘플.
이 샘플을 사용하여 부트스트랩 샘플로 훈련한 결정 트리를 평가 가능. 검증 세트의 역할
- ood_score = True 로 지정해야 한다.
엑스트라 트리
- 기본적으로 100개의 결정트리 훈련
- 부트스트랩 샘플을 사용하지 않음.
- 노드 무작위 분할 -> 빠른 계산 속도 장점
- 특성 무작위 분할하지만 많은 트리 앙상블 해서 과대적합 막고 점수 높임
- ExtraTreesClassifier
- 랜덤 포레스트보다 무작위성이 더 크다. -> 더 많은 결정트리 훈련해야.
- 엑스트라 트리의 회귀 버전 = ExtraTreeRegressor
그레이디언트 부스팅
그레이디언트 부스팅(gradient boosting) : 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식으로 앙상블 하는 방법
- 경사 하강법을 사용하여 트리를 앙상블에 추가
- 분류에서는 로지스틱 손실 함수 사용
- 회귀에서는 평균 제곱 오차 함수 사용
- 순서대로 트리를 추가하기 때문에 훈련 속도가 느림.
- n_estimators : 결정 트리 개수
- learning_rate : default = 0.1
subsample 매개변수
트리 훈련에 사용할 훈련 세트의 비율을 정함. default = 1.0 -> 전체 훈련 세트 사용
1보다 작으면 훈련 세트의 일부를 사용
히스토그램 기반 그레이디언트 부스팅
히스토그램 기반 그레이디언트 부스팅(Histogram-based Gradient Boosting)
- 정형 데이터를 다루는 머신러닝 알고리즘 중 가장 인기가 높은 알고리즘이다
- 입력 특성을 256개 구간으로 나눈다. -> 최적의 노드 분할을 매우 빠르게 찾을 수 있다.
- 입력에 누락된 특성이 있어도 전처리할 필요가 없다.
- permutation_importance() : 특성을 하나씩 랜덤하게 섞어 성능이 변화하는지 관찰하여 어떤 특성이 중요한지를 계산
- 특성 중요도(importances), 평균(importances_mean), 표준편차(importances_std)를 담고 있다.
- n_repeats : 랜덤하게 섞을 횟수 지정
- XGBoost : 다양한 부스팅 알고리즘 지원
- tree_method='hist' : 히스토그램 기반 그레이디언트 부스팅 사용 가능
- LightGBM^2 : 히스토그램 기반 그레이디언트 부스팅 라이브러리
정리
앙상블 학습
더 좋은 예측 결과를 만들기 위해 여러 개의 모델을 훈련하는 머신러닝 알고리즘
1. 랜덤 포레스트
대표적인 결정 트리 기반의 앙상블 학습 방법. 부트스트랩 샘플을 사용하고 랜덤하게 일부 특성을 선택하여 트리를 만드는 것이 특징
2. 엑스트라 트리
랜덤 포레스트와 비슷하게 결정 트리를 사용하여 앙상블 모델을 만들지만, 부트스트랩 샘플을 사용하지 않는다.
대신 랜덤하게 노드를 분할해 과대적합을 감소시킨다.
3. 그레이디언트 부스팅
결정 트리를 연속적으로 추가하여 손실 함수를 최소화하는 앙상블 방법
훈련 속도가 조금 느리지만 더 좋은 성능을 기대할 수 있다.
4. 히스토그램 기반 그레이디언트 부스팅
그레이디언트 부스팅의 속도를 개선한 것. 안정적인 결과와 높은 성능으로 인기가 높다.