본문 바로가기

책/Hands-On Machine Learning

6. 결정 트리

결정트리 decision tree 는 분류와 회귀 작업 그리고 다중출력 작업도 가능한 머신러닝 알고리즘이다.

6.1 결정 트리 학습과 시각화

붓꽃 데이터셋에 DecisionTreeClassifier 를 훈련시키는 코드

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

iris = load_iris()
X = iris.data[:, 2:]
y = iris.target

tree_clf = DecisionTreeClassifier(max_depth=2)
tree_clf.fit(X,y)

export_graphviz() 함수를 사용해 결정 트리를 시각화할 수 있다.

6.2 예측하기

트리가 어떻게 예측을 만들어내는지 본다. 새로 발견한 붓꽃의 품종을 분류하려 한다고 가정, 먼저 루트 노드에서 시작한다. 이 노드는 꽃잎의 길이가 2.45cm보다 짧은지 검사한다. 만약 그렇다면 루트 노드에서 왼쪽 자식 노드로 이동, 이후 추가적인 검사를 하지 않는다.

2.45cm보다 길다면, 오른쪽 노드로 이동, 추가로 꽃잎의 너비가 1.75cm보다 작은지 검사하여 분류한다.

노드의 sample 속성은 얼마나 많은 훈련 샘플이 적용되었는지 헤아린 것,

value 속성은 노드에서 각 클래스에 알마나 많은 훈련 샘플이 있는지 알려준다.

마지막으로 노드의 gini 속성은 불순도 impurity를 측정한다. 한 노드의 모든 샘플이 같은 클래스에 속해 있다면 이 노드를 순수 하다고 한다.

이 식에서 P_i,k 는 i 번째 노드에 있는 훈련 샘플 중 클래스 k에 속한 샘플의 비율이다.

 

위 그림은 결정 트리의 결정 경계를 보여준다.

6.3 클래스 확률 추정

결정 트리는 한 샘플이 특정 클래스 k에 속할 확률을 추정할 수 있다. 먼저 이 샘플에 대해 리프 노드를 찾기 위해 트리를 탐색하고 그 노드에 있는 클래스 k의 훈련 샘플의 비율을 반환한다.

tree_clf.predict_proba([[5, 1.5]])
>>>
array([[0.        , 0.90740741, 0.09259259]])

tree_clf.predict([[5, 1.5]])
>>>
array([1])

6.4 CART 훈련 알고리즘

결정 트리를 훈련시키기 위해 CART, Classification and regression tree 알고리즘을 사용한다. 먼저 훈련 세트를 하나의 특성 k의 임곗값 t를 사용해 두 개의 서브셋으로 나눈다다. 나누는 작업을 계속 반복하여 훈련

 

 

6.5 계산 복잡도

리프 노드까지 탐색하여 예측을 해야한다. 일반적으로 결정 트리는 거의 균형을 이루고 있으므로 결정 트리를 탐색하기 위해서는 약 O(log_2(m)) 개의 노드를 거쳐야 한다. 각 노드는 하나의 특성값만 확인하기 때문에 예측에 필요한 전체 복잡는 특성 수와 무관, 그래서 큰 훈련 세트를 다룰 때 예측 속도가 매우 빠르다.

훈련 알고리즘은 각 노드에서 모든 훈련 샘플의 모든 특성을 비교한다.

6.6 지니 불순도, 엔트로피

criterion 매개변수를 를 entropy로 지정하여 엔트로피 불순도를 사용할 수 있다. 분자의 무질서함을 측정하는 것으로 원래 열역학의 개념, 안정될 경우 0에 가깝다.

머신러닝에서는 불순도의 측정 방법으로 자주 사용된다. 어떤 세트가 한 클래스의 샘플만 담고 있다면 엔트로피가 0이다. 지니 불순도가 조금 더 계산 속도가 빨라 기본값으로 좋다. 지니 불순도의 경우 빈도 높은 클래스를 한쪽 가지로 고립시키는 경향이 있는 반면 엔트로피는 조금 더 균형 잡힌 트리를 만든다.

 

엔트로피

6.7 규제 매개변수

결정 트리는 훈련 데이터에 대한 제약 사항이 거의 없다. 제한을 두지 않으면 과대적합되기 쉽다. 결정 트리는 모델 파라미터 수가 훈련 전에 결정되지 않기 때문에 이런 모델을 비파라미터모델 nonparametric model이라 부른다. 그래서 모델 구조가 데이터에 맞춰져서 고정되지 않고 자유롭다

훈련 데이터에 대한 과대적합을 피하기 위해 학습할 때 결정 트리의 자유도를 제한할 필요가 있다. 규제는 보통 결정 트리의 최대 깊이를 제어 max_depth를 줄이면 모델을 규제하고 과대적합의 위험이 감소

  • min_samples_split : 분할되기 위해 노드가 가져야 하는 최소 샘플 수
  • min_samples_leaf : 리프 노드가 가지고 있어야 할 최소 샘플 수
  • min_weight_fraction_leaf : 가중치가 부여된 전체 샘플 수에서의 비율
  • max_leaf_nodes : 리프 노드의 최대 수
  • max_features : 각 노드에서 분할에 사용할 특성의 최대 수

min의 매개변수를 증가시키거나 max 매개변수를 감소시키면 규제가 커진다.

6.8 회귀

from sklearn.tree import DecisionTreeRegressor

tree_reg = DecisionTreeRegressor(max_depth=2)
tree_reg.fit(X,y)

앞서 만든 분류 트리와 매우 비슷, 주요한 차이는 각 노드에서 클래스를 예측하는 대신 어떤 값을 예측한다는 점,

각 노드에서 클래스를 예측하는 대신 어떤 값을 예측한다. 각 영역의 예측값은 항상 그 영역에 있는 타깃값의 평균이 된다. 알고리즘은 예측값과 가능한 한 많은 샘플이 가까이 있도록 영역을 분할한다.

max_depth=3 으로 설정하면 오른쪽 그래프와 같은 예측을 얻게 된다. 각 영역의 예측값은 항상 그 영역에 있는 타깃값의 평균이 된다. 알고리즘은 예측값과 가능한 한 많은 샘플이 가까이 있도록 영역을 분할한다.

 

CART 알고리즘은 훈련 세트를 불순도를 최소화하는 방향으로 분할하는 대신 평균제곱오차(MSE)를 최소화하도록 분할한다. 

6.9 불안정성

결정 트리는 이해하고 해석하기 쉬우며, 사용하기 편리하고, 여러 용도로 사용될 수 있으며, 성능도 뛰어나다.

하지만 계단 모양의 결정 경계를 만들기에 훈련 세트의 회전에 민감하다. 이런 문제를 해결하는 방법은 훈련 데이터를 더 좋은 방향으로 회전시키는 PCA 기법을 사용하는 것이다.

결정 트리의 주된 문제는 훈련 데이터에 있는 작은 변화에도 매우 민감하다는 것이다. 이런 불안정성을 랜덤 포레스트로 해결할 수 있다.

' > Hands-On Machine Learning' 카테고리의 다른 글

8. 차원 축소  (0) 2022.10.07
7. 앙상블 학습과 랜덤 포레스트  (1) 2022.10.07
5.서포트 벡터 머신(SVM)  (0) 2022.10.07
4. 모델 훈련  (0) 2022.10.07
3. 분류  (1) 2022.10.07