09. 결정 트리

yellowsubmarine372·2023년 8월 24일
0

머신러닝

목록 보기
9/18
post-thumbnail

colab link
Decision Tree

1. 로지스틱 회귀로 분류하기

import pandas as pd
wine = pd.read_csv('https://bit.ly/wine_csv_data')
  • head 메소드
<bound method NDFrame.head of       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
...       ...    ...   ...    ...
6492     11.2    1.6  3.27    1.0
6493      9.6    8.0  3.15    1.0
6494      9.4    1.2  2.99    1.0
6495     12.8    1.1  3.34    1.0
6496     11.8    0.8  3.26    1.0

[6497 rows x 4 columns]>
  • info 메소드
    데이터 프레임의 각 열의 데이터 타입, 크기, 누락 데이터(Non-Null Count 개수와 data 개수 비교) 있는지 확인
<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
  • describe 메소드
    간략한 통계를 출력하고 최소, 최대, 평균값을 확인할 수 있다.

각 특성 값의 스케일이 다르다는 것을 확인 가능. 훈련 세트와 테스트 세트로 나누고 StandardScaler 클래스를 이용해 표준화

  • 전처리 단계
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(data, target, test_size=0.2, random_state=42)

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_scaled, train_target)
print(lr.score(train_scaled, train_target))
print(lr.score(test_scaled, test_target))

각 특성의 중요도에 따라 음성/ 양성 클래스로 구분되는 것으로 확인 가능하다. 하지만 다항 특성을 적용한다면 설명하기에 어려운 한계점이 생기며 지나치게 수치적인 결과가 나와 전체적으로 파악하기 어렵다.

2. 결정 트리
결정 트리 모델은 스무고개와 같다.

결정 트리 학습법(decision tree learning)은 어떤 항목에 대한 관측값과 목표값을 연결시켜주는 예측 모델로서 결정 트리를 사용한다. 
이는 통계학과 데이터 마이닝, 기계 학습에서 사용하는 예측 모델링 방법 중 하나이다. 
트리 모델 중 목표 변수가 유한한 수의 값을 가지는 것을 분류 트리라 한다. 
이 트리 구조에서 잎(리프 노드)은 클래스 라벨을 나타내고 가지는 클래스 라벨과 관련있는 특징들의 논리곱을 나타낸다. 
결정 트리 중 목표 변수가 연속하는 값, 일반적으로 실수를 가지는 것은 회귀 트리라 한다.

[Wikipedia]

DecisionTreeClassifier 클래스를 이용해 결정 트리 모델을 훈련

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(random_state=42)
dt.fit(train_scaled, train_target)
print(dt.score(train_scaled, train_target))
print(dt.score(test_scaled, test_target))
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(10, 7))
plot_tree(dt)
plt.show()

↑ 리프노드의 예측값이다. (아래로 가수록 음성/양성 클래스로 구분가능하게 된다.)

  • 리프노드
    (1) 분류 : 마지막 리프의 다수의 클래스가 예측의 클래스를 의미한다
    (2) 회귀 : 마지막 리프의 타깃값의 평균이 x 샘플의 예측값

  • 깊이 제한
    max_depth 매개변수로 트리의 깊이를 제한 할 수 있다. feature_names매개변수에는 특성의 이름을 전달

plt.figure(figsize=(10, 7))
plot_tree(dt, max_depth=1, filled =True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()


↑ value값을 비교해 음성/양성 클래스를 결정한다. (81<2194 => 양성 클래스)

리프노드에서 가장 많은 클래스가 예측 클래스가 된다. 위의 두 샘플은 모두 양성 클래스로 예측된다. (두 노드 모두 양성 클래스의 개수감 많기 때문이다.)

  • 불순도

맨 끝의 리프노드가 순수노드가 되도록(한클래스에만 속하도록 끊임없이 분류)

지니 불순도
criterion 매개변수의 기본값이 gini

지니 불순도 = 1 - (음성클래스 비율^2 + 양성클래스 비율^2)

지니 불순도가 0.5일 때 최악(고루 분포되어 있다는 의미)
지니 불순도가 0이 될때 최상(하나의 클래스로 결정되었다는 의미)

정보 이득
부모와 자식노드 차이를 정보이득이라고 한다. 정보이득이 최대가 되도록(최대한 분류가 많이 되도록) 이 알고리즘은 데이터를 나눈다.

불순도 기준을 사용해 정보이득이 최대가 되도록 노드를 분할한다. 노드를 순수하게 나눌수록 정보 이득이 커진다.

너무 순수노드가 되도록 분할할 경우 훈련세트에만 최적화된 과대적합 결과가 나타남

  • entropy
    criterion = 'entropy'를 지정해 엔트로피 불순도를 사용할 수도 있다.

3. 가지치기
무작정 끝까지 자라나는 트리는 과대적합의 문제점을 가져 일반화의 어려움이 있다.
이를 해결하기 위한 방법은 트리의 최대 깊이를 지정하는 것 이다. (최대 깊이 한계 두기)

print(dt.score(train_scaled, train_target))
print(dt.score(test_scaled, test_target))

plt.figure(figsize=(20, 5))
plot_tree(dt, filled=True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()

트리 모델의 장점 중 하나는 전처리가 필요 없다는 것이다. 클래스 비율로 나눌 때 특정값의 스케일은 결정 트리 알고리즘에 아무런 영향을 미치지 않는다. (스케일 조정이 필요 없음)

특정 중요도
결정트리는 어떤 특성이 가장 유용한지 나타내는 특성 중요도를 계산해준다.
feature_importance속성에 저장되어 있다.

print(dt.feature_importances_)
profile
for well-being we need nectar and ambrosia

0개의 댓글