안녕하세요!
Tenma입니다.

Ch.5 트리 알고리즘
(1) 결정 트리
(2) 교차 검증과 그리드 서치
(3) 트리의 앙상블
트리 알고리즘 , 하이퍼 파라미터 튜닝, 여러 트리를 합친 앙상블 모델을 배울 예정입니다.
이번 장에서는
(1) 결정 트리를 다루며
결정 트리 알고리즘을 사용해 새로운 분류 문제를 다루어 봅니다.
결정트리가 머신러닝 문제를 어떻게 해결하는지 이해합니다.
들어가며
이번에는 알코올 도수, 당도, PH 값으로 와인의 종류(레드와인 vs 화이트 와인)를 구별하려고 합니다!

로지스틱 회귀로 와인 분류하기
# 데이터 셋 불러오기
[출력]
alcohol sugar pH class
0 9.4 1.9 3.51 0.0
1 9.8 2.6 3.20 0.0
2 9.8 2.3 3.26 0.0
3 9.8 1.9 3.16 0.0
4 9.4 1.9 3.51 0.0
=> 도수, 당도 , PH , 0: 레드와인 / 1:화이트와인
# 유용한 메서드
[출력]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6497 entries, 0 to 6496
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 alcohol 6497 non-null float64
1 sugar 6497 non-null float64
2 pH 6497 non-null float64
3 class 6497 non-null float64
dtypes: float64(4)
memory usage: 203.2 KB
=> 6497개의 샘플 , 4개의 열은 모두 실수 값, non-null count가 6497이므로 누락된 값이 없습니다.
*누락된 값이 있다면?
: 데이터를 버리거나 평균값으로 채운 후 사용할 수 있다. 또한 훈련 세트의 통계값으로 테스트 세트를 변환해야한다!
[출력]
alcohol sugar pH class
count 6497.000000 6497.000000 6497.000000 6497.000000
mean 10.491801 5.443235 3.218501 0.753886
std 1.192712 4.757804 0.160787 0.430779
min 8.000000 0.600000 2.720000 0.000000
25% 9.500000 1.800000 3.110000 1.000000
50% 10.300000 3.000000 3.210000 1.000000
75% 11.300000 8.100000 3.320000 1.000000
max 14.900000 65.800000 4.010000 1.000000
=> 평균 , 분산 , 최소 , 4등분한 값을 알려준다.
각 특성의 스케일을 맞추겠습니다.
# 특성의 스케일 조정 & 훈련 세트와 테스트 세트 분리
[출력]
(5197, 3) (1300, 3)
=> 여기서는 test_size=0.2로 설정해 테스트 세트를 20% 정도로 설정했지만
train_test_ split() 함수는 25%정도를 기본으로 테스트 세트로 지정합니다.
=> 5197개의 훈련 세트와 1300개의 테스트 세트가 나누어 졌음을 알 수 있습니다.
이제 StandardScaler 클래스를 사용해 훈련 세트를 전처리 해보겠습니다.
# 훈련 세트 전처리 & 모델 평가
[출력]
0.7808350971714451
0.7776923076923077
=> 다소 낮은 점수가 나왔네요
해결방안
1. 규제 매개변수 C의 값 변경
2. solver 매개변수에서 다른 알고리즘을 선택
3. 다항 특성을 만들어 추가
설명하기 쉬운 모델과 어려운 모델
# 계수와 절편
[출력]
[[ 0.51270274 1.6733911 -0.68767781]] [1.81777902]
사실 이런 계수들을 모델이 어떻게 학습했는지 정확히 이해하기 어렵습니다.
그래서 다른 방법을 이용해 쉽게 이해하곤 하는데요
그 방법에 대해 알아봅시다.
결정 트리
# 결정 트리

: 결정 트리(Decision Tree)모델은 스무고개 처럼 위 그림과 같은 질문들로 가지가 뻗어나가는 방식을 의미합니다.
# 결정 트리 모델
사이킷런의 DecisionTreeClassifier 클래스를 사용해 결정 트리 모델을 훈련시켜 보겠습니다.
이전고 동일하게 fit() 메서드로 훈련하고 score() 메서드로 정확도를 평가해보겠습니다.
[출력]
0.996921300750433
0.8592307692307692
=> 점수가 향상 되었지만 과대적합이 존재합니다.
plot_tree() 함수로 결정트리를 그림으로 출력해 보겠습니다!

=> 맨 위의 노트를 루트 노드(root node) 맨 아래 끝에 달린 노드를 리프 노드(leaf node)라고 합니다.
너무 복잡하네요...
max_depth 매개변수를 수정해
트리의 깊이를 제한해서 출력해보겠습니다.

