Pudding

말랑말랑말랑 곰도리 푸딩 한 입에 먹기 챌린지

Machine Learning

[혼공머신] 4주차_결정 트리 / 교차 검증 / 앙상블 기법

sse 2025. 2. 9. 23:54
4주차

Ch. 05 트리 알고리즘
     ㄴ 05-1 결정 트리
     ㄴ 05-2 교차 검증과 그리드 서치
     ㄴ 05-3 트리의 앙상블

05-1 결정 트리

info() : 데이터프레임의 각 열의 데이터 타입과 누락된 데이터 확인
describe() : 열에 대한 평균, 표준편차, 최소, 최대, 중간값, 1사분위수, 3사분위수 출력

 

이번에 쓸 데이터를 예시로 보면. 이러합니다 하하

 

데이터 준비는 간단히 보면~~

캐글의 red wine quality 데이터셋의 일부를 사용하규.

데이터 - alcohol, sugar, pH  /  타깃 - class 이렇게 설정.

훈련/테스트셋 비율8:2로 설정하고 StandardScaler로 표준화까지 잇겟네여.

그리고 로지스틱회귀에 학습시키고 정확도 확인 & 계수 확인까지 햇습니당

근데 모델이 이상하게 바보인 사건..

너 학습하라니까 머한거야!!

다음으로 결정 트리를 사용해서 학습시켰다.

이번엔 과대적합... ㅡㅡ

결정 트리는 plot_tree()를 활용해서 그림으로 출력할 수 있다고 한다.

대박 싱기 ㅋ

특성 정보를 더 자세히 볼 수도 있다.

✅테스트 조건(sugar)
✅불순도(gini)
✅총 샘플 수(samples)
✅클래스별 샘플 수(value)

 

여기서 지니 불순도는 데이터를 분할할 기준을 정해주는 역할을 한다. 

위에서는 -0.239를 결정해주었다고 볼 수 있다.

결정 트리에서 예측하는 방법은 리프 노드에서 가장 많은 클래스가 예측 클래스가 된다고 한당.

 

결정 트리는 가지치기를 할 수가 있는데,

✅트리의 최대 깊이 지정 : max_depth 지정

 

이것을 활용할 수 있다.

가지치기를 했을 때 더욱 이해하기 쉬워진다.

결정 트리 알고리즘은 표준화 전처리를 할 필요가 없다는 장점도 있다.

05-2 교차 검증과 그리드 서치

검증 세트는 모델이 과대적합인지 과소적합인지 판단하기 위해 사용한다.

이전에 데이터를 준비하면서 훈련 / 검증 / 테스트로 나눈 적이 있었는데

드디어 무슨 역할을 하는지 알게 되었다.

생각보다 중요한 친구인 듯.

 

기본 과제 : 교차 검증을 그림으로 설명하기

3-폴드 교차 검증

슬라이드로 그렸더니 화질이.. ㅎ

훈련 세트를 n번 떼어내어 평가하고, 각 검증 점수를 평균해서 최종 점수를 얻는다.

cross_validate()를 사용하면 거대한 출력값이 나온다........

훈련 시간, 검증 시간, score 인데, 폴드 수만큼 나온다.

여기서 최종 점수는 test_score키의 점수를 평균하면 된다.

점수를 평균하면 이렇다규한다. 음.

여기서 cross_validate()는 훈련세트를 섞지 않기 때문에 섞으려면 분할기를 사용하라는데..

기본적으로 회귀 - KFold  /  분류 - StratifiedKFold 를 쓴단다.

폴드 수를 바꾸려면 분할기에서 n-splits 파라미터로 설정해주어야 한다.

 

이어서 하이퍼파라미터 설정을 도와주는 그리드 서치!

GridSearchCV를 사용하면 하이퍼파라미터 탐색과 교차 검증이 한 번에 수행된다고 한다. (우와대박..)

사용법은 { '탐색할 매개변수' : [탐색할 값] } 이렇게 딕셔너리로 설정하고,

GridSearchCV에 전달! 

객체에 설정하고 fit()으로 서치하면 된당.

그리고 서치가 끝나면 검증 점수가 가장 높은 모델으로 다시 모델이 훈련되어

객체의 best_estimator_에 저장이 되어있단다..

왜이리 고능함?! 레전드 똑똑한 친구다.

✅best_estimator_ : 검증 점수가 가장 높은 모델
✅best_params_ : 최적의 매개변수
✅cv_results_['mean_test_score'] : 교차 검증의 평균 점수
✅argmax() : 가장 큰 값의 인덱스 추출

 

매개변수

✅min_samples_split : 노드를 분할하기 위한 최소 샘플 수
✅min_impurity_decrease : 노드를 분할하기 위한 불순도 감소 최소량
✅min_samples_leaf : 리프 노드가 되기 위한 최소 샘플의 개수

 

매개변수의 값이 수치일 때 값의 범위나 간격 설정, 또는 매개변수가 너무 많을 때에는

랜덤 서치를 사용할 수 있다.

정수 -> randint

실수 -> uniform

를 사용해서 랜덤으로 수를 넘겨주고 찾으라고 시키는 방식이라고 한다.

 

이제 하이퍼파라미터 조정도 시켜서 해야겟다. 아주 유용하겠어 (후후)