Machine Learning in Action ch.3 Tree
의사결정 트리는 스무고개와 비슷하다고 한다.
20개의 질문에서 예/아니오로 답해 결론적으로 질문자가 생각하는 답을 추측하는 것이다.
의사결정 트리의 장점 중 가장 좋은 것은 분류 결과를 사람이 쉽게 이해할 수 있다는 것이다.
마지막으로 우리는 분류기를 만들기 위해 재귀를 사용할 것이며, 매스플롯라이브러리를 사용하여 데이터를 표현할 것이다.
20개의 질문에서 예/아니오로 답해 결론적으로 질문자가 생각하는 답을 추측하는 것이다.
의사결정 트리의 장점 중 가장 좋은 것은 분류 결과를 사람이 쉽게 이해할 수 있다는 것이다.
마지막으로 우리는 분류기를 만들기 위해 재귀를 사용할 것이며, 매스플롯라이브러리를 사용하여 데이터를 표현할 것이다.
3.1 트리 구조
2학기에 자료구조를 배운 나로서는 더 이상 보고 싶지 않은 트리 구조를 마주하게 됐다...
의사결정 트리를 만들기 위해서는 하나의 최초 의사결정을 만들어야한다. 최초 의사결정은 속성으로 결정된다.
일부 의사결정 트리는 데이터를 바이너리로 분할하지만 여기서는 그렇게 하지 않는다. 4 가지 값을 가지는 속성으로 반할하게 되면 , 데이터는 4가지 방법으로 분할된다.
3.1.1 정보 이득
데이터를 분할하기 전과 후의 변화를 정보 이득이라고 한다.
어떤 속성으로 데이터를 분할할 때 가장 높은 정보 이득을 취할 수 있는지를 모든 속성에 대해 확인하며서 분할할 수 있게 된다.
데이터 집합에 대한 정보 측정 방법을 새넌 엔트로피 또 엔트로피라고 한다.
l(xi) = log2p(xi)
p(xi)는 xi 라는 분류항목이 선택될 확률이다.
여기서 k 는 분류 항목의 개수이다.
파이썬에서 이것을 계산하는 방법을 알아보도록 하자.
from math import log
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts ={}
for featVec in dataSet:
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key]) / numEntries
shannonEnt -= prob * log(prob,2)
return shannonEnt
def createDataSet():
dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
labels = ['no surfacing','flippers']
return dataSet, labels
데이터셋을 만들고 엔트로피를 계산하는 함수를 만들었다.
실행시켜 보면
엔트로피가 더 높다는 것은 데이터가 그만큼 더 혼잡하다는 것이다.
여러 속성 중 정보 이득이 가장 큰 속성을 가지고 데이터 집합을 분할하도록 하자.
실질적으로 데이터 집합을 분할하고 정보 이득을 측정해 보지 않고는 정보 이득이 가장 큰 속성이 어떤 것인지 알 수 없다.
하나의 집합 내에서 어수선함을 측정하는 또 다른 일반적인 방법으로 지니 불순도가 있다. 이 방법은 집합에서 아이템을 선택할 확률과 아이템이 잘못 분류될 확률을 계산한다.
댓글
댓글 쓰기