null값 확인 : 데이터.info( )
cf) 누락된 값은 데이터를 버리거나 평균값을 사용하되 훈련세트의 평균값을 테스트세트에 채워야 함.
평균, 최대, 최솟값 확인 : 데이터.describe( )
→ 0.512 알코올도수 +1.673 당도 -0.687 pH +1.817 > 0 : 화이트와인
→ 0.512 알코올도수 +1.673 당도 -0.687 pH +1.817 < 0 : 레드와인
즉, 알코올도수와 당도가 높으면 화이트와인일 확률이 높지만 사람들에게 이해시키기가 어려움!
▶ 결정트리
: 이유를 설명하기 쉬우며 데이터를 잘 나눌 수 있는 질문을 추가해서 분류 정확도를 높일 수 있는 알고리즘
▼ 로지스틱 회귀 모형대신 결정트리를 적합했더니 과대적합 결과가 나옴.
결정트리에 대해 더 알아보자!
출처 : https://skirttt.com/wp-content/uploads/2023/07/image.png
max_depth = 1로 설정하여 루트 노드를 제외하고 하나의 노드를 더 확장하여 그림.
feature_names로 특성들의 이름을 전달함.
하나의 노드 칸은
테스트 조건(sugar)
불순도(gini)
총 샘플 수(samples)
클래스별 샘플 수(value)
로 이루어져 있음.
오른쪽 노드는 2194개의 양성클래스의 샘플이 왼쪽노드보다 더 몰려있어서 진한 색깔이 나타남.
왼쪽 노드와 오른쪽 노드 모두 양성 클래스가 많으므로 양성클래스로 예측됨.
✔️ 불순도
: 결정트리가 최적의 질문을 찾기 위한 기준 또는 노드에서 데이터를 분할할 기준을 정하는 것
① 지니불순도 (criterion = 'gini')
: 1 - (음성클래스비율 + 양성클래스비율)
지니불순도 = 0.5인 경우 : 두 클래스의 비율이 1/2씩 이므로 최악
지니불순도 = 0인 경우 : 하나의 클래스만 있는 경우. 순수노드
결정트리모델은 정보이득(= 부모 노드와 자식 노드의 불순도 차이)이 최대가 되도록 데이터를 나눠서 트리를 성장시킴.
정보 이득 : 부모의 불순도 - (왼쪽 노드 샘플 수 / 부모의 샘플수) 왼쪽 노드 불순도 - (오른쪽 노드 샘플 수 / 부모의 샘플수) 오른쪽 노드 불순도
② 엔트로피 불순도 (criterion = 'entropy')
음성클래스 비율 (음성클래스 비율) - 양성클래스 비율 (양성클래스 비율)
✔️ 가지치기
: 결정트리의 과대적합 제한
트리의 최대깊이지정 : max_depth
루트노드 : 깊이가 0인 노드
→ 알코올 도수 <= 0.454, -0.802 < 당도 < -0.239 : 레드 와인
이때, 음수의 당도를 설명할 방법이 없으며, 클래스별 비율을 가지고 계산하는 불순도로 샘플을 나누는데 특성값의 스케일이 이 계산에 영향을 미치지 않으므로 표준화 전 데이터를 이용해보자!
→ 훈련 세트와 테스트 세트의 결과가 정확히 같음!
→ 알코올 도수 <= 11.025, 1.625 < 당도 < 4.325 : 레드 와인
→ 특성 중요도를 통해 당도가 가장 유용한 특성 중 하나임을 알 수 있다.
문제 : 테스트세트를 사용해 자꾸 성능을 확인하다보면 일반화 성능을 올바르게 예측할 수 없다!
✔️ 검증세트
총 데이터 중에 60% : 훈련, 20% : 검증, 20% : 테스트 세트로 나눔.
[과정]
훈련세트에서 모델 훈련 후 검증세트로 모델 평가
테스트하고 싶은 매개변수를 바꿔가며 가장 좋은 모델 선택
그 매개변수로 훈련세트 + 검증세트로 모델 다시 훈련
테스트세트로 최종 점수 평가
그런데 이 경우 과대적합되어있으므로 매개변수를 바꿔서 더 좋은 모델을 찾아야 함!
✔️ 교차 검증 (k-fold cross validation)
: 검증 세트를 떼어 내어 평가하는 과정을 여러번 반복한 후 점수들을 평균하여 최종 검증 점수를 얻음.
ex) 4-폴드 교차 검증
→ fit_time, score_time은 모델을 훈련하는 시간, 검증하는 시간
cross_validate( )함수는 기본적으로 5-폴드 교차 검증이므로 각 키마다 5개의 값이 담겨져 있음.
교차 검증의 최종 점수는 test_score의 5개 값의 평균값
🚨주의점🚨
: 교차검증시 훈련세트를 섞으려면 분할기splitter를 지정해야 함.
회귀모델일 경우 : KFold 분할기 사용
분류모델일 경우 : StratifiedKFold 분할기 사용
✔️ 하이퍼 파라미터 튜닝
: 여러 매개변수의 값을 바꿔가며 최적의 값 찾기!
GridSearchCV : 하이퍼파라미터 탐색과 교차 검증을 한 번에 수행
ex) min_impurity_decrease 매개변수의 최적값 찾기
0.0001부터 0.0005까지 5개의 값을 5-폴드 교차 검증을 수행한 결과 0.0001이 가장 좋은 값으로 선택됨.
25개의 모델 중에서 검증 점수가 가장 높은 모델의 매개변수 조합으로 전체 훈련 세트에서 자동으로 다시 모델을 훈련하여 가장 좋은 값 선택.
5번의 교차 검증의 평균 점수를 mean_test_score로 얻음.
그 후 argmax()를 통해 최상의 검증 점수를 만든 매개변수를 출력할 수 있음.
(최소값, 최대값, 간격) 을 통해 매개변수 값을 지정하는 range, np.arange를 통해서도 매개변수의 조합을 확인할 수 있다.
💡값의 범위나 간격을 미리 정하기 어려운 경우, 랜덤서치 이용!
정수를 뽑아내는 확률분포 randint를 사용하거나
실수를 뽑아내는 확률분포 uniform을 사용
최종 모델로 결정된 테스트 세트의 성능..생각보다 잘 나오진 않았지만 다양한 매개변수 값을 테스트하여 얻은 결과!
ⓐ 정형데이터 : 데이터베이스나 엑셀에 저장하기 좋게 어떤 구조로 되어있는 데이터
→ 더 좋은 결과를 얻기위해 여러개의 모델을 훈련하는 머신러닝 알고리즘인 앙상블학습이 가장 뛰어난 성과를 냄.
ⓑ 비정형데이터 : 텍스트, 사진, 음악 등 데이터베이스나 엑셀로 표현하기 어려운 데이터
cf) NoSQL은 텍스트나 JSON 데이터 저장 가능
→ 규칙성을 찾기 어려워서 신경망 알고리즘 이용
① 랜덤 포레스트
: 훈련데이터에서 랜덤하게 샘플을 복원추출(부트스트랩샘플) 후 결정트리 훈련
각 결정트리의 특성중요도를 취합하여 나온 특성중요도를 살펴보면
결정트리에서의 특성중요도와는 달리 당도의 중요도가 감소하고 알코올 도수와 pH의 중요도가 올랐음. 하나의 특성에 과도하게 집중하지 않고 좀 더 많은 특성이 훈련에 반영되어 과대적합을 줄일 수 있음.
또한, 부트스트랩 샘플에 포함되지 않고 남는 샘플(OOB 샘플)을 사용하여 부트스트랩 샘플로 훈련한 결정 트리를 평가할 수 있고, 이 결과 교차 검증에서의 결과와 비슷하게 나옴.
② 엑스트라 트리
: 결정 트리를 사용하되 부트스트랩샘플을 사용하지는 않고일부 특성을 랜덤하게 선택하여 노드를 분할하여 과대적합을 감소시키는 앙상블 모델
이 모델은 각 결정 트리를 만들때 전체 훈련세트를 사용함.
무작위성이 더 커서 랜덤 포레스트보다 더 많은 결정 트리를 훈련해야하지만 랜덤하게 노드를 분할하여 빠른 계산 속도를 낼 수 있다.
③ 그레디언트 부스팅
: 깊이가 얕은 결정 트리를 연속적으로 추가하여 손실 함수를 최소화하는 앙상블 모델.
과대적합이 일어나지 않았으므로 학습률 매개변수로 속도를 조절하고 결정 트리의 개수를 늘려보자!
과대적합은 일어나지 않았지만, 당도에 대한 특성 중요도가 높게 나타났다.
순서대로 트리를 추가하므로 훈련 속도가 느리다는 단점이 있다.
④ 히스토그램 기반 그레디언트 부스팅
: 그레디언트 부스팅의 속도를 개선하여 안정적인 결과와 높은 성능을 내는 앙상블 모델.
입력 특성을 256개의 구간으로 나누어 노드를 분할할 때 최적의 분할을 매우 빠르게 찾을 수 있다.
이 모델에서도 당도에 특성중요도가 높은 것을 알 수 있고,
테스트 세트에서 87%의 정확도를 보이지만 단일 결정 트리보다 좋은 결과가 나왔다.
▼ XGBoost 라이브러리를 통한 히스토그램 기반 그레디언트 부스팅
▼ LightBGM 라이브러리를 통한 히스토그램 기반 그레디언트 부스팅