Machine Learning in Action ch.3 Tree

의사결정 트리는 스무고개와 비슷하다고 한다.

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

데이터셋을 만들고 엔트로피를 계산하는 함수를 만들었다. 
실행시켜 보면 


엔트로피가 더 높다는 것은 데이터가 그만큼 더 혼잡하다는 것이다. 

여러 속성 중 정보 이득이 가장 큰 속성을 가지고 데이터 집합을 분할하도록 하자.
실질적으로 데이터 집합을 분할하고 정보 이득을 측정해 보지 않고는 정보 이득이 가장 큰 속성이 어떤 것인지 알 수 없다.

하나의 집합 내에서 어수선함을 측정하는 또 다른 일반적인 방법으로 지니 불순도가 있다. 이 방법은 집합에서 아이템을 선택할 확률과 아이템이 잘못 분류될 확률을 계산한다.

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리