혼공단/혼공단 5기

혼자 공부하는 머신러닝 + 딥러닝 5장 - 결정 트리

하양훈 2021. 2. 18. 20:33
반응형

1. 결정트리

 

- 여러 단계의 복잡한  조건을 갖는 문제와 그 조건과 그에 따른 해결방법을 트리 형태로 나타낸 것. 모든 비종점 노드가 하나의 결정을 나타내는 이진트리. 

- 사이킷런의 DecisionTreeClassifier클래스를 사용한다.

 

from sklearn.tree import DecisionTreeClassifier

#random_state를 지정하는 이유는 같은 결과가 나오기 위해서이다. 평소에는 따로 지정하지 않아도 된다.
dt = DecisionTreeClassifier(random_state=42)
dt.fit(train_scaled, train_target)

print(dt.score(train_scaled, train_target))
>> 0.996921300750433
print(dt.score(test_scaled, test_target))
>> 0.8592307692307692

 

- 위에서 구한 모델을 아래와 같이 그림으로 표현이 가능하다.

 

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

plt.figure(figsize=(10,7))
plot_tree(dt)
plt.show()

 

<실행결과>

- 결정 트리는 위에서 부터 거꾸로 자라난다.

- 맨 위의 노드를 루트(root)노드라고 부르고, 맨 아래의 노드를 리프(leaf) 노드라고 부른다.

- 노드란 결정 트리를 구성하는 핵심 요소로, 훈련 데이터의 특성에 대한 테스트를 표현한다.

- 트리의 가지(branch)는 테스트의 결과(True,False)를 나타내며 일반적으로 하나의 노드는 2개의 가지를 가진다.

- 결정트리가 리프노드에서 가장 많은 클래스가 예측클래스를 두는 형태로 타깃값을 예측한다.

-특성값의 스케일이 결정트리 알고리즘에 아무런 영향을 미치지 않으므로, 표준화 전처리를 할 필요가 없다.

 

- 매개변수로 트리의 크기를 조정할 수 있다.

 

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

- max_depth : 루트 노드를 제외하고 얼마나 더 확장할지 결정(1로 설정할 경우 총 층수는 2층이 된다)

- filled: 클래스에 맞게 노드의 색을 칠할지 결정

- feature_names: 특성의 이름을 전달

 

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

plt.figure(figsize=(10,7))
plot_tree(dt)
plt.show()

 

2. 불순도

 

<지니 불순도>

 

- DecisionTreeClassifier 클래스의 criterion 매개변수의 기본값 이기도 하다.

- criterion 매개변수의 용도는 노드에서 데이터를 분할할 기준을 정하는 것이다.

- 두 클래스의 비율이 정확히 1/2이면, 지니 불순도는 0.5가 되어 최악이 된다.

- 노드에 하나의 클래스만 있으면 지니 불순도는 0이 된다.

 

<정보이득>

 

- 결정 트리 모델은 부모노드와 자식노드의 불순도 차이가 가능한 크도록 트리를 성장 시킨다.

- 부모노드와 자식노드의 불순도 차이를 정보 이득이라고 한다.

 

 

 

<엔트로피 불순도>

 

 

- 엔트로프 불순도는 밑이 2인 로그를 사용해서 곱한다.

- DecisionTreeClassifier클래스에서 사용하려면 criterion=entropy를 지정하면 된다.

 

 

<전체 소스 코드>

링크 : bit.ly/hg-05-1

반응형