Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

yooonicode

머신러닝, 딥러닝 - ch 5 본문

데이터분석

머신러닝, 딥러닝 - ch 5

yooonii 2023. 11. 11. 23:41

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 지정으로 할 수 있음(일반화에 도움을 줌)

+ 전처리된 학습 데이터로 학습시켰지만, 전처리 하지 않아도 되기에 타인에게 모델을 이해시켜야 할 경우에 효과적

전처리한 데이터로 학습시킨 결과
물론 그냥 학습해도 결과는 같음
이를 통해서 sugar가 가장 중요한 특성임을 알 수 있음

 

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있음