=> feature_names 매개변수에 특성의 이름을 전달해 표시했습니다.
=> 루트 노드를 봤을때 당도가 -0.239 보다 작으면 왼쪽 크면 오른쪽으로 갑니다.
=> 루트 노드의 총 샘플 수는 5,179개 중 value = 1,258개 : 음성클래스(레드 와인) / 3,939개 : 양성클래스(화이트 와인) 로 나누어 졌음을 알 수 있습니다.
=> 또한 plot_tree() 함수에서 filled=True로 지정하면 클래스마다 색깔을 부여하고 어떤 클래스의 비율이 높아지면 점점 진한색으로 표시합니다.
여기서 트리의 성장이 멈추면 두 노드 (왼쪽,오른쪽노드) 모두 양성 클래스로 분류 됩니다.
그 이유는 양성 클래스의 개수가 더 많기 때문이죠.
그런데 노드안에 gini라는 것이 있네요
gini에 대해 알아봅시다.
불순도
# gini
: gini는 지니 불순도(Gini impurity)를 의미합니다.
DecisionTreeClassifier 클래스의 criterion 매개변수의 기본값이 'gini'입니다.
criterion 매개변수는 노드에서 데이터를 분할할 기준을 정합니다.
지니 불순도는 다음과 같이 구합니다.

양성 클래스와 음성 클래스 비율이 1:1 인 경우 최악의 불순도 0.5가 나오고
한 클래스의 비율이 압도적으로 높은 경우 불순도는 0이 나오고 이를 순수 노드라고 부릅니다.
결정 트리 모델은 부모 노드(parent node)와 자식 노드(child node)의 불순도 차이가 크도록 트리를 성장 시킵니다.
불순도 차이는 다음과 같이 구합니다.

이런 부모와 자식 노드 사이의 불순도 차이를 정보 이득(information gain) 이라고 합니다.
가지치기
결정 트리에서는 트리가 무한히 성장하지 않도록 가지치기가 필요합니다.
가장 간단한 방법은 트리의 최대 깊이를 지정하는 것입니다.
# 트리의 깊이 설정
[출력]
0.8454877814123533
0.8415384615384616
=> max_depth 매개변수를 3으로 설정해 트리의 깊이를 조정했습니다.

=> 깊이 1 : 농도(sugar)를 기준 / 깊이 2 : 농도(sugar) / 도수(alcohol) / pH 를 이용해 트리를 나눈다.
앞서 불순도를 기준으로 샘플을 나눈다고 했습니다.
불순도는 클래스별 비율을 가지고 계산을 하고요
그렇다면 특성의 스케일이 계산에 영향을 미칠까요?
아닙니다!
특성값의 스케일은 결정 트리 알고리즘에 아무런 영향을 미치지 않습니다!
이것이 결정 트리 알고리즘의 또 다른 장점 중 하나 입니다.
# 결정 트리 모델 훈련
[출력]
0.8454877814123533
0.8415384615384616
=> 샘플을 표준화 한 결과와 똑같습니다.

=> 특성의 스케일을 조정하지 않아 수치가 보기에 편한 값들로 트리가 분류 되었습니다.
결정 트리에서 가장 유용한 특성 중요도에 대해 알아보겠습니다.
특성 중요도는 불순도를 감소하는데 기여한 정도를 나타내는 값입니다.
fearure_importances_ 를 이용하겠습니다.
[출력]
[0.12345626 0.86862934 0.0079144 ]
=> 순서대로 도수, 당도, pH 이고 당도(sugar)가 가장 유용한 특성으로 쓰였음을 알 수있습니다.
지금까지 결정 트리 모델을 이용해 레드 와인과 화이트 와인을 분류해 보았는데요
로지스틱 회귀 모델보다 성능이 더 좋았습니다.
그리고 트리가 깊지 않을때 비교적 설명하기 쉽습니다.
또한 불순도의 개념과 정보 이득에 대해 알아보았습니다.
감사합니다!
'AI > Machine Learning' 카테고리의 다른 글
| [ML] Ch.4 (2) 확률적 경사 하강법 (0) | 2024.07.31 |
|---|---|
| [ML] Ch.4 (1) 로지스틱 회귀 (0) | 2024.07.26 |
| [ML] Ch.3 (3) 특성 공학과 규제 (0) | 2024.07.25 |
| [ML] Ch.3 (2) 선형 회귀 (2) | 2024.07.24 |
| [ML] Ch.3 (1) k-최근접 이웃 회귀 (0) | 2024.07.17 |