본문 바로가기
Data Science/Machine Learning

[Machine Learning] Decision Tree(의사결정트리)

by AI_Wooah 2022. 8. 10.

 

분류 문제의 사용

분류문제는 고객의 특성에 맞게 쿠폰 선호 여부를 알기 위해 필요하다.

나무 그림을 적용하면 의사를 묻지 않아도 결과를 추측할 수 있다.

의사결정 트리를 만들기 위해서는 엔트로피와 지니계수, 카이제곱스퀘어를 알아야 한다.

 

엔트로피의 이해

A~F 속성은 고객의 속성을 뜻한다.

G 쿠폰반응여부가 머신러닝에서 맞춰야 할 타겟값이다. 이것은 나무그림에서 잎사귀에 해당된다.

타겟값이 있기 때문에 이 문제는 감독학습이며 분류문제에 해당한다.

여기서 직장여부를 Root Node로 잡는다. 엔트로피가 큰 폭으로 줄어드는 방향으로 데이터를 나누어야 한다.

엔트로피란?

무질서한 정도를 나타내는 물리학적 양이다. 자연의 모든 변화는 entropy가 증대되는 방향으로 일어난다. 

  • 확률 p란 전체 데이터에서 특정 데이터가 차지하는 비율을 말한다.
  • Σ: 정보의 기댓값(평균값)
  • $log_2$: 정보를 표현하기 위해서 필요한 비트 수를 확인 가능하도록 한다.
  • H(정보 엔트로피): 정보의 기댓값
  • i: 물건의 종류
  • n: 물건의 총 종류수
  • $p(x_i)$ : 전체 데이터에서 해당 종류의 데이터를 뽑을 확률

필요한 정보의 공간이 클수록 엔트로피가 크다고 말할 수 있다.

필요한 모든  bit 수를 평균한 값을 엔트로피라고 한다.

-가 붙은 이유는 지수를 양수로 만들기 위함이다.

 

* 정보이득

정보이득은 이전 엔트로피에서 현재 엔트로피를 뺀 값이다 많을수록 좋다.

 

- 고객분류에서 정보이득 순서

결혼여부 -> 성별 -> 직장여부 -> 차량여부 -> 나이

 

의사결정트리

 

데이터 분기 후에 남은 데이터들의 분포가 바뀌기 때문에 다시 엔트로피를 계산해야 한다.

=> 정보이득이 가장 높은 속성 값 찾아야 한다.

 

클래스 범주형 데이터에 회귀분석을 결합시켜 연속값 예측이 가능하다.

의사결정트리의 가장 기본적인 역할은 범주형 데이터를 예측하는 것이다.

 

다양한 의사결정알고리즘

  • CART
  • C4.5
  • C5.0

 

의사결정 알고리즘의 공통점

  • 엔트로피 이용
  • 지니계수 이용
  • 데이터를 나누는 방법에 이용
  • 가장 영향력이 큰 속성을 이용

 

데이터의 불순도 평가 기준

  • 엔트로피
    데이터의 불순도가 희석되는 방향으로 데이터를 나눈다.
  • 지니계수

  • 카이제곱 스퀘어
    상관관계가 어느정도 0에 가깝게 나뉘어 졌는지 확인하여 상관관계가 가장 적도록 나누는 방법이다.

 

 

 

의사결정트리 실습

 

데이터를 읽어온다

 

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import random
# 엔트로피를 이용해서 의사결정 트리를 만드는 방법이 들어있는 라이브러리
from sklearn import datasets, tree
# 모델을 평가하기 위한 매트릭스
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.metrics import precision_score, recall_score, f1_score

# 데이터를 읽어오기
digits = datasets.load_digits()

# 이미지를 표시함. 
for label, img in zip(digits.target[:10], digits.images[:10]):
    plt.subplot(2, 5, label + 1)
    plt.imshow(img, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.title('Digit: {0}'.format(label))
plt.show()

# 맞춰야 할 목표변수와 이미지의 값, 이미지의 구조를 확인한다.
label , img , img.shape

 

모델 만들어서 예측한다. -> 테스트해서 정확도를 평가한다.

images = digits.images
labels = digits.target

# 함수에 넣기 위해 차원을 하나 줄인다. 
# 64 size의 벡터로 만들어서 입력값으로 사용한다.
images = images.reshape(images.shape[0], -1)

# 모델을 만드는 과정
# 결정트리를 생성한다. 
n_samples = len(images)
# 훈련시킬 데이터의 수를 정해주고 2/3을 제외한 나머지는 테스트 데이터로 사용한다.
train_size = int(n_samples * 2 / 3)
# depth는 Root Node에서 Leaf Node까지의 거리를 의미한다
classifier = tree.DecisionTreeClassifier(max_depth=3)
# 훈련을 시킬때는 fit이라는 함수를 사용해서 모델을 훈련시킨다.
classifier.fit(images[:train_size], labels[:train_size])

# 만든 모델에 대한 예측
# 실제 값은 -> expected에 저장한다.
# 예측 결과 값은 -> predicted에 저장한다.
# 결정트리의 성능을 확인한다. 
expected = labels[train_size:]
# images[train_size:] 부터 끝까지 테스트 데이터로 사용
predicted = classifier.predict(images[train_size:])

# Accuracy가 약 45%가 나왔다. Accuracy는 정확도다.
# 매트릭스 중에서 가장 간단하게 볼 수 있는 방법이지만 가장 정확한 방법은 아니다.
# Accuracy 함수를 통해서 실제 값과 예측 값을 비교한다.
print('Accuracy:\n',
      accuracy_score(expected, predicted))
# 혼돈행렬
# x축은 예측값이고 y축은 실제값을 넣었다.
# 대각선에 숫자가 많이 모여있을수록 좋은 모델로 볼 수 있다.
print('Confusion matrix:\n',
      confusion_matrix(expected, predicted))

 

 

반응형

댓글