yooonicode
머신러닝, 딥러닝 - ch 5 본문
5-1 결정트리
- 로지스틱 회귀로 와인 분류
- head(), info(), describe()
- 학습 데이터, 테스트 데이터 만들기
- StandardScaler를 통해 데이터 안의 다양한 스케일들을 정리해주는 작업
- 사이킷런의 LogisticRegression 모델을 임포트하여 학습시킨 결과, 과소적합
- lr.coef_, lr.intercept_를 이용하여 모델을 설명하기에는 한계가 있음
🥞 결정 트리
- 트리 그림으로 출력하는 plot_tree()
- max_depth를 지정하여 얕은 트리 만들기
- 자식 노드, 부모 노드라고 부름 (책에서는 리프노드)
+ 리프노드에서 가장 많은 클래스가 예측 클래스가 됨 (k-최근접 이웃 알고리즘과 유사한 면 존재)
🥞 Gini index, information gain 정리해놓은 개인 노션 링크
https://yoonot.notion.site/6-decision-tree-053723a4beb245758d9b57a20381bb4f?pvs=4
6. decision tree
Regularization review
yoonot.notion.site
- data pruning, 가지치기
➡️ 가장 간단하게, depth 지정으로 할 수 있음(일반화에 도움을 줌)
+ 전처리된 학습 데이터로 학습시켰지만, 전처리 하지 않아도 되기에 타인에게 모델을 이해시켜야 할 경우에 효과적
5-2 교차 검증, 그리드 서치
테스트 세트를 사용하지 않고 과대적합, 과소적합을 측정하는 방법 - 검증세트 도입
- 학습 세트와 테스트 세트로 한번 쪼갠 이후, 학습세트 내부에서 한번 더 쪼갬
- DecisionTreeClassifier
- 과대적합되어있음
🥞 교차 검증
- 교차 검증을 이용하여 안정적인 검증 점수를 얻으며, 훈련에 더 많은 데이터를 사용할 수 있음
- 검증 세트를 떼어, 평가하는 과정을 여러 번 반복한 후 점수를 평균 내어 최종 검증 점수를 얻어냄
-> k-fold cross validation(보통 k=5, k=10을 주로 사용)
- cross_validate()는 훈련 세트를 섞어 폴드를 나누지 않음, 이미 이전에서 train_test_split으로 섞어놨기 때문에 할 필요가 없지만, 교차 검증 시 훈련 세트를 섞고 싶다면 분할기splitter를 사용해야함
- 사이킷런의 분할기는 폴드를 어떻게 나눌지 결정하는 역할을 함
+ 회귀 모델에서는 KFold 분할기, 분류모델일 경우 타깃 클래스를 골고루 나누려 StratifiedKFold를 사용함
🥞 하이퍼파라미터 튜닝
- 그리드 서치를 통해, 여러 매개변수를 바꿔가며 최적의 값을 찾을 수 있음
- 사이킷런의 GridSearchCV 클래스를 이용하여, 하이퍼파라미터 탐색 & 교차 검증을 동시에 수행할 수 있음
- GridSearchCV를 임포트, 탐색할 매개변수와 값을 딕셔너리로 생성함
- GridSearchCV 클래스에 모델과 params 변수를 전달하여 그리드 서치 객체 생성
- gs 객체에 fit() 메서드 호출, 이후 그리드 서치 객체는 min_impurity_decrease 값을 바꾸며 총 5번 실행하게 됨
+ cv 매개변수 기본값 5, min_impurity_decrease 값 한개마다 5-폴드 교차 검증 수행(총 25)
+ 많은 모델 수를 훈련하기 때문에 CPU 코어 수 지정, n_jobs 기본값 1이지만 -1로 지정하여 모든 코어 사용하게 함
- 최적의 하이퍼파라미터를 찾았으니, 전체 훈련 세트로 모델을 다시 만들어야 함
- best_estimator_에 저장되어 있으므로, 일반 결정트리처럼 사용함(0.0001이 제일 좋음)
- 교차검증에서의 점수를 출력하기 위해 mean_test_score키의 평균 점수 키를 이용함
- 첫번째 값이 가장 큼(argmax로도 이용 가능), 이후 검증 점수를 가장 높게 한 매개변수 출력
🥞 랜덤 서치
- 매개변수가 수치형일때, 범위나 간격 정하기 어렵거나, 조건이 많아 그리드 서치 시간이 오래걸린다면 사용
- 매개변수 값 목록의 전달이 아닌 매개변수를 샘플링할 수 있는 확률분포 객체를 전달함(scipy 이용)
- 균등분포에서 샘플링한다고 하며, 주어진 범위에서 고르게 값을 뽑음
- 1000개를 샘플링하여 각 숫자 개수를 세면 어느정도 유사한 것을 확인할 수 있음
- 이를 이용하여 탐색할 매개변수의 딕셔너리를 생성함
완성된 모델의 형태
- 관련 노트 필기 첨부
https://yoonot.notion.site/7-validation-evaluation-b077570e350e457f8b7799c1f6f1c63a?pvs=4
7. validation, evaluation
트레이닝, 테스트셋이 존재하나 테스트셋에서의 레이블이 없는 경우
yoonot.notion.site
5-3 트리의 앙상블
- 정형 데이터를 다루는 데 가장 뛰어남 ; 앙상블 학습
🥞 랜덤포레스트
- 안정적 성능, 결정 트리를 랜덤하게 만들어 결과를 만들고, 각 결정 트리의 예측을 사용해 최종 예측을 만듬
- 각 트리를 훈련하기 위한 데이터를 랜덤하게 생성, 1000개의 샘플 가방에서 100개를 뽑을 때 먼저 뽑고 다시 넣고 뽑고 넣고 해서 만들어진 샘플을 이용함 ; 부트스트랩 샘플(=훈련 세트의 크기)
+ 부트스트랩 = 데이터 세트에서 중복을 허용하여 데이터를 샘플링하는 방식
- 각 노드 분할 시 전체 특성 중 일부 특성을 무작위로 고른 후, 최선의 분할을 찾음
- RandomForestClassifier는 기본적으로 전체 특성 개수의 제곱근만큼의 특성을 선택함
- RandomForestRegressor는 회귀 모델, 전체 특성을 사용함
- 랜덤한 샘플, 특성을 사용하여 과적합을 막으며 검증, 테스트 세트에서 안정적인 성능을 보임
- 판다스로 데이터 셋 불러오고 훈련, 테스트셋 쪼개기
- cross_validate() 이용하여 교차검증 수행함, n_jobs=-1(병렬로 수행함), return_train_score 이용하여 훈련세트 점수도 같이 반환함(과대적합 파악시 용이)
- 두번째 블럭에서 확인할 수 있듯, 훈련 세트에 과대적합되어있음
- 랜덤 포레스트는 결정 트리의 앙상블로 DecisionTreeClassifier의 매개변수를 모두 제공함(criterion, max_depth/features, min_samples_split 등)
- 또한 특성 중요도를 계산함(랜덤 포레스트에서는 각 결정 트리의 특성 중요도를 취합함)
- [알콜도수, 당도, pH] 였는데, 앞선 결과와 달리 당도가 감소하고 나머지가 조금 상승(하나의 특성에 집중하지 않고 다른 특성들도 기여할 기회를 줌, 과대적합을 줄이며 일반화 성능을 높임)
- 부트스트랩 샘플에 포함되지 않는 남는 샘플을 OOB, outoflog 샘플이라 하는데 이를 평가하는데 사용할 수 있음(검증세트처럼)
- oob_score=True를 이용하여 출력했을 때, 교차 검증과 비슷한 결과를 얻을 수 있음
🥞 엑스트라 트리
랜덤 포레스트와 비슷하게 동작, 랜덤포레스트에서의 대부분의 매개변수를 지원함
기본적으로 100개의 결정트리 훈련
- 전체 특성 중, 일부 특성을 랜덤하게 선택하여 노드 분할에 사용함
- 랜덤 포레스트와 다른 점은 부트스트랩 샘플 사용 없이, 전체 훈련 세트를 사용함(각 결정트리 생성에)
- 대신, 노드의 분할을 무작위로 진행함
- DecisionTreeClassifier의 splitter = 'random'과도 같음
- 하나의 트리에서 무작위로 분할하면 성능 낮아지지만, 많은 트리를 앙상블하여 과대 적합을 막고 검증 세트의 점수를 높일 수 있음
- 비슷한 결과(특성 적어서)
- 엑스트라 트리가 좀 더 많이 훈련해야 하지만, 노드 분할이 무작위라서 계산속도가 빠름
- 특성 중요도를 제공하므로 당도에 대한 의존성이 작음을 확인할 수 있음
- ExtraTreesRegressor 클래스, 이의 회귀 버전
🥞 그레이디언트 부스팅
- 깊이가 얕은 결정 트리를 이용하여 이전 트리의 오차를 보완하는 방식으로 앙상블
- 기본적으로 깊이 3인 결정트리 100개 사용
- 과대 적합에 강하고 높은 일반화 성능
- 경사 하강법 사용, 가중치와 절편을 조금씩 바꾸는 형식
- 결정 트리를 계속 추가하며 가장 낮은 곳을 찾아 이동함
- 깊이가 얕은 트리를 이용하여 조금씩 이동하며, 학습률 매개변수로 속도 조절 가능
- 학습률 증가하고 트리 개수 늘리면 좀 더 성능 향상
- subsample = 1.0이 기본값, 1보다 작으면 훈련세트의 일부를 사용함(미니배치, 확률적 경사하강법과 유사)
- 일반적으로 그레이디언트 부스팅이 랜덤포레스트보다 조금 더 높은 성능
- 순서대로 트리 추가하여 훈련 속도가 느리다는 단점 -> n_jobs 없음
- GradientBoostingClassfier, GradientBoostingRegressor
🥞 히스토그램 기반 그레이디언트 부스팅
- 정형 데이터 머신러닝 알고리즘 중 가장 인기 많음
- 입력 특성을 256개 구간으로 나누어 노드 분할 시 최적의 분할을 빠르게 찾을 수 있음
- 256개 구간 중 하나를 떼어놓아 누락된 값을 위해 사용함(따라서 누락된 특성을 전처리할 필요 없음)
- HistGradientBoostingClassfier는 기본 매개변수에서 일반적으로 가장 안정적
- 트리의 개수를 지정하는 max_iter를 사용함
- 과대적합 억제, 그레이디언트 부스팅보다 성능 높음
- 특성 중요도 계산을 위해 permutation_importance() 함수를 사용
+ 특성 랜덤하게 섞어 모델의 성능이 어떻게 변하는지 관찰하는 역할
- n_repeats는 섞을 횟수 지정, 기본값 5
- 당도에 집중하고 있음을 알 수 있게끔 특성 중요도 계산하는 코드
- 테스트세트에서의 성능 확인
+ sklearn 이외에도 그레이디언트 부스팅 알고리즘을 구현한 라이브러리 XGBoost, LightGBM있음
'데이터분석' 카테고리의 다른 글
머신러닝, 딥러닝 - ch 4 (1) | 2023.11.03 |
---|---|
머신러닝 + 딥러닝 - ch 3-1, 3-2, 3-3 (0) | 2023.10.12 |
머신러닝 + 딥러닝 - ch 1-3, 2-1, 2-2 (1) | 2023.10.06 |
python 데이터 분석 ch 7-1, 7-2 (0) | 2023.09.30 |
python 데이터 분석 - ch 6 (0) | 2023.09.22 